NodeJs和ExpressJs中间件依赖于正在使用的另一个中间件

时间:2016-11-30 14:37:25

标签: javascript node.js express cookies

我正在创建一个快速中间件。我的index.js exports是一个函数,它返回一个函数(req,res,next){...}

function myMiddleware (options) {
    //some stuff with options...
    return function middleware(req, res, next) {
        //stuff
    }
}

module.exports = myMiddleware;

因此用户可以开始使用我的中间件:

var express = require('express'),
    myMiddleware = require('my-middleware'),

    app = express();
    app.use(myMiddleware());

重要的是我必须确保中间件可以访问cookie。当然我可以自己解析 req.header.cookie 但是有一个cookie-parser模块可以为我解析。

所以我想确保在我的中间件启动时已经使用了cookie解析器中间件。我可能会指示用户首先使用cookieParser(),但我不喜欢它。

有没有办法轻松完成?

编辑

我甚至可以移植cookie-parser,因为它不是一个庞大的模块。但这可能是我做的最少的事情,因为它可以引入我通常不会做的大量维护工作。

2 个答案:

答案 0 :(得分:2)

在express中,中间件的执行顺序是由它附加到app / router的顺序定义的。

req.param是一个例外,因为它在匹配参数的任何路由处理程序之前执行。

声明路由和中间件函数的顺序是它们将被执行的顺序。我不知道有什么方法可以改变它,也许是摆弄快递路由器的内部,但是没有记录/干净的方法来实现这一点。

要确保您的中间件可以访问由cookie-parser解析的Cookie,请在任何路由定义之前附加解析中间件的Cookie。

        app.use(cookieParser());
        // all other middleware that uses cookies

答案 1 :(得分:1)

您有两种选择:

如果cookie-parser未定义,则强制req.cookies中间件。 如果已调用cookie-parser,则将忽略此调用。请参阅:https://github.com/expressjs/cookie-parser/blob/master/index.js

这种方法的缺点是cookieParser中间件只有默认选项。

var cookieParser = require('cookie-parser');

function myMiddleware(options) {
  return function(req, res, next) {
    return cookieParser()(req, res, function() {
      // Your middleware code
      return next();
    });
  }
}

如果req.cookies未定义

,请发出警告
function myMiddleware(options) {
  return function(req, res, next) {
    if(!req.cookies) {
      // Some warning
    }
    // Your middleware code
    return next();
  }
}