//在数据库需要放置在一台计算机上时,应该考虑使用SQLite3 //控制器,在nodesdb-sqlite3.js和notesdb-mongoose.js模块之间切换 var util = require('util'); var url = require('url'); var express = require('express'); var nmDbEngine = 'sqlite3'; //用于命名数据库引擎、选择合适的notesdb实现和选择合适的views目录 //var nmDbEngine = 'mongoose'; var notesdb = require('./nodesdb-' + nmDbEngine); var app = express(); app.use(express.logger()); app.use(express.cookieParser()); //添加cookieParser中间件 app.use(express.bodyParser()); app.engine('.html', require('ejs').__express); //3.X //app.register('.html', require('ejs')); //2.X app.set('views', __dirname + '/views-' + nmDbEngine); app.set('view engine', 'ejs'); //是一个路由中间件函数,用于在一些路由器函数中解析URL查询参数 var parseUrlParams = function(req, res, next){ req.urlP = url.parse(req.url, true); next(); } //检查用户是否被允许访问,这里只检查cookie是否等于AOK,这个单词通常意味着一切都没问题 /* 很多应用都需要用户登录,然后用户才能进行一些特权操作。由于HTTP是一个无状态的协议, 验证用户的唯一方式就是发送一个cookie到浏览器上,然后验证标识符。cookie包含了应用中用于验证用户的数据。 cookieParser中间件在这里做了很多工作,查找cookie,解析cookie,然后将解析出来的值让到req对象中。 当存在cookie时,它的值会被放入req.cookies中。 */ var checkAccess = function(req, res, next){ if (!req.cookies || !req.cookies.notesaccess || req.cookies.notesaccess !== "AOK"){ res.redirect('/login'); } else { next(); } } notesdb.connect(function(error){ if (error) throw error; }) app.on('close', function(error){ notesdb.disconnect(function(err){}); }); app.get('https://www.jb51.net/', function(req, res) {res.redirect('https://www.jb51.net/view');}); app.get('https://www.jb51.net/view', checkAccess, function(req, res){ //可以在每个路由上加checkAccess检查 notesdb.allNotes(function(err, notes){ if (err){ util.log('ERROR ' + err); throw err; } else { res.render('viewnotes.html', {title: "Notes ("+ nmDbEngine +")", notes: notes}); } }); }); /* 当用户点击ADD按钮时app.get('https://www.jb51.net/add', ...)内的函数就会被调用,浏览器会发出一个发往/add的HTTP GET请求。 这个函数使用addedit.html模板来创建一个表单,让用于通过这个表单输入标签,然后通过单击SUBMIT按钮提交, 当用户提交表单,浏览器就会发出一个HTTP POST请求,app.post('https://www.jb51.net/add', ...)内的函数就会被调用, 用户输入的数据会被存放在请求主体中,而请求主体会被bodyParser(app.use(express.bodyParser()))中间件处理并存放在req.body中 */ app.get('https://www.jb51.net/add', function(req, res){ res.render('addedit.html', {title: "Notes ("+ nmDbEngine +")", postpath: 'https://www.jb51.net/add', note: notesdb.emptyNote}); }); app.post('https://www.jb51.net/add', function(req, res){ notesdb.add(req.body.author, req.body.note, function(error){ if (error) throw error; res.redirect('https://www.jb51.net/view'); }); }); app.get('/del', parseUrlParams, function(req, res){ notesdb.delete(req.urlP.query.id, function(error){ if (error) throw error; res.redirect('https://www.jb51.net/view'); }); }); app.get('/edit', parseUrlParams, function(req, res){ notesdb.findNoteById(req.urlP.query.id, function(error, note){ if (error) throw 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.redirect('https://www.jb51.net/view'); }); }); app.get('/login', function(req, res){ res.render('login.html', {title: "Notes LOGIN ("+ nmDbEngine +")"}); }); app.post('/login', function(req, res){ //此处可以添加检查用户信息的逻辑 //... res.cookie('notesaccess', 'AOK'); res.redirect('https://www.jb51.net/view'); }); app.listen(3000);
show.js