在Node Js中For循环后返回响应?



我试图从我的数据库中获取用户,然后通过它们循环,并在响应每个用户的余额的外部服务器中获取每个用户的余额。我对响应进行过滤,并将需要的数据从响应中推送到一个数组中。最后,我应该发送这个数组到客户端。下面的代码将演示

app.get("/usersData", (req, res) => {
var data = [];
Users.find({}).then((users) => {
users.forEach((user) => {
var body = [];
var userObj = { userName: user.userName, assets: [] };
//Call external Server To get User assets amount
ExternalServer.GetAssetsOfUser(user.secretKey).then((assets) => {
var assetsArr = [];

//Loop through the assets and get the one with greater than 50 and check for the price
for (const asset in assets) {
if (asset.amount > 50) {
//Call the server again to get price assets
ExternalServer.GetPriceOfAsset(asset.name).then((price) => {
assetsArr.push({
name: asset.name,
value: +parseFloat(asset.amount).toFixed(4) * price,
});
});
}
}
});
//Add assetsArr to user Assets
userObj.assets = assetsArr;
body.push(userObj);
});
res.send(body);
});


})

当我调试代码时,我发现我总是在进入其余代码之前发送一个空数组的响应。我想在获得所有数据后发送响应

我可以看到一些问题:

  • users.forEach()循环中定义var body = [];
  • 你没有等待你的ExternalServer.GetPriceOfAsset()ExternalServer.GetAssetsOfUser()调用在终止res.send()之前解决他们的承诺。
  • 你没有处理任何错误,虽然我没有把任何东西放在下面的代码来解决这个问题。

我认为解决方案是沿着下面的路线,尽管我们当然不能自己运行这个来确定。

app.get("/usersData", (req, res) => {
Users.find({}).then(async (users) => {
// Move this outside of loop
const body = [];
// Using "for" iterator instead of improper async forEach
for ( let i = 0; i < users.length; i++ ) {
const user = users[i];
const userObj = { userName: user.userName, assets: [] };
//Call external Server To get User assets amount
const assets = await ExternalServer.GetAssetsOfUser(user.secretKey);
const assetsArr = [];
//Loop through the assets and get the one with greater than 50 and check for the price
for (const asset in assets) {
if (asset.amount > 50) {
//Call the server again to get price assets
const price = await ExternalServer.GetPriceOfAsset(asset.name);
assetsArr.push({
name: asset.name,
value: +parseFloat(asset.amount).toFixed(4) * price,
});
}
}
//Add assetsArr to user Assets
userObj.assets = assetsArr;
body.push(userObj);
});
res.send(body);
});
});

最新更新