setup.js:初始化数据库
var util = require('util'); var async = require('async'); //npm install async var notesdb = require('./nodesdb-sqlite3'); // var notesdb = require('./notesdb-mongoose'); notesdb.connect(function(error){ if (error) throw error; }); notesdb.setup(function(error){ if (error){ util.log('ERROR ' + error); throw error; } async.series([ //async.series函数可以控制函数按顺序执行,从而保证最后的函数在所有其他函数完成之后执行 function(cb){ notesdb.add("test", "testtest", function(error){ if (error) util.log('ERROR ' + error); cb(error); }); } ], function(error, results){ if (error) util.log('ERROR ' + error); notesdb.disconnect(function(err){}); } ); });
nodesdb-sqlite3.js
SQLite3 是一个轻量级的进程内SQL引擎
它是一个无服务器且无需配置的SQL数据库引擎,仅仅是作为一个独立的库被链接到应用程序上
npm install sqlite3 安装此模块之前先在系统上安装sqlite3库 下载
//数据库接口库 var util = require('util'); var sqlite3 = require('sqlite3'); sqlite3.verbose(); var db = undefined; /* 数据库名是直接硬编码的,所以当调用connect和setup函数时,当前目录中就会生成chap06.sqlite3文件 */ exports.connect = function(callback){ db = new sqlite3.Database("chap06.sqlite3", sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, function(err){ if (err){ util.log('FAIL on creating database ' + err); callback(err); } else { callback(null); } }); } //此处的disconnect函数是空的 exports.disconnect = function(callback){ callback(null); } exports.setup = function(callback){ db.run("CREATE TABLE IF NOT EXISTS notes " + "(ts DATETIME, author VARCHAR(255), note TEXT)", function(err){ if (err){ util.log('FAIL on creating table ' + err); callback(err); } else { callback(null); } }); } exports.emptyNote = {"ts": "", author: "", note: ""}; exports.add = function(author, note, callback){ db.run("INSERT INTO notes (ts, author, note) " + "VALUES (?, ?, ?);", [new Date(), author, note], function(error){ if (error){ util.log('FAIL on add ' + error); callback(error); } else { callback(null); } }); } /* run函数接受一个字符串参数,其中?表示占位符,占位符的值必须通过一个数组传递进来 调用者提供了一个回调函数,然后通过这个回调函数来声明错误 */ exports.delete = function(ts, callback){ db.run("DELETE FROM notes WHERE ts = ?;", [ts], function(err){ if (err){ util.log('FAIL to delete ' + err); callback(err); } else { callback(null); } }); } exports.edit = function(ts, author, note, callback){ db.run("UPDATE notes " + "SET ts = ?, author = ?, note = ? " + "WHERE ts = ?", [ts, author, note, ts], function(err){ if (err){ util.log('FAIL on updating table ' + err); callback(err); } else { callback(null); } }); } exports.allNotes = function(callback){ util.log(' in allnote'); db.all("SELECT * FROM notes", callback); } exports.forAll = function(doEach, done){ db.each("SELECT * FROM notes", function(err, row){ if (err){ util.log('FAIL to retrieve row ' + err); done(err, null); } else { doEach(null, row); } }, done); } /* allNotes和forAll函数是操作所有数据的两种方法,allNotes把数据库中所有的数据行收集到一个数组里, 而forAll方法可以接受两个回调函数,每当从数据集中拿一行数据,回调函数doEach都会执行一遍,当读完所有数据时,回调函数done就会执行 */ exports.findNoteById = function(ts, callback){ var didOne = false; db.each("SELECT * FROM notes WHERE ts = ?", [ts], function(err, row){ if (err){ util.log('FAIL to retrieve row ' + err); callback(err, null); } else { if (!didOne){ callback(null, row); didOne = true; //保证回调函数只被执行一次 } } }); }
notesdb-mongoose.js
MongoDB是nosql数据库的领头羊之一,"可扩展、高性能、开源、面向文档的数据库",它使用JSON风格的文档。
Mongoose是用于访问MongoDB的模块之一,它是一个对象建模工具,意味着你的程序负责定义模式对象来描述数据,
而Mongoose负责数据到MongoDB的存储。
Mongoose对于Node和MongoDB而言是一个非常强大的对象建模工具,使用嵌入式文档,是一个类型灵活的系统,
适用于字段输入、字段验证、虚拟字段等。
MongoDB在Windows下安装部署 :https://www.jb51.net/article/111112.htm
安装Mongoose模块
npm install mongoose
Mongoose不是唯一一个在node中使用MongoDB的工具。
var util = require('util'); var mongoose = require('mongoose'); var Schema = mongoose.Schema; var dburl = 'mongodb://localhost/chap06'; //dburl用于连接已运行的MongoDB exports.connect = function(callback){ mongoose.connect(dburl); } exports.disconnect = function(callback){ mongoose.disconnect(callback); } exports.setup = function(callback){callback(null);} //定义模式 var NoteSchema = new Schema({ ts: {type: Date, default: Date.now}, //默认值 author: String, note: String }); //将NoteSchema作为Mongoose的模型注册进去 mongoose.model('Note', NoteSchema); var Note = mongoose.model('Note'); exports.emptyNote = {"_id": "", author: "", note: ""}; exports.add = function(author, note, callback){ var newNote = new Note(); newNote.author = author; newNote.note = note; newNote.save(function(err){ if (err){ util.log('FATAL ' + err); callback(err); } else { callback(null); } }); } exports.delete = function(id, callback){ exports.findNoteById(id, function(err, doc){ if (err){ callback(err); } else { util.log(util.inspect(doc)); doc.remove(); callback(null); } }); } exports.edit = function(id, author, note, callback){ exports.findNoteById(id, function(err, doc){ if (err){ callback(err); } else { doc.ts = new Date(); doc.author = author; doc.note = note; doc.save(function(err){ if (err){ util.log('FATAL ' + err); callback(err); } else { callback(null); } }); } }); } exports.allNotes = function(callback){ Note.find({}, callback); } exports.forAll = function(doEach, done){ Note.find({}, function(err, docs){ if (err){ util.log('FATAL ' + err); done(err, null); } docs.forEach(function(doc){ doEach(null, doc); }); done(null); }); } /* _id字段是MongoDB提供的全局唯一的ID,用于标识存储的文档 */ var findNoteById = exports.findNoteById = function(id, callback){ Note.findOne({_id: id}, function(err, doc){ if (err){ util.log('FATAL ' + err); callback(err, null); } callback(null, doc); }); }
app.js