在自定义中间件中使用Connect \ Express中间件

时间:2013-06-23 10:17:21

标签: node.js express connect

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

例如,我正在编写一些身份验证中间件,这显然非常依赖于Connect的cookieParser()session方法。这些方法是中间件,因此需要传递requestresponsenext个参数。显而易见的选择是在添加我的身份验证中间件之前,确保将它们添加到中间件堆栈中:

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。

1 个答案:

答案 0 :(得分:2)

我认为您的首次设置没有任何问题。它是相当明确的(您可以添加一条注释,指出my_auth_middleware()依赖于其他两个),因此对于任何查看代码的人来说都很明显。

你的第二个例子几乎隐藏了另外两个中间件被使用的事实。它们还将一些应用程序的配置(机密和cookie名称)移动到单独的文件中,这可能会令人困惑。我个人不喜欢传递app

FWIW,express.session也需要express.cookieParser才能工作,但是由程序员负责加载它。