如何编写Express中间件

刚学Express 求指导

收藏 0分享浏览 2058
5年前
跟帖
老雷
5年前

在 Node.js Web 开发中,各种模块基本采用这样的中间件格式:

function (req, res, next) {
  // req 用于获取请求信息, ServerRequest 的实例
  // res 用于响应处理结果, ServerResponse 的实例
  // next() 函数用于将当前控制权转交给下一步处理,如果给 next() 传递一个参数时,表示出错信息
}

Express 是基于 Connect 的, Connect 中间件采用了以上的这种格式。 因此,当你要编写一个中间件时,编写一个以上格式的函数即可。

其实跟编写 Express 的路由处理函数是没多大区别的,一些细微的差别是:

  • 中间件一般不直接对客户端进行响应,而是对请求进行一些预处理,再传递下去;
  • 中间件一般会在路由处理之前执行;

比如:

// 检查用户是否登录中间件,所有需要登录权限的页面都使用此中间件
function checkLogin (req, res, next) {
  if (req.session.user) {
    next();
  } else {
    res.redirect('/');
  }
} 
沙发
羽音篠之
5年前

一般的中间件以及常用的处理手法

var x = function (req, res, next) {

    // Do Something to `req' or `res'

    // Pass to next middleware
    return next();

    // Error occurred and pass to error handler
    return next(err);

    // Intercept the request and make response directly without pass to next middleware
    return res.send(XXX);

    // Hook on `res.end' to perform some decoration on response
    var end_ = res.end;
    res.end = function (text) {
         // Do something to response data ...
         end_.bind(this)(arg1, arg2, ...);
    };

};

用于处理错误的中间件

var x = function (err, req, res, next) {

    // Do Something to `req' or `res'

    // Pass error to next error handler
    return next(err);

};

如何使用中间件(Express.js为例)

app.use(x);

这时所有请求都经过此中间件

app.get("/", x, function (req, res, next) { ... });

这时仅当 GET / 的时候经过此中间件(可以让中间件绑定到特殊请求)

PS:对 res.end 的 hook 纯属 YY …… 求大大来解释正确的打开姿势……

板凳
冯不通
5年前

express其实没有中间件,都是来自connect的中间件

中间件返回一个函数

举个栗子, 最简单的静态文件服务例子

module.exports = function(root, options) {
  options = options || {}
  return function(req, res, next) {
    var filepath = root + req.pathname;
    send(filepath, function(err) {
       if (err) next(err)
    });
  }
}

如果中间件只是处理一下比如cookie之类的,则在最后要加上next(),传给后面的控制器

文件位置是放在connect的middleware目录下

地板
yoke白板
5年前

了解了 谢谢各位大大的支持和解答

4 楼
说几句
广告位 点击查看投放指南

我的收藏