路由路径的括号

Parenthesis around route path

我在一个使用kraken和express的项目中找到了这段代码

module.exports = function (router) {
    router.get('(/)', .....);
    router.get('(/nfc/read)', .....);
}

我不明白为什么路由路径周围有括号。

它改变了什么吗?我在 express 和 kraken 的文档中找不到任何相关信息。 整个项目的其余部分,所有其他路线都是正常的,没有括号。

使用和不使用括号的区别在于,当您使用它们时,您将获得 req.params 中的路径。

例如本例中:

let app = require('express')();
app.get('/abc', (req, res) => {
    console.log(req.params[0]);
});
app.listen(3333, () => console.log('http://localhost:3333/'));

要打印的是undefined。但在这个例子中:

let app = require('express')();
app.get('(/abc)', (req, res) => {
    console.log(req.params[0]);
});
app.listen(3333, () => console.log('http://localhost:3333/'));

打印出来的是/abc.

括号多了,req.params中的元素就会多。例如这里:

let app = require('express')();
app.get('(/a)(bc)', (req, res) => {
    console.log(req.params[0]);
    console.log(req.params[1]);
});
app.listen(3333, () => console.log('http://localhost:3333/'));

将匹配相同的 /abc 路由,但打印的内容是:

/a
bc

那是因为路由被解析为正则表达式,括号是捕获组。参见:

注意req.params其实是一个对象,不是数组。这将 return false:

console.log(Array.isArray(req.params));

它只是一个对象,恰好有数字(实际上是 "0""1" 这样的字符串)作为它的键。