第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
阅读全文
0 0
- 第5章 存储Node程序中的数据
- 程序中的数据存储剖析
- 第14周项目5-棋盘游戏中的数据存储
- 第4章 构建Node Web程序
- 第 6 章 数据存储
- 第14周项目5-体会棋盘游戏中的数据存储
- 第14周项目 5-体会棋盘游戏中的数据存储
- 第14周项目5 体会棋盘游戏中的数据存储
- 第14周项目5-体会棋盘游戏中的数据存储
- 第14周项目5-体会棋盘游戏中的数据存储
- 第2章 变量和数据存储
- 第6章 数据存储全方案
- 【Android】第4章 数据存储(上)
- 第1章-安装Node.js及相关要点-1.8.调试Node.js程序
- 第14周项目5-体验棋盘游戏中的数据存储(2、扫雷游戏+改变数据)
- node.js中的DIRT程序
- [Android][第一行代码][第 6 章 数据存储]
- 第一行代码-7.2 访问其他程序中的数据
- 链表的基本操作
- NYOJ 585 取石子(六)(尼姆博弈)
- Linux备忘1
- socket
- 幂等实现思路和细节
- 第5章 存储Node程序中的数据
- 第10章 Diffuse Shading
- thinkPHP5-渲染模板的方式
- POJ
- JavaSE-3
- MyBatis动态 SQL
- http怎么做自动跳转https?(各种版本)
- 工具汇总篇
- SSM(Spring+SpringMVC+Mybatis) 整合