node express:路径总是可选的吗?

时间:2017-11-21 09:21:04

标签: node.js express

根据express的{​​{3}},path参数对于docs是可选的,因此要将中间件应用于任何传入请求,您可以编写:

app.use(function (req, res, next) {
  res.send('ANY request');
  next();
});

但对于app.usepath参数显然不是可选的,因此要将中间件应用于您必须编写的任何传入GET请求:

app.get('/', function (req, res, next) {
  res.send('GET request');
  next();
});

但我发现如果我错过了这条道路,它就不会抱怨:

app.get(function (req, res, next) {
  res.send('GET request');
  next();
});

那么,上面两个定义是等价的,还是第二个定义与第一个定义不同的东西?

我也不确定将/*指定为path之间的区别:

app.get('*', function (req, res, next) {
  res.send('GET request');
  next();
});

总而言之,app.get('/', fn)app.get('*', fn)app.get(fn)之间是否存在差异?

1 个答案:

答案 0 :(得分:1)

有些令人困惑的是,有两种叫做app.get的方法:

https://expressjs.com/en/4x/api.html#app.get

一个是与app.set相反,另一个是处理GET请求的那个。实际上JS只允许一个方法,所以内部Express会检查传递多少个参数来计算你的意思:

https://github.com/expressjs/express/blob/351396f971280ab79faddcf9782ea50f4e88358d/lib/application.js#L474

因此,虽然使用app.get(fn)可能不会抱怨,但它实际上不会作为路线工作,因为它会将其视为get的另一种形式。

app.get('*', ...)app.get('/', ...)之间的区别在于*将匹配任何路径,而/只会匹配确切路径/(仅此而已)。这与app.use不同,其中路径被视为“以...开头”。

您可能会发现我在此提供的答案有助于了解getuse之间路径的差异:Difference between app.use and app.get *in proxying*