在定制中间件内使用Connect \ Express中间件

在自定义中间件中使用受欢迎的Connect中间件是否可行?

例如,我正在编写一些authentication中间件,这显然很大程度上依赖于Connect的cookieParser()session方法。 这些方法是中间件,所以它们需要传递requestresponsenext参数。 显而易见的select是在添加我的身份validation中间件之前,确保将其添加到中间件堆栈中,如下所示:

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。

我不认为你的第一个设置有什么问题。 这是相当明确的(你也许可以添加一个注释,说明my_auth_middleware()依赖于其他两个),因此,任何人都看你的代码很明显。

你的第二个例子几乎隐藏了其他两个中间件正在使用的事实。 他们还将您的一些应用程序的configuration(秘密和cookie名称)移动到一个单独的文件,这可能会造成混淆。 而且我个人不喜欢传递app

FWIW, express.session也需要express.cookieParser才能正常工作,但是它会让程序员加载它。