我正在创建一个快速中间件。我的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,因为它不是一个庞大的模块。但这可能是我做的最少的事情,因为它可以引入我通常不会做的大量维护工作。
答案 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();
}
}