在定制中间件内使用Connect \ Express中间件
在自定义中间件中使用受欢迎的Connect中间件是否可行?
例如,我正在编写一些authentication中间件,这显然很大程度上依赖于Connect的cookieParser()
和session
方法。 这些方法是中间件,所以它们需要传递request
, response
和next
参数。 显而易见的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
才能正常工作,但是它会让程序员加载它。