gpt4 book ai didi

javascript - Express 中间件、next 和 Promises

转载 作者:数据小太阳 更新时间:2023-10-29 04:43:45 25 4
gpt4 key购买 nike

有一个非常简单的带有处理程序的 Express 路由器:

router.get('/users/:userId/roles/:roleId', function(req, res, next){
const roleId = req.params.roleId;
res.rest.resource = UserModel.findOne({ _id: req.params.userId}).exec().then(function(usr) {
console.log(req.params.roleId); // => undefined
console.log(roleId); // => okay here
const result = usr.roles.find( role => String(role._id) === String(roleId));
return result;
});
next();
});

如其所见,在 promise 中访问 req.params.roleId 会返回 undefined。这仅适用于 next() 在 promise 的 then 之外调用的情况。

我接受异步和 promise ,并且理解 next() 将在 then 中的处理程序之前被调用。但是 req.params.roleId 发生了什么?为什么以及在哪里发生变异? next() 调用的中间件是否相同但变异了 req

注意:res.rest.resource 由稍后调用的中间件使用,以构建正确的 REST 式响应。

最佳答案

目前的代码在其执行过程中是不确定的。

Something 改变了 next() 处理程序中的 Angular 色 ID,因为 findOne() 需要一段时间才能最终分派(dispatch)到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(); // <-- only dispatch to next after we find the resource result
});
});

编辑:

我挖得更深了一点。请参阅这个小示例应用程序:

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

关于javascript - Express 中间件、next 和 Promises,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35297384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com