代码执行存在一定的不确定性。
某些东西会在next()
处理程序中改变角色ID,由于findOne()
最终调度到then
处理程序需要一些时间,因此该变异已经发生。
如果不了解您的应用程序的更多详细信息,那么看起来这可能是正确的实现方法。
router.get('/users/:userId/roles/:roleId', function(req, res, next) {
const roleId = req.params.roleId;
UserModel.findOne({ _id: req.params.userId}).exec().then((usr) => {
const result = usr.roles.find(role => String(role._id) === String(roleId));
res.rest.resource = result;
next();
});
});
编辑:
我深入了解了一下。看看这个小例子应用程序:
var express = require('express');
var app = express();
app.use(function (req, res, next) {
var v = 0 | +new Date();
console.log("middleware 1 setting foos to ", v);
req.params.foo = v;
req.foo = v;
next();
});
app.use(function (req, res, next) {
console.log("middleware 2 reading foos and starting timer:", req.params.foo, req.foo);
setTimeout(function() {
console.log("middleware 2: foos are now", req.params.foo, req.foo);
}, 1000);
next();
});
app.get("/", function(req, res) {
res.send("params = " + JSON.stringify(req.params) + " and foo = " + req.foo);
});
app.listen(3000);
请求的输出结果为
middleware 1 setting foos to -902674369
middleware 2 reading foos and starting timer: undefined -902674369
middleware 2: foos are now undefined -902674369
middleware 1 setting foos to -902673113
middleware 2 reading foos and starting timer: undefined -902673113
middleware 2: foos are now undefined -902673113
浏览器输出为params = {} and foo = -902673113
,因此得出结论您不允许触及req.params
,但您可以向req
对象添加任何其他属性,它们将正常传递。
这似乎是由于路由匹配层在每个步骤上重写params
导致的。
next()
放在Promise链中的finally()
里面?这样可以保证next()
调用总是被执行。 - petebnext()
与设置res.rest.resource
结合到 Promise 中似乎是个不错的主意,谢谢。 - Alex Povarnext()
到底是做什么的吗?看起来一旦在当前中间件中调用了next()
,所有可用于该中间件的数据都会变得不安全、可变和不可访问。 - Alex Povarnext()
只是将控制权转交给链中的下一个中间件或处理程序... 但是可以看一下我添加的示例 :) - AKX