上一篇中,咱们说到使用Node.js express搭建简单的网站(“不就是Hello World!么”,只要你够蛋疼,返回整个html文件的字符串,什么网站你也能做),以及ejs模板的使用。 这一篇本来是想直接讲三层搭建的,后来一想,不如先讲讲Cookie和Session的使用,然后配合MVC做一个完整的例子,要不光看页面跳来跳去的也没意思。
Cookie 网站开发肯定会用到Cookie的对吧,可以将信息保存在客户端的好东西。那么在express中如何获取和设置呢? 直接上例子,跟着代码,看着注释走一遍就明白了
Cookie的读写和设置 var express = require('http://www.cnblogs.com/') , app = module.exports = express(); //设置网站favicon.icon,放在这里是为了不让这种请求记录在日志中 app.use(express.favicon()); //这个logger是个middleware,格式化console中请求日志的 if ('test' != process.env.NODE_ENV) app.use(express.logger(':method :url')); //这个cookieParser是express提供的一个分析Cookie信息,并将信息保存在req.cookie中的中间件 //如想通过req.cookie获得cookie的值,一定要加这句 app.use(express.cookieParser('my secret here')); //这个bodyParser()也是express提供的一个中间件,支持urlencoded,multipart,json三种表单格式 //相当于 //app.use(express.json()); //app.use(express.urlencoded()); //app.use(express.multipart()); app.use(express.bodyParser()); //设置缺省响应 app.get('/', function(req, res){ //直接通过req.cookies.key获取对应cookies中记录的value值 if (req.cookies.remember) { res.send('Remembered :). Click to <a href="/forget">forget</a>!.'); } else { res.send('<form method="post"><p>Check to <label>' + '<input type="checkbox" name="remember"/> remember me</label> ' + '<input type="submit" value="Submit"/>.</p></form>'); } }); app.get('/forget', function(req, res){ //输入key值,清除对应的value值 res.clearCookie('remember'); res.redirect('back'); }); app.post('/', function(req, res){ var minute = 60000; //输入key值,value值,第三个参数为cookie的设置 //例如:res.cookie('name', 'laodoujiao', { domain: '.cnblog.com', path: '/admin', secure: true,expires: new Date(Date.now() + 900000), httpOnly: true,maxAge:900000 }); //注意maxAge这个参数,这是为了方便设置cookie的过期时间而设置的一个简易参数,已毫秒为单位 if (req.body.remember) res.cookie('remember', 1, { maxAge: minute }); res.redirect('back'); }); if (!module.parent){ app.listen(3000); console.log('Express started on port 3000'); }
2.Session
网站开发肯定也会用到Session来保存一些不能放到浏览器,却又跟用户息息相关的信息。express提供的Session的性能和安全性,本菜鸟确实不知,只不过asp.net的session是出了名的烂。在现今分布式缓存当道的年代,大家的Session都往memcache,redis之类的易扩展的缓存中写,不过这超出了本文的范围,菜鸟们还是乖乖的用本地服务器缓存Session吧。有意者可以搜$ npm install redis 罗嗦一句,浏览器禁用cookie之后,session往往失效,是为什么捏?有兴趣搜搜看哦,说不定是门生财之道。
Session的简单读写 var express = require('../..'); var app = express(); app.use(express.logger('dev')); //由于Session需要加密session_id,所以一定要传入一个密钥字符串(任意)来加密 app.use(express.cookieParser('123')); //靠这个中间件让我们可以用req.session.key获取对应的value app.use(express.session()); app.get('/', function(req, res){ var body = ''; //req.session.key获取对应的value if (req.session.views) { ++req.session.views; } else { req.session.views = 1; body += '<p>First time visiting? view this page in several browsers :)</p>'; } res.send(body + '<p>viewed <strong>' + req.session.views + '</strong> times.</p>'); }); app.listen(3000); console.log('Express app started on port 3000');
3.获取get post传参
不解释了,这哥们写的挺棒,想知道就点过去看吧 http://blog.csdn.net/danhuang2012/article/details/7463291
4.从头开始搭建基于express的mvc 这是自己写的一个MVC框架,颇多不足,仅仅只是娱乐
Step1.搭建 node.js Express框架 创建一个文件夹,例如:MVC。 进入该文件夹根目录下,在命令行中 输入express MVC 然后进入MVC文件夹 在命令行中 输入 sudo npm install wait.............
Step2.搭建基于Express框架的MVC 删除根目录下,route文件夹,删除views文件夹下所有文件 替换根目录的app.js文件内容如下
app.js var express = require('express'); var app = module.exports = express(); //express配置,有兴趣可以把这部份封装为config.js app.engine('html', require('ejs').renderFile); app.set('view engine', 'html'); app.use(express.favicon()); if (!module.parent) app.use(express.logger('dev')); app.use(express.static(__dirname + '/public')); app.use(express.cookieParser('some secret here')); app.use(express.session()); app.use(express.bodyParser()); app.use(express.methodOverride()); //express的中间件处理,asp.net的同学可以理解为PreLoad事件,mvc的同学可以理解为ActionFilter //总之,就是我们编写的代码执行前过滤和处理请求 app.response.message = function(msg){ var sess = this.req.session; sess.messages = sess.messages || []; sess.messages.push(msg); return this; }; app.use(function(req, res, next){ var msgs = req.session.messages || []; res.locals.messages = msgs; res.locals.hasMessages = !! msgs.length; req.session.messages = []; next(); }); //错误处理 app.use(function(err, req, res, next){ if (~err.message.indexOf('not found')) return next(); console.error(err.stack); res.status(500).render('5xx'); }); //注意,调试的使用注释这部分代码。 //这是全局404页面配置,你懂的 app.use(function(req, res, next){ res.status(404).render('404', { url: req.originalUrl }); }); //咱们写的路由,一定要有 require('./route')(app, express); if (!module.parent) { app.listen(3000); console.log('\n listening on port 3000\n'); }
添加根目录下的route.js文件内容如下
route.js //很简单,我就不注释了 //这个路由非常简单 //例如:根据html请求的不同,而路由到不同的响应方法就做不到 //大家自己完善吧,这只是个思路而已 var routeMvc; module.exports = function(app, express) { app.all('/', function(req, res) { app.set('views', __dirname + '/views/index'); return routeMvc('index', 'index', req, res); }); app.all('/:controller', function(req, res, next) { app.set('views', __dirname + '/views/'+req.params.controller); return routeMvc(req.params.controller, 'index', req, res); }); app.all('/:controller/:method', function(req, res, next) { app.set('views', __dirname + '/views/'+req.params.controller); return routeMvc(req.params.controller, req.params.method, req, res); }); app.all('/:controller/:method/:id', function(req, res, next) { app.set('views', __dirname + '/views/'+req.params.controller); return routeMvc(req.params.controller, req.params.method, req, res); }); } routeMvc = function(controllerName, methodName, req, res, next) { var controller, data, method; controller = null; if (!(controllerName != null)) controllerName = 'index'; controller = require("./controller/" + controllerName); data = null; if (methodName != null) { methodName = methodName.replace(/[^a-z0-9A-Z_-]/i, ''); method = eval('controller.' + methodName); method(req,res); } }
Step3.MVC Test
controller里写响应controller,views写响应view
至于规则是什么,卖个关子好啦。大家看看代码就知道喽
下一篇,咱们试试node简单操作mongodb吧
本系列使用的操作系统为ubuntu,Node版本为0.10.0,Express版本为3.2.0,ejs版本为0.8.3,目前基本最新的版本了基本都是