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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM