node.js如何处理回调中对象和变量的更改
node.js how to handle change of objects and variables in callbacks
我刚刚用node.js启动了一个大型项目,我偶然发现了一些回调噩梦般的问题。我以前做过一些node.js的开发,但只是基于教程的一些小东西。
我有一个用户模型和一个所有者模型,谁是该用户的所有者。。。基本上,我在node.js中构建的部分将是一个REST服务,因此我需要发送一个包含用户及其所有者名称的json。我的问题是试图像在ruby或php中那样获得所有者名称,并将其设置为属性。。但它不起作用。
人们如何在node.js中处理这种需要更改回调函数中对象的逻辑?我也不希望它影响性能。
我使用mysql作为数据库,因为这是一个要求。所以代码是这样的:
//find all
req.models.users.find({
'id' : req.query.id
}, function(err, users) {
if (err) console.log(err); //do something better here
else {
var json = [];
users.forEach(function(user) {
user.getOwner(function(err, owner) {
user.accountOwner = owner.name;
json.push(user;
});
});
res.type('application/json');
res.send(json);
}
});
我想发送这样的内容:[{"id":user.id,'username":user.username,"电子邮件":user.email,'owner':user.owner.name'},{…}]
问题是您没有理解节点代码的控制流。它不是按时间顺序从上到下逐行排列的。所以你的问题是res.send(json)
发生在user.getOwner
回调执行之前(及时),所以你发送空的json,然后在json数组发送后将其填充到json数组中。您需要使用类似async.each
的东西来执行联接,等待填充所有用户的所有者,然后发送响应。或者,您可以通过编写SQL联接来让数据库联接数据,而不是对数据库执行N+1查询。
相关文章:
- 如何在HTML中显示服务器对象变量
- 在Javascript中重新分配对象变量时,原始对象会发生什么
- Javascript 方法看不到对象变量
- JavaScript对象范围-在对象方法中使用对象变量
- 将对象(变量)传递给angularjs指令
- 对象变量在 JavaScript 中是不可访问的
- 无法访问公共JavaScript对象变量
- 可以't获取具有“t”的对象变量;这个“;由setTimeout()函数调用的对象函数中的属性
- Javascript:如何在回调中设置父对象变量
- 从方法内部设置对象变量
- 访问对象中的对象变量
- JavaScript 中的对象变量
- 从 json 代码中删除 javascript 对象变量名称文本
- 将变量传递到对象变量中
- JavaScript 如何重新识别事件对象变量
- 从对象变量中获取子节点
- 使对象变量在所有“更深”的范围内都是可访问的
- 从方法 JavaScript 访问对象变量
- 如何在 javascript 中保存对象变量的状态
- 无法访问IE和Mozilla中javascript的类对象变量