gpt4 book ai didi

Node.js:如何保证我们在异步编程中回复正确的请求?

转载 作者:太空宇宙 更新时间:2023-11-03 22:44:03 24 4
gpt4 key购买 nike

在所有 node.js 教程中,我都可以看到这种编码模式。

app.get('/user', function (req, res) {
User.findById(req.body.id, function(err, user) {
if (err) throw err;
res.send(user);
});
});

现在这行res.send(user)让我害怕。 User.findById异步,并且此 API 端点可能会同时命中,如何保证我们在该位置拥有正确的res我们回复req的时间。

到目前为止,我正在创建闭包来维护变量值。

app.get('/user', function (req, res) {
User.findById(req.body.id, function(res){
return function(err, user) {
if (err) throw err;
res.send(user);
}
}(res));
});

解决这个问题的最佳方法是什么?

最佳答案

您不需要为reqres添加闭包保护。它们已经被正确地限定为一个回调,并且不能与从其他请求运行的代码共享或访问。

app.get() 函数调用已经为 reqres 对象创建了一个闭包。因此,该回调中的任何代码或从该回调调用并传递这些参数的任何代码都保证获得正确的对象,无论任何地方正在进行多少异步编码。

app.get('/user', function (req, res) {

// This is already a unique closure right here with unique copies of
// the req and res arguments. These arguments cannot be accessed
// by any other request or by any code out of this scope
// unless you copy them yourself to some shared location
// with concurrency access issues

User.findById(req.body.id, function(err, user) {
if (err) throw err;
res.send(user);
});
});

唯一必须正确发生的另一件事是,node.js 永远不会将这些 reqres 对象重用于在该请求正在执行时可能发生的其他请求。异步处理。而且,它确实保证了这一点。 reqres 是为每个请求创建的。

此外,甚至没有一种方法可以从一个请求访问另一个请求的 reqres 除非您以某种方式不恰本地共享它(例如填充它)在共享模块级变量中)。因此,只要您仅直接从词法作用域中的回调使用 reqres ,或者将它们传递给您正在调用的函数,并且实际上没有任何代码将它们保存在存在并发访问问题的地方,那么就没有问题。

所以,总结一下。 Node.js 本身与 reqres 对象不存在任何并发问题。 因此,只要您不将 reqres 存储在某个存在来自您自己的代码的并发访问问题的共享位置,就会造成问题,这不是问题。

<小时/>

错误的代码示例

只是为了向您展示哪些错误代码会导致问题:

var _res;

app.get('/user', function (req, res) {
_res = res;
User.findById(_req.body.id, function(err, user) {
if (err) throw err;
_res.send(user);
});
});

app.get('/account', function (req, res) {
_res = res;
User.findById(req.body.account, function(err, account) {
if (err) throw err;
_res.send(account);
});
});

这里,代码将 res 分配给更高范围的共享变量,然后在异步调用后尝试使用它。这会很糟糕,并且会产生并发问题。但是,这不是 Node.js 本身的问题,而是不了解正确并发设计的错误代码的问题。而且,也没有理由将异步操作中使用的变量复制到更高的共享范围。如果需要在其他地方,则应将其作为参数传递,因为这将使其在每个请求中保持唯一。

<小时/>

这里有一些关于“Javascript 词法作用域”的阅读引用。

What You Should Know About Javascript Scope

MDN: Lexical Scope and Closures

You Don't Know JS: Scopes & Closures

Everything You Wanted to Know About Javascript Scope

关于Node.js:如何保证我们在异步编程中回复正确的请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36275571/

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