第5章 存储Node程序中的数据

来源:互联网 发布:淘宝购物哪个返利网好 编辑:程序博客网 时间:2024/06/15 23:11

5.1 无服务器的数据存储

5.1.1 内存存储
内存存储用变量存放数据。服务器和程序重启后数据就丢了。

5.1.2 基于文件的存储
文件系统存在并发问题。

//收集参数值并解析文件数据库的路径var fs = require('fs');var path = require('path');//去掉“node cli_tasks.js”,只留下参数var args = process.argv.splice(2);//取出第一个参数(命令)var command = args.shift();//合并剩余的参数var taskDescription = args.join(' ');//根据当期的工作目录解析数据库的相对路径var file = path.join(process.cwd(),'/.tasks');switch(command){    case 'list':        listTasks(file);        break;    case 'add':        addTask(file,taskDescription);        break;    default:        console.log('Usage: ' + process.argv[0]            + ' list|add [taskDescription]');}//从文本文件中加载用JSON编码的数据function loadOrInitializeTaskArray(file,cb){    //检查.tasks文件是否已经存在    fs.exists(file,function(exists){        var tasks = [];        if(exists){            //从.tasks文件中读取代办事项数据            fs.readFile(file,'utf8',function(err,data){                if(err) throw err;                var data = data.toString();                var tasks = JSON.parse(data || '[]');                cb(tasks);            });        } else {            //如果.tasks文件不存在,则创建空的任务数组            cb([]);        }    });}//列车任务的函数function listTasks(file){    loadOrInitializeTaskArray(file,function(tasks){        for(var i in tasks){            console.log(tasks[i]);        }    });}//把任务保存到磁盘中function storeTasks(file,tasks){    fs.writeFile(file,JSON.stringify(tasks),'utf8',function(err){        if(err) throw err;        console.log('saved.');    });}//添加一项任务function addTask(file,taskDescription){    loadOrInitializeTaskArray(file,function(tasks){        tasks.push(taskDescription);        storeTasks(file,tasks);    });}

这里写图片描述
这里写图片描述
这里写图片描述

5.2 关系型数据库管理系统

5.2.1 MySQL

//程序设置及数据库连接初始化var http = require('http');var work = require('./lib/timetrack');var mysql = require('mysql');var db = mysql.createConnection({    host: '127.0.0.1',    user: 'root',    password: 'password',    database: 'timetrack'});//HTTP请求路由var server = http.createServer(function(req,res){    switch(req.method) {        case 'POST':            switch(req.url){                case '/':                    console.log('add');                    work.add(db,req,res);                    break;                case '/archive':                    console.log('archive');                    work.archive(db,req,res);                    break;                case '/delete':                    console.log('delete');                    work.delete(db,req,res);                    break;            }            break;        case 'GET':            switch(req.url){                case '/':                    console.log('get');                    work.show(db,res);                    break;                case '/archived':                    console.log('archived');                    work.showArchived(db,res);            }            break;    }});//创建数据库表db.query(    "CREATE TABLE IF NOT EXISTS work ("    + "id INT(10) NOT NULL AUTO_INCREMENT, "    + "hours DECIMAL(5,2) DEFAULT 0, "    + "date DATE, "    + "archived INT(1) DEFAULT 0, "    + "description LONGTEXT, "    + "PRIMARY KEY(id))",    function(err){        if(err) throw err;        console.log('Server started...');        //启动HTTP服务器        server.listen(3000,'127.0.0.1');    });
//辅助函数:发送HTML,创建表单,接收表单数据var qs = require('querystring');//发送HTML响应exports.sendHtml = function(res,html){    res.setHeader('Content_Type','text/html');    res.setHeader('Content_Length',Buffer.byteLength(html));    res.end(html);}//解析HTTP POST数据exports.parseReceivedData = function(req,cb){    var body = '';    req.setEncoding('utf8');    req.on('data',function(chunk){ body += chunk});    req.on('end',function(){        var data = qs.parse(body);        cb(data);    });}//渲染简单的表单exports.actionForm = function(id,path,label){    var html = '<form method="POST" action="' + path + '">' +        '<input type="hidden" name="id" value="' + id + '">' +        '<input type="submit" value="' + label + '"/>' +        '</form>' ;    return html;}//添加工作记录exports.add = function(db,req,res){    exports.parseReceivedData(req,function(work){        db.query(            "INSERT INTO work (hours,date,description) " +             " VALUES (?,?,?)",            [work.hours,work.date,work.description],            function(err){                if(err) throw err;                //给用户显示工作记录清单                exports.show(db,res);            }        );    });}//删除工作记录exports.delete = function(db,req,res){    exports.parseReceivedData(req,function(work){        db.query(            "DELETE FROM work WHERE id=?",            [work.id],            function(err){                if(err) throw err;                exports.show(db,res);            }        );    });}//归档一条工作记录exports.archive = function(db,req,res){    exports.parseReceivedData(req,function(work){        db.query(            "UPDATE work SET archived=1 WHERE id = ?",            [work.id],            function(err){                if(err) throw err;                exports.show(db,res);            }        );    });}//获取工作记录exports.show = function(db,res,showArchived){    var query = "SELECT * FROM work " +        "WHERE archived=? "+        "ORDER BY date DESC";    var archiveValue = (showArchived)?1:0;    db.query(        query,        [archiveValue],        function(err,rows){            if(err) throw err;            html = (showArchived)                 ? ''                : '<a href="/archived">Archived Work</a><br/>';            html += exports.workHitlistHtml(rows);            html += exports.workFormHtml();            exports.sendHtml(res,html);        }        );}exports.showArchived = function(db,res){    exports.show(db,res,true);}//将工作记录渲染为HTML表格exports.workHitlistHtml = function(rows){    var html = '<table>';    for(var i in rows){        html += '<tr>';        html += '<td>' + rows[i].date + '</td>';         html += '<td>' + rows[i].hours + '</td>';         html += '<td>' + rows[i].description + '</td>';         if (!rows[i].archived) {            html += '<td>' + exports.workArchiveForm(rows[i].id) + '</td>';        }        html += '<td>' + exports.workDeleteForm(rows[i].id) + '</td>';        html += '</tr>';    }    html += '</table>';    return html;}//用来添加、归档、删除工作记录的HTML表单exports.workFormHtml = function(){    var html = '<form method="POST" action="/">'+    '<p>Date(YYYY-MM-DD):<br/><input name="date" type="text"><p/>'+    '<p>Hours worked:<br/><input name="hours" type="text"><p/>'+    '<p>Description:<br/>'+    '<textarea name="description"></textarea></p>'+    '<input type="submit" value="Add" />'+    '</form>';    return html;}//渲染归档按钮表单exports.workArchiveForm = function(id){    return  exports.actionForm(id,'/archive','Archive');}//渲染删除按钮表单exports.workDeleteForm = function(id){    return exports.actionForm(id,'/delete','Delete');}

5.3 NoSQL数据库

5.3.1 Redis

原创粉丝点击