Node.js Express 從入門到菜鳥(二)——Cookie+Session+三層搭建

    上一篇中,我們說到使用Node.js express搭建簡單的網站(「不就是Hello World!麼」,只要你夠蛋疼,返回整個html文件的字符串,什麼網站你也能作),以及ejs模板的使用。  這一篇原本是想直接講三層搭建的,後來一想,不如先講講Cookie和Session的使用,而後配合MVC作一個完整的例子,要不光看頁面跳來跳去的也沒意思。html

  1. Cookie  網站開發確定會用到Cookie的對吧,能夠將信息保存在客戶端的好東西。那麼在express中如何獲取和設置呢?  直接上例子,跟着代碼,看着註釋走一遍就明白了node

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 redis

       網站開發確定也會用到Session來保存一些不能放到瀏覽器,卻又跟用戶息息相關的信息。express提供的Session的性能和安全性,本菜鳥確實不知,只不過asp.net的session是出了名的爛。在現今分佈式緩存當道的年代,你們的Session都往memcache,redis之類的易擴展的緩存中寫,不過這超出了本文的範圍,菜鳥們仍是乖乖的用本地服務器緩存Session吧。有意者能夠搜$ npm install redis  羅嗦一句,瀏覽器禁用cookie以後,session每每失效,是爲何捏?有興趣搜搜看哦,說不定是門生財之道。mongodb

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傳參  express

不解釋了,這哥們寫的挺棒,想知道就點過去看吧  http://blog.csdn.net/danhuang2012/article/details/7463291npm

4.從頭開始搭建基於express的mvc  這是本身寫的一個MVC框架,頗多不足,僅僅只是娛樂json

Step1.搭建 node.js Express框架  建立一個文件夾,例如:MVC。  進入該文件夾根目錄下,在命令行中 輸入express MVC  而後進入MVC文件夾   在命令行中  輸入  sudo npm install       wait.............ubuntu

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,目前基本最新的版本了基本都是

相關文章
相關標籤/搜索