zoukankan      html  css  js  c++  java
  • express随记01

    系统变量的设置

    • app.get(env) | process.env.NODE_ENV: 会自动判断当前环境类型;
    • app.get(port) | process.env.PORT: 必须手动设置;

    app.param([name], callback)

    • 用来处理多个匹配
    app.param('id', function (req, res, next, id) {
      console.log('CALLED ONLY ONCE');
      next();
    })
    
    app.get('/user/:id', function (req, res, next) {
      console.log('although this matches');
      next();
    });
    
    app.get('/user/:id', function (req, res) {
      console.log('and this matches too');
      res.end();
    });
    
    • 其默认值: { path: '/', httpOnly: true, secure: false, maxAge: null }
    //注意获取和设置的不同
    
    app.get('/', function (req, res) {
       if (!req.cookies.counter)
        res.cookie('counter', 0);
      else
        res.cookie('counter', parseInt(req.cookies.counter,10) + 1);
      res.status(200).send('cookies are: ', req.cookies);
    })
    
    • 签名加密的cookie
    //会自动加密解密处理
    
    app.use(cookieParser('test-sign'));
    .........
    app.get('/', function (req, res) {
      if (!req.signedCookies.counter)
        res.cookie('counter', 0, {signed: true});
      else
        res.cookie('counter', parseInt(req.signedCookies.counter,10) + 1, {signed: true});
      res.status(200).send('cookies are: ', req.signedCookies);
    })
    

    session

    //将session保存到redis中
    
    var cookieParser = require('cookie-parser');
    var session = require('express-session');
    var RedisStore = require('connect-redis')(session);
    
    app.use(cookieParser());
    app.use(session({
      resave: true,                             //是否强制保存session。即使没有被修改;
      saveUninitialized: true,             //是否强制保存不是初始化的session;
      name: 'connect.sid',                 //默认浏览器cookie保存的名称;
      store: new RedisStore({
        host: 'localhost',
        port: 6379
      }),
      secret: '0FFD9D8D-78F1-4A30-9A4E-0940ADE81645',
      cookie: { path: '/', maxAge: 3600000 }   
    }));
    
    
    app.get('/', function(req, res){
      console.log('Session ID: ', req.sessionID)
      if (req.session.counter) {
        req.session.counter = req.session.counter +1;
      } else {
        req.session.counter = 1;
      }
      res.send('Counter: ' + req.session.counter)
    });
    
    
    • 其中要控制的实效包括:ttl:session字段保存在数据库的实效;maxAge:cookie字段的有效时间;

    • 如果设置cookie secure: true,那其只会在httpssession才会去判断cookie值;

    • session默认是httpOnly:true

    • 一般要将saveUninitialized 设为false,避免未对session修改也被保存下来;

    • express-session自带debug模式,运行时设置DEBUG=express-session开启;

    • 一般流程

    //登陆
    login: fetching->no-session-found->[set]->saveing->split response->set-cookie
             [redirect]-> fetching->session-found->touching->split response->touched
    //重新打开
    reopen: fetching->session-found->touching->touched
    //退出
    logout:  fetching->session-found->[set]->no-session->
                 [redirect]->fetching->no-session-found
    

    全局参数

    //两种形式
    
    app.locals = {};
    res.locals = {};
    

    特殊的输出

    • 设置头部
    app.get('/set-csv', function(req, res) {
      var body = 'title, tags
    ' +
        'Practical Node.js, node.js express.js
    ' +
        'Rapid Prototyping with JS, backbone.js node.js mongodb
    ' +
        'JavaScript: The Good Parts, javascript
    '
      res.set({'Content-Type': 'text/csv',
        'Content-Length': body.length,
        'Set-Cookie': ['type=reader', 'language=javascript']});
      res.end(body);
    });
    
    • 设置响应码
    res.status(200).end();
    res.status(200).send();
    res.status(200).json();
    
    • 数据流输出文件
    app.get('/stream2', function(req, res) {
      var stream = fs.createReadStream(largeImagePath);
      stream.on('data', function(data) {
        res.write(data);
      });
      stream.on('end', function() {
        res.end();
      });
    });
    
    app.get('/stream1', function(req, res) {
      var stream = fs.createReadStream(largeImagePath);
      stream.pipe(res);
    });
    
    

    服务器开关

    
    var server = http.createServer(app);
    var boot = function () {
      server.listen(app.get('port'), function(){
        console.info('Express server listening on port ' + app.get('port'));
    }); };
    var shutdown = function() {
      server.close();
    };
    
    if (require.main === module) {
      boot();
    } else {
      console.info('Running app as a module');
      exports.boot = boot;
      exports.shutdown = shutdown;
      exports.port = app.get('port');
    }
    
  • 相关阅读:
    认识CSS样式/CSS样式的优势
    form表单中的label标签
    使用提交按钮,提交数据/使用重置按钮,重置表单信息
    使用下拉列表框,节省空间
    (七十)Xcode5及以上对于状态栏和导航栏样式的设定方法
    (六十九)使用block进行消息传递
    1039. Course List for Student (25)
    (六十八)使用XMPPFramework登录
    (六十七)Xcode导入XMPPFramework框架
    (六十六)TableView内容超过一屏时滚动到屏幕底部的方法
  • 原文地址:https://www.cnblogs.com/jinkspeng/p/4842709.html
Copyright © 2011-2022 走看看