2014-11-21 65 views

回答

4

我用此程序进行了测试,改变了app.useapp.param的顺序,使用表达式4.10.2。该参数总是首先运行,这是有道理的,因为路由处理程序期望能够执行req.params.foo并且为了使param处理程序需要运行它。

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 
+1

控制台日志记录是异步的,所以为了完整性,在按时间排序时将时间戳记(Date.now()或process.hrtime())添加到console.log文件中会得到相同的结果。 – zamnuts 2014-11-21 04:44:09

+1

这并非完全正确。它是一个单一的流,输出保证以与传递给console.log()相同的顺序显示在控制台上。如果stdout的顺序不能保证,那么所有的混乱将随之而来,并且你不能可靠地将数据写入标准输出。上述情况良好,不存在误导标准输出的可能性。 – 2014-11-21 04:46:30

+1

哦,我的坏,我卡在分叉的孩子“模式”,其中写入控制台时不保证来自不同子进程的命令。 – zamnuts 2014-11-21 04:54:18

2

您可以通过日志记录对其进行测试,但我确信在4.0版本中,所有内容都是在您设置应用程序时声明的顺序调用的。

+1

这个答案从另一个答案不同。你所说的是合理的,但它看起来像app.params总是第一次在Express 4 – 2014-11-21 04:36:36

+0

好知道;文档说'使用'语句是有序的,并且在路由器上设置.param(然后'使用'),这不是直观的。 – Paul 2014-11-21 14:50:42