从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
本文实例讲述了Node.js中SQLite3和MongoDB的用法。分享给大家供大家参考,具体如下:
setup.js:初始化数据库
var util=require(' util ');var async=require(' async ');//npm安装asyncvar notesdb=require(' ./node sdb-SqLite 3’);//var notesdb=require(' ./notes db-mongose ');notesdb.connect(函数(错误){ if(错误)引发错误;});notesdb.setup(函数(错误){ if (error){ util.log('ERROR ')错误);抛出错误;} async.series([ //async.series函数可以控制函数按顺序执行,从而保证最后的函数在所有其他函数完成之后执行函数(cb){ notesdb.add('test ',' testtest '),函数(ERROR){ if(ERROR)util。日志(' ERROR ' ERROR);cb(错误);});} ],函数(错误,结果){ if (error) util.log('ERROR ')错误);笔记数据库。disconnect(函数(err){ });} );});nodesdb-sqlite3.js
SQLite3是一个轻量级的进程内结构化查询语言引擎
它是一个无服务器且无需配置的结构化查询语言数据库引擎,仅仅是作为一个独立的库被链接到应用程序上
国家预防机制安装sqlite3安装此模块之前先在系统上安装sqlite3库http://www.sqlite.org/download.html下载
//数据库接口库var util=require(' util ');var SQLite 3=require(' SQLite 3 ');SQLite 3。verbose();var db=未定义;/* 数据库名是直接硬编码的,所以当调用连接和设置函数时,当前目录中就会生成第06章。sqlite3文件*/exports.connect=function(回调){ db=新sqlite3 .数据库('第06章。sqlite3 ',sqlite3 .OPEN_READWRITE | sqlite3 .OPEN_CREATE,函数(呃){如果(呃){ util。日志(“CREATE上的失败数据库”错误);回调(错误);} else { callback(null);} });}//此处的拆开函数是空的exports.disconnect=function(回调){回调(null);}exports.setup=function(回调){ db。运行(' CREATE TABLE IF NOT EXISTS NOT NOT notes ' '(ts DATETIME,author VARCHAR(255),note TEXT)'),函数(err){ IF(err){ util。日志(“创建表失败”错误);回调(错误);} else { callback(null);} });}exports.emptyNote={'ts': ' ',author: ' ',NOte : ' ' };exports.add=函数(作者、注释、回调){ db.run('插入音符(ts),作者、注释)' ' VALUES(?);',[新日期(),作者,注释],函数(错误){ if(错误){ util.log('添加时失败'错误);回调(错误);} else { callback(null);} });}/*运行函数接受一个字符串参数,其中?表示占位符,占位符的值必须通过一个数组传递进来调用者提供了一个回调函数,然后通过这个回调函数来声明错误*/exports.delete=function(ts,回调){ db。运行('从注释中删除,其中ts=?',[ts],函数(呃){如果(呃){ util。日志(“删除失败”错误);回调(错误);} else { callback(null);} });}exports.edit=function(ts、作者、注释、回调){ db。运行('更新注释' '设置ts=?作者=?注意=?'其中ts=?",[ts,作者,注,ts],函数(呃){如果(呃){ util。日志(“更新表失败”错误);回调(错误);} else { callback(null);} });}exports.allNotes=function(回调){ util。日志('在所有笔记中');db.all('SELECT * FROM notes ',回调);}出口。FOr all=function(DoeHeaLTH,done){ db。每个(' SELECT * FROM notes ',函数(err,row){ if(err){ util。日志(“检索行失败”错误);完成(err,null);} else { DoeHeaLTH(null,row);} },完成);}/*allNotes和对所有人来说函数是操作所有数据的两种方法,allNotes把数据库中所有的数据行收集到一个数组里,而对所有人来说方法可以接受两个回调函数,每当从数据集中拿一行数据,回调函数每个人都会执行一遍,当读完所有数据时,回调函数完成的就会执行*/出口。findnote byid=function(ts,callback){ var Didone=false;每个(“从注释中选择ts=?”,[ts],函数(err,row){ if(err){ util。日志(“检索行失败”错误);回调(err,null);} else { if(!didOne){ 0回调(null,第行);didOne=true//保证回调函数只被执行一次} } });} notes db-mongose。射流研究…
MongoDB是nosql数据库的领头羊之一,'可扩展、高性能、开源、面向文档的数据库,它使用JSON风格的文档。
猫鼬是用于访问MongoDB的模块之一,它是一个对象建模工具,意味着你的程序负责定义模式对象来描述数据,
而猫鼬负责数据到MongoDB的存储。
猫鼬对于结节和MongoDB而言是一个非常强大的对象建模工具,使用嵌入式文档,是一个类型灵活的系统,
适用于字段输入、字段验证、虚拟字段等。
MongoDB在Windows操作系统操作系统下安装部署://www .JB 51。net/article/111112。html文件的后缀
安装猫鼬模块
国家预防机制安装蒙古蒙古不是唯一一个在结节中使用MongoDB的工具。
var util=require(' util ');var mongose=必选(' mongose ');var Schema=猫鼬。图式;var db URL=' MongoDB :///localhost/chap 06 ';//dburl用于连接已运行的mongodbexports。connect=函数(回调){ mongose。连接(数据库网址);}exports.disconnect=function(回调){ mongoose.disconnect(回调);}exports.setup=function(回调){回调(null);}//定义模式var NoteSchema=新架构({ ts: {type: Date,default: Date.now},//默认值author: String,note : String });//将NoteSchema作为猫鼬的模型注册进去蒙哥斯。模型(' Note ',Note schema);var Note=mongous。型号('注');出口。空注释={“_ id”: ' ',author: ' ',note : ' ' };exports.add=函数(作者、注释、回调){ var new Note=new Note();newnote . author new note . note=note new note。save(function(err){ if(err){ util。日志(' FATAL ' err);回调(错误);} else { callback(null);} });}exports.delete=function(id,callback){ exports。findnote byid(id,function(err,doc){ if(err){ callback(err)};} else { util。日志(util。检查(文档));医生。移除();回调(null);} });}exports.edit=function(id、作者、注释、回调){ exports。findnote byid(id,function(err,doc){ if(err){ callback(err)};} else { doc。ts=新日期();doc.author=作者;doc.note=notedoc。save(function(err){ if(err){ util。日志(' FATAL ' err);回调(错误);} else { callback(null);} });} });}exports.allNotes=function(回调){ Note.find({},回调);}出口。for all=function(DoeHeaLTH,done){ Note.find({},function(err,docs){ if(err){ util。日志(' FACTAL ' err);完成(err,null);}文档。foreach(function(doc){ doEach(null,doc);});完成(空);});}/*_id字段是MongoDB提供的全局唯一的身份证,用于标识存储的文档*/var findnote byid=exports。findnote byid=function(id,回调){ note。findone({ _ id : id }),函数(err,doc){ if(err){ util。日志(' FATAL ' err);回调(err,null);}回调(空,文档);});}app.js
//在数据库需要放置在一台计算机上时,应该考虑使用SQLite3//控制器,在nodesdb-sqlite3.js和notesdb-mongoose.js模块之间切换var util=require(' util ');var URL=必选(' URL ');var express=require(' express ');var nmDbEngine=' sqlite3//用于命名数据库引擎、选择合适的notesdb实现和选择合适的视图目录//var nmDbEngine=' mongose ';var notesdb=require(' ./node sdb-' nmDbEngine);var app=express();app。使用(快递。logger());app。使用(快递。cookieparser());//添加cookieParser中间件app。使用(快递。body parser());app.engine(' .“html”,必选(“ejs”)._ _快递);//3.X//app.register ' ' .html ',要求(“ejs”);//2.xapp。set(' view ',_ _ dirname '/view-' nmDbEngine);app.set('view engine ',' ejs ');//是一个路由中间件函数,用于在一些路由器函数中解析统一资源定位器查询参数var parserlparams=function(req,res,next){ req。urlp=URL。解析(请求。网址,真);next();}//检查用户是否被允许访问,这里只检查甜饼干是否等于AOK,这个单词通常意味着一切都没问题/* 很多应用都需要用户登录,然后用户才能进行一些特权操作。由于超文本传送协议是一个无状态的协议,验证用户的唯一方式就是发送一个甜饼干到浏览器上,然后验证标识符饼干。包含了应用中用于验证用户的数据cookieParser。中间件在这里做了很多工作,查找饼干,解析饼干,然后将解析出来的值让到请求对象中。当存在甜饼干时,它的值会被放入req.cookies中*/var checkAccess=function(req,res,next){ if(!req.cookies ||!请求。饼干。notesaccess | | req。饼干。注意!==' AOK '){ RES . redirect('/log in ');} else { next();}}notesdb.connect(函数(错误){ if(错误)引发错误;})app.on('close ',函数(错误){ notes db。disconnect(函数(err){ });});app.get('/',function(req,RES){ RES . redirect('/view ');});app.get('/view ',checkAccess,function(req,res){ //可以在每个路由上加checkAccess检查notesdb.allNotes(函数(err,NOtes){ if(err){ util。日志(' ERROR ' err);抛出错误;} else { RES . render(' view Notes。html ',{title: 'Notes (' nmDbEngine '),Notes : Notes });} });});/*当用户点击模拟数字音乐制碟按钮时app.get('/add ',)内的函数就会被调用,浏览器会发出一个发往/add的HTTP GET请求。
这个函数使用addedit.html模板来创建一个表单,让用于通过这个表单输入标签,然后通过单击使服从按钮提交,当用户提交表单,浏览器就会发出一个HTTP POST请求,app.post('/add ',)内的函数就会被调用,用户输入的数据会被存放在请求主体中,而请求主体会被正文解析器(app。使用(快递。body parser()))中间件处理并存放在请求。正文中*/app.get('/add ',函数(req,res){ res.render('addedit.html ',{title: 'Notes (' nmDbEngine '),postpath: '/add ',note : Notes db。empty note });});app.post('/add ',函数(req,RES){注意sdb。添加(请求。尸体。author,req.body.note,function(error){ if(error)throw error;RES .重定向('/view ');});});app.get('/del ',parseUrlParams,function(req,RES){ notes db。删除(请求。urlp。查询。id),函数(错误){ if(错误)抛出错误;RES .重定向('/view ');});});app.get('/edit ',parseUrlParams,function(req,RES){ notes db。查找notebyid(请求。urlp。查询。id),函数(错误,注意){ if(error)抛出错误;res.render('addedit.html ',{title: 'Notes (' nmDbEngine ')',postpath: '/edit ',note : note });});});app.post('/edit ',function(req,res){ notesdb.edit(req.body.id,req.body.author,req.body.note,function(error){ if(error)throw error;RES .重定向('/view ');});});app.get('/login ',函数(req,res){ res.render('login.html ',{ title : ' Notes log in(' nmDbEngine ')' });});app.post('/login ',函数(请求,决议){ //此处可以添加检查用户信息的逻辑//.res.cookie('notesaccess ',' AOK ');RES .重定向('/view ');});app。听(3000);show.js
//控制台显示var util=require(' util ');var notesdb=require(' ./note sdb-SqLite 3’);//var notesdb=require(' ./notes db-mongose ');notesdb.connect(函数(错误){ if(错误)引发错误;});notesdb.forAll(函数(错误,行){ util。日志(' ROW : ' util。检查(行));},函数(错误){ if(错误)抛出错误;乌提尔。日志(“全部完成”);笔记数据库。disconnect(函数(err){ });});前台页面在视图-sqlite3目录下
layout.html
!DOCTYPE html html head title %=title %/title/head body h1 %=title %/h1 pa href='/view ' view/a | a href='/add ' add/a/p/body/html viewpnotes。超文本标记语言
%包含layout.html %表% notes.forEach(函数(注释){ % tr td p %=新日期(注释。ts ).toString()3360乘%=注意。作者%/p p %=注。注意%/p/TD表单方法=' get ' action='/del '输入类型=' submit '值=' Delete '/输入类型=' hidden '名称=' id '值=' %=注意。ts % '//form br/form方法=' get ' action='/Edit '输入类型=' submit '值=' Edit '/输入类型=' hidden '名称=' id '值=' %=注意。ts % '//表单/%/tableaddedit.html
% include layout.html % form method=' post ' action=' %=post path % ' % if(note){ % input type=' hidden ' name=' id ' value=' %=note。ts % '/% } %输入类型=' text ' name=' author ' value=' %=注意。作者% '/br/文本区域行数=' 5 '列=' 40 '名称='注释%=注释。注意%/文本区域br/输入类型='提交'值='提交'/表单登录。html .
% include layout.html %表单方法=' POST '操作='/log in ' p单击我登录按钮/i登录/p .输入类型="提交"值="登录"//formnode setup.js
node app.js
希望本文所述对大家nodejs程序设计有所帮助。
版权声明:从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。