• Node.js Express 从入门到菜鸟(二)——Cookie+Session+三层搭建


      上一篇中,咱们说到使用Node.js express搭建简单的网站(“不就是Hello World!么”,只要你够蛋疼,返回整个html文件的字符串,什么网站你也能做),以及ejs模板的使用。

      这一篇本来是想直接讲三层搭建的,后来一想,不如先讲讲Cookie和Session的使用,然后配合MVC做一个完整的例子,要不光看页面跳来跳去的也没意思。

      1.Cookie

      网站开发肯定会用到Cookie的对吧,可以将信息保存在客户端的好东西。那么在express中如何获取和设置呢?

      直接上例子,跟着代码,看着注释走一遍就明白了

    Cookie的读写和设置
     1 var express = require('http://www.cnblogs.com/')
     2   , app = module.exports = express();
     3 
     4 
     5 //设置网站favicon.icon,放在这里是为了不让这种请求记录在日志中
     6 app.use(express.favicon());
     7 
     8 //这个logger是个middleware,格式化console中请求日志的
     9 if ('test' != process.env.NODE_ENV)
    10   app.use(express.logger(':method :url'));
    11 
    12 //这个cookieParser是express提供的一个分析Cookie信息,并将信息保存在req.cookie中的中间件
    13 //如想通过req.cookie获得cookie的值,一定要加这句
    14 app.use(express.cookieParser('my secret here'));
    15 
    16 //这个bodyParser()也是express提供的一个中间件,支持urlencoded,multipart,json三种表单格式
    17 //相当于
    18 //app.use(express.json());
    19 //app.use(express.urlencoded());
    20 //app.use(express.multipart());
    21 app.use(express.bodyParser());
    22 
    23 
    24 
    25 //设置缺省响应
    26 app.get('/', function(req, res){
    27   //直接通过req.cookies.key获取对应cookies中记录的value值
    28   if (req.cookies.remember) {
    29     res.send('Remembered :). Click to <a href="/forget">forget</a>!.');
    30   } else {
    31     res.send('<form method="post"><p>Check to <label>'
    32       + '<input type="checkbox" name="remember"/> remember me</label> '
    33       + '<input type="submit" value="Submit"/>.</p></form>');
    34   }
    35 });
    36 
    37 app.get('/forget', function(req, res){
    38   //输入key值,清除对应的value值
    39   res.clearCookie('remember');
    40   res.redirect('back');
    41 });
    42 
    43 app.post('/', function(req, res){
    44   var minute = 60000;
    45   //输入key值,value值,第三个参数为cookie的设置
    46   //例如:res.cookie('name', 'laodoujiao', { domain: '.cnblog.com', path: '/admin', secure: true,expires: new Date(Date.now() + 900000), httpOnly: true,maxAge:900000 });
    47   //注意maxAge这个参数,这是为了方便设置cookie的过期时间而设置的一个简易参数,已毫秒为单位 
    48  if (req.body.remember) res.cookie('remember', 1, { maxAge: minute });
    49   res.redirect('back');
    50 });
    51 
    52 if (!module.parent){
    53   app.listen(3000);
    54   console.log('Express started on port 3000');
    55

     2.Session

      网站开发肯定也会用到Session来保存一些不能放到浏览器,却又跟用户息息相关的信息。express提供的Session的性能和安全性,本菜鸟确实不知,只不过asp.net的session是出了名的烂。在现今分布式缓存当道的年代,大家的Session都往memcache,redis之类的易扩展的缓存中写,不过这超出了本文的范围,菜鸟们还是乖乖的用本地服务器缓存Session吧。有意者可以搜$ npm install redis

      罗嗦一句,浏览器禁用cookie之后,session往往失效,是为什么捏?有兴趣搜搜看哦,说不定是门生财之道。

    Session的简单读写
     1 var express = require('../..');
     2 
     3 var app = express();
     4 
     5 app.use(express.logger('dev'));
     6 
     7 //由于Session需要加密session_id,所以一定要传入一个密钥字符串(任意)来加密
     8 app.use(express.cookieParser('123'));
     9 
    10 //靠这个中间件让我们可以用req.session.key获取对应的value
    11 app.use(express.session());
    12 
    13 app.get('/', function(req, res){
    14   var body = '';
    15   //req.session.key获取对应的value
    16   if (req.session.views) {
    17     ++req.session.views;
    18   } else {
    19     req.session.views = 1;
    20     body += '<p>First time visiting? view this page in several browsers :)</p>';
    21   }
    22   res.send(body + '<p>viewed <strong>' + req.session.views + '</strong> times.</p>');
    23 });
    24 
    25 app.listen(3000);
    26 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
     1 var express = require('express');
     2 var app = module.exports = express();
     3 
     4 //express配置,有兴趣可以把这部份封装为config.js
     5 app.engine('html', require('ejs').renderFile);
     6 app.set('view engine', 'html');
     7 app.use(express.favicon());
     8 if (!module.parent) app.use(express.logger('dev'));
     9 app.use(express.static(__dirname + '/public'));
    10 app.use(express.cookieParser('some secret here'));
    11 app.use(express.session());
    12 app.use(express.bodyParser());
    13 app.use(express.methodOverride());
    14 
    15 
    16 //express的中间件处理,asp.net的同学可以理解为PreLoad事件,mvc的同学可以理解为ActionFilter
    17 //总之,就是我们编写的代码执行前过滤和处理请求
    18 app.response.message = function(msg){
    19   var sess = this.req.session;
    20   sess.messages = sess.messages || [];
    21   sess.messages.push(msg);
    22   return this;
    23 };
    24 
    25 app.use(function(req, res, next){
    26   var msgs = req.session.messages || [];
    27 
    28   res.locals.messages = msgs;
    29 
    30   res.locals.hasMessages = !! msgs.length;
    31 
    32   req.session.messages = [];
    33 
    34   next();
    35 });
    36 
    37 
    38 //错误处理
    39 app.use(function(err, req, res, next){
    40   if (~err.message.indexOf('not found')) return next();
    41 
    42   console.error(err.stack);
    43 
    44   res.status(500).render('5xx');
    45 });
    46 
    47 //注意,调试的使用注释这部分代码。
    48 //这是全局404页面配置,你懂的
    49 app.use(function(req, res, next){
    50   res.status(404).render('404', { url: req.originalUrl });
    51 });
    52 
    53 //咱们写的路由,一定要有
    54 require('./route')(app, express);
    55 
    56 
    57 if (!module.parent) {
    58     app.listen(3000);
    59     console.log('\n  listening on port 3000\n');
    60 }

       添加根目录下的route.js文件内容如下

    route.js
     1 //很简单,我就不注释了
     2 //这个路由非常简单
     3 //例如:根据html请求的不同,而路由到不同的响应方法就做不到
     4 //大家自己完善吧,这只是个思路而已   
     5  var routeMvc;
     6     module.exports = function(app, express) {
     7         app.all('/', function(req, res) {
     8             app.set('views', __dirname + '/views/index');
     9             return routeMvc('index', 'index', req, res);
    10         });
    11         app.all('/:controller', function(req, res, next) {
    12             app.set('views', __dirname + '/views/'+req.params.controller);
    13             return routeMvc(req.params.controller, 'index', req, res);
    14         });
    15         app.all('/:controller/:method', function(req, res, next) {
    16             app.set('views', __dirname + '/views/'+req.params.controller);
    17             return routeMvc(req.params.controller, req.params.method, req, res);
    18         });
    19         app.all('/:controller/:method/:id', function(req, res, next) {
    20             app.set('views', __dirname + '/views/'+req.params.controller);
    21             return routeMvc(req.params.controller, req.params.method, req, res);
    22         });
    23     }
    24 
    25     routeMvc = function(controllerName, methodName, req, res, next) {
    26         var controller, data, method;
    27         controller = null;
    28         if (!(controllerName != null)) controllerName = 'index';
    29             controller = require("./controller/" + controllerName);
    30 
    31         data = null;
    32         if (methodName != null) {
    33             methodName = methodName.replace(/[^a-z0-9A-Z_-]/i, '');
    34             method = eval('controller.' + methodName);
    35             method(req,res);
    36         }
    37     }

       Step3.MVC Test 

       controller里写响应controller,views写响应view

       至于规则是什么,卖个关子好啦。大家看看代码就知道喽

       下一篇,咱们试试node简单操作mongodb吧

      

      本系列使用的操作系统为ubuntu,Node版本为0.10.0,Express版本为3.2.0,ejs版本为0.8.3,目前基本最新的版本了基本都是

  • 相关阅读:
    当别人没说好,那么事就没达成协定
    设计模式(六):原型模式
    《一拳超人》观后感
    设计模式(五):中介者模式
    设计模式(四):单例模式与工厂模式
    设计模式(二):构造器模式与模块模式
    设计模式(一):概念小谈
    CSS代码记录
    java之如何实现调用启动一个可执行文件,exe
    file类之目录
  • 原文地址:https://www.cnblogs.com/qiuyeyaozhuai/p/3043157.html
Copyright © 2020-2023  润新知