express提供的中间件

Express 框架中常用的一些中间件的使用方法

  • basiAuth 访问控制

      // 帐号密码正确时才发回 true,才能继续访问
      var express =  require('express');
      var app = express();
      // 这里的用户名和密码应从数据库读取
      app.use(express.basicAuth('username', 'password'));
      app.get('/', function (req, res) {
          res. send('成功登录后才会看到这段内容。');
      });
      app.listen(1234, 'localhost');
    
  • bodyParse 处理请求 body 的内容

      // 内部使用 JSON    编码、url 编码处理和文件的上传处理
      // 处理一个上传文件
      <body>
        <h1>使用 express.bodyParser 中间件上传文件</h1>
        <form id="myForm" action="upload.html" method="post" enctype="multipart/form-data">
          <input type="file" id="file" name="file">
          <input type="submit" onclick="uploadFile()" value="上传">
        </form>
        <div id="result">
          选择文件后,点击按钮上传.
        </div>
      </body>
    
    // 帐号密码正确时才发回 true,才能继续访问
    var express =  require('express');
    var connect = require('connect');
    var fs = require('fs');
        var app = express();
    // 使用 bodyParser 处理上传
    // app.use(express.bodyParser());
    app.use(connect.urlencoded());
    app.use(connect.json());
    app.get('/upload.html', function (req, res) {
      res.sendFile(__dirname + '/upload.html');
    });
    // 开始处理
    app.post('/upload.html', function (req, res) {
      var file = req.files.myFile;
      // 读取文件
      fs.readFile(file.path, function (err, data) {
        if (err) throw err; //读取文件失败
        fs.writeFile(file.name, data, function (err) {
          if (err) throw err; // 写入文件失败
          res.send('文件上传成功!');
        })
      })
    })
    app.listen(1234, 'localhost');
  • compress 压缩响应流数据

      // 在其他中间前调用才能保证全部数据流都压缩
    
  • cookieParser 处理 cookie

      var express = require('express');
      var app = express();
      // 使用 cookieParser 处理 cookie
      app.use(express.cookieParser());
      // 提前在 cookie.html 中埋下 cookie
      app.get('/cookie.html', function (req, res) {
          res.sendFile(__dirname + '/cookie.html');
      });
      app.post('/cookie.html', function (req, res) {
        var cookies = req.cookies;
        // 开始处理
        for (var key in cookies) {
          res.write('名:', key);
          res.write('值:', cookies[key]);
          res.write('</br>');
        }
        res.end();
      });
      app.listen(1234, 'localhost');        
    
  • csrf 防止跨站访问

      // 与 session 中间件 和 bodyParser 中间件配合使用
    
  • directory 列出某目录下的文件列表

      // app.use(express.directory(path, [options]))
      // 与 express.static 配合使用
      app.use(express.static(__dirname));
      app.use(express.directory(__dirname), {icons: true}); // 显示文件icon
      // 此时会列出文件目录,且点击静态文件(如js/css)可直接访问
    
  • errorHandler 捕获错误

  • limit 限制请求提交数据的字节数

      // 限制为 1M,超出则报错
      var size = 1024*1024; // 1M
      app.use(express.limit(size))
    
  • logger 输出日志到文件中

      // app.use(express.logger([options]))
      // options = {
      //    immediate: false, // 是否在接收到客户端请求时就输出日志,否则服务器端发送完响应数据才输出
      //    format: 'default', // 可选 default/short/tiny/dev,即输出日志的格式        //  stream: process.stdout, // 指定输出数据流的对象
      //     buffer: undefined, // 整数毫秒则指定缓存区有效时间啊暖,或为 true 时,使用缓存区且有效时间为 1000ms
      // }
      var express = require('express');
      var app = express();
      app.use(express.logger({
          format: 'default',
          stream: process.stdout
      }))
    
  • methodOverride 为 bodyParser 提供 HTTP 支持

  • reponseTime 在响应头添加 X-Request-Time 字段

      // 使用后可在 浏览器控制台查看到响应头多了一个 X-Request-Time 
      app.use(express.responseTime());
    
  • router 提供路由功能

      // express 3.x 隐式使用了 router 
    
  • session 提供session功能

      // session 加密过的数据保存在 cookie 中
      app.use(express.session([options]))
      options = {
          key: connect.sid, // 字符串,指定保存这个 session 的 cookie 名
          store: , // 保存 session 的第三方存储对象
          fingerprint: function () {}, // 一个自定义指纹生成函数
          cookie: {path: '/', httpOnly: true, maxAge: 14400000}, // 指定保存 session 的设置 cookie 的对象
          secret: 'xiaolai', // 字符串,用于 session 的数据加密(加盐)
      }
    
      // 使用这个中间件后,就有了 req.session 属性
      var express = require('express');
      var app = express();
      app.use(express.cookieParser());
      app.use(express.session({secret: 'xiaolai'}));
      app.get('/', function (req, res) {
          res.sendFile(__dianema + '/index.html');
          // 开始设置
          req.session.username = 'xiaolai';
          req.session.password = 'password';
    
          // 重新生成
          // req.session.regenerate(function (err) {});
    
          // 销毁
          // req.session.destroy(function (err) {});
      })
    
  • static 设置访问静态文件的功能

      // public 为存放静态文件的目录
      app.use(express.static('public'))
    
  • 自定义错误处理中间件

      app.use(function (err, req, res, next) {
          // 输出错误到服务端
          console.log(err.stack);
          next();
      })    
      app.use(function (err, req, res, next) {
          // 输出错误到客户端
          res.send(500, err.message);
      })    
    

阅读全文