在自定义中间件中使用流行的Connect中间件是否可行?
例如,我正在编写一些身份验证中间件,这显然非常依赖于Connect的cookieParser()
和session
方法。这些方法是中间件,因此需要传递request
,response
和next
个参数。显而易见的选择是在添加我的身份验证中间件之前,确保将它们添加到中间件堆栈中:
app.js:
app.use(express.cookieParser('secret'))
.use(express.session({ secret: 'keyboard cat', key: 'sid', cookie: { secure: true }}))
.use(my_auth_middleware())
但这看起来有点麻烦,因为我的中间件依赖前两种方法来处理req.session
的内容。
另一个明显的方法是将应用程序传递到我的中间件,然后调用其中的cookieParser()
和session
方法,但因为它们都是中间件我必须添加它们到堆栈,感觉不对:
my_auth_middleware.js:
module.exports = function(app){
app.use(express.cookieParser('secret'));
app.use(express.session({ secret: 'keyboard cat', key: 'sid', cookie: { secure: true }}));
return function(req, res, next){
// do stuff with req.session
next();
}
}
任何人都可以确认这是一种合乎逻辑的做事方式吗?是否存在将cookieParser()
和session
方法保留在我的中间件之外的争论?
显然我在这些示例中使用了Express,但我知道这些方法来自Connect。
答案 0 :(得分:2)
我认为您的首次设置没有任何问题。它是相当明确的(您可以添加一条注释,指出my_auth_middleware()
依赖于其他两个),因此对于任何查看代码的人来说都很明显。
你的第二个例子几乎隐藏了另外两个中间件被使用的事实。它们还将一些应用程序的配置(机密和cookie名称)移动到单独的文件中,这可能会令人困惑。我个人不喜欢传递app
。
FWIW,express.session
也需要express.cookieParser
才能工作,但是由程序员负责加载它。