【问题标题】:Wildcard or regex node express mount path on middleware中间件上的通配符或正则表达式节点表示挂载路径
【发布时间】:2016-04-28 21:10:54
【问题描述】:

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

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

/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,它根本不会增加复杂性,但我只是好奇它是否可以用通配符或正则表达式解决这个问题:)

【问题讨论】:

  • 每个中间件都使用req, res, next 调用。所以如果你想使用另一个中间件就使用next,如果你只需要中间件就不要使用它。

标签: regex node.js express wildcard webhooks


【解决方案1】:
app.use(/auth/, authAuthentication);

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

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

【讨论】:

  • 嗨!谢谢您的回答! authAuthentication 确实返回具有所述参数的函数。感谢您链接的文档,我发现您必须使用 app.all():“有一个特殊的路由方法 app.all(),它不是从任何 HTTP 方法派生的。此方法用于加载中间件在所有请求方法的路径上起作用。”编辑:我将编辑您对 app.all 的回答并接受它。感谢您的宝贵时间!
【解决方案2】:

您可以使用通配符(至少在 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();
));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多