Node.js Express入門から菜々鳥(二)——Cookie+Session+三階建て


前のページでは、Node.js expressを使って簡単なウェブサイトを構築すると述べました.(「ハローワールドではないですか?」ということです.卵が痛くて、ファイル全体の文字列を返したら、どんなサイトでも作れます.)及び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でブラウザに置いてはいけない情報を保存します.expressが提供するSessionの性能と安全性は、本料理の鳥は確かに知らないです.asp.netのsessionは有名なだけです.今は分散式キャッシュが行われていますが、皆さんのSessionはmemcache、redisなどの拡張しやすいキャッシュに書いています.でも、これは本文の範囲を超えています.意図者はnpm install redisを検索できます. くどくど言って、ブラウザがクッキーを禁止した後、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の枠組みです.足りないのは娯楽だけです.
    Step 1.node.js Expressフレームを構築する フォルダを作成します.たとえばMVCです. このフォルダのルートディレクトリに入り、コマンドラインにexpress MVCを入力します. そしてMVCフォルダに入ります.  コマンドラインで 入力 スドnpm install      wait……
    Step 2.ExpressフレームによるMVCの構築  ルートディレクトリの下で、routeフォルダを削除して、viewフォルダの下のすべてのファイルを削除します.  ルートディレクトリを置換するアプリ.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('
      listening on port 3000
    '); }
    ルートディレクトリに追加する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);
            }
        }
    Step 3.MVC Test
    controllerに応答controlerを書いて、viewは応答viewを書きます.
    ルールは何ですか?関所を売ってください.コードを見れば分かりますよ.
    次の編では、nodeの簡単な操作mongodbを試してみましょう.
    本シリーズで使用されているオペレーティングシステムはuuntuで、Nodeバージョンは0.0.0で、Expressバージョンは3.2.0で、ejsバージョンは0.8.3で、現在の最新バージョンはほとんど全部そうです.