Node.js Express中间件:app.param与app.use的区别

5
在Express中间件的调用链中,app.param方法总是在app.use之前被调用吗?
2个回答

5

我用这个程序测试了在express 4.10.2中更改app.useapp.param顺序的情况。参数总是先运行,这是有道理的,因为路由处理程序希望能够进行req.params.foo操作,为了使其工作,参数处理程序需要先运行。

var express = require('express');
var app = express();

app.use("/:file", function (req, res) {
  console.log("@bug route", req.params.file);
  res.send();
});

app.param("file", function (req, res, next, val) {
  console.log("@bug param", val);
  next();
});



app.listen(3003);

运行此命令并使用 curl localhost:3003/foo 进行测试,您将得到以下输出:

@bug param foo
@bug route foo

2
控制台日志记录是异步的,因此为了完整起见,在console.log中添加时间戳(Date.now()process.hrtime())在按时间排序时会产生相同的结果。 - zamnuts
1
这并不完全正确。它是单个流,输出保证按照传递给console.log()的顺序出现在控制台上。如果stdout的顺序不能保证,那么各种混乱就会发生,您将无法可靠地向stdout写入数据。以上内容很好,没有误导stdout的可能性。 - Peter Lyons
1
抱歉,我被卡在分叉子进程“模式”中了,在向控制台写入时无法保证来自不同子进程的顺序。 - zamnuts
很好知道;文档建议相反,所以这是一个不错的“坑点”。 - Paul

2

您可以通过日志记录来测试它,但我相当确定在4.0中,当您设置应用程序时,所有内容都按照声明的顺序调用。


1
这个答案与另一个答案不同。你说的很有道理,但在Express 4中,似乎app.params总是先运行。 - Alexander Mills
好了解;文档中说 'use' 语句是有顺序的,而使用 .param 设置路由器(然后被 'use')并不直观。 - Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接