节点 expressJwt 除非指定 id 路由

node expressJwt unless specify id route

我们正在使用 expressJwt 库,我希望能够排除以下路线 api/items/:idGET 但不包括任何看起来像 api/items/:id/special-action 的路线。

到目前为止,我只能排除所有具有 :id 的路由。

以下是我们如何排除具有 :idGET 路线。

this.app.use(expressJwt({ secret: secrets.JWT }).unless({
  path: [
    ...
    { url: /\/api\/items\/(.)/, methods: ['GET'] },
    ...
  ]
});

我试过 { url: /\/api\/items\/(.)\//, methods: ['GET'] } 但它与任何路由都不匹配,因此没有包含 :id 的路由被排除在外。

我使用正则表达式的方式有些不对劲,但我很难看清它。我是否需要将 (.) 更改为不完全匹配?我想它可能与尾部斜线匹配

您可以使用

/^\/api\/items\/([^\/]*)$/

[^\/]* 否定字符 class 匹配除 / 之外的 0 个或多个字符,并且 ^ / $ 锚点确保模式将是尝试对整个字符串。

参见regex demo

详情

  • ^ - 字符串锚点的开始
  • \/api\/items\/ - 匹配文字 /api/items/ 子串
  • ([^\/]*) - 捕获第 1 组:除 /.
  • 以外的任何 0+ 个字符
  • $ - 字符串锚点的结尾。 请注意,如果您想确保 [^\/]* 之后没有 /,请在末尾添加一个 $ 字符串锚点结尾。