中间件上的通配符或正则表达式节点表示安装路径

Wildcard or regex node express mount path on middleware

我想根据路径的外观定义不同的中间件。

问题是路径可能很谨慎;例如,我想支持以下路径:

/chat/auth/test
/chat/auth/add
/chrome/auth/test
/chrome/add

每次 auth 在路径中我都希望调用 auth 中间件,对于 chatchrome我要调用各自的中间件

app.js:

// Middleware authentication

var chatAuthenticate = require('./server/middleware/chat-authenticate');
app.use('/chat', chatAuthenticate(addon));

var authAuthentication = require('./server/middleware/auth-authenticate');
app.use('/auth', authAuthentication());

我知道我可以为每个可能的组合添加多个条目到 app.js,例如 /chat/auth 和 /chrome/auth,它根本不会增加复杂性,但我我只是好奇是否可以用通配符或正则表达式来解决这个问题:)

app.use(/auth/, authAuthentication);

这将为任何地方包含 auth 的每个请求调用 authAuthentication。需要考虑的几点:

  • 这是一个正则表达式,所以您只需要 /.../ 作为分隔符而不是引号
  • 请注意,如果您有多个中间件匹配一个路由(例如,另一个以 /chat/ 作为 RegEx,并且您调用 /auth/chat/chat/auth,则两个中间件都将被调用。因此,考虑 app.use() 调用的顺序很重要。
  • authAuthentication 需要 (request, response, next) 参数。如果您像示例中那样直接调用该函数,则该函数应 return 一个将采用三个快速中间件参数的函数。
  • 通常的做法是将所有 require 调用放在脚本的顶部
  • 确保您已完全阅读并理解 Express Routing。太棒了。

您可以使用通配符(至少在 express 4 中):

app.use('/chat/*', chatMiddleware);

首先将该中间件应用于任何以“/chat/”开头的请求。然后将下一个用于下一个级别,它只适用于'/chat/auth/*'...

app.use('/chat/auth/*', function(req, res, next) {
    //.... middleware logic here


    //.... assuming we don't reject the call, call next() when done
    next();
));