gpt4 book ai didi

javascript - 在 forEach 循环 javascript 中创建对象时出现问题

转载 作者:行者123 更新时间:2023-12-02 22:06:20 25 4
gpt4 key购买 nike

我一直在尝试使用从 MongoDB 数据库提取的数据创建一个 JSON 对象。

最后一行res.status(200).json(userData)似乎在之前返回了响应 数据处理结束,所以我得到一个没有处理数据的空对象作为响应。关于如何解决这个问题有什么想法吗?

             // chats are defined before, but excluded here to make a code easier to read
let userData = {};
chats.forEach(function(chat){
let chatId = chat.id;
let userIds = chat['userIds'];
UserAccountingData.find({userId: {$in : userIds}}, function(err, userAccountingData){
if(err){
console.log(err);
res.status(404).json('User data not found.');
return;
} else {
userAccountingData.forEach(function(data){
console.log({
imageUrl: data.imageUrl,
firstName: data.firstName,
lastName: data.lastName
});
userData[data.userId] = {
imageUrl: data.imageUrl,
firstName: data.firstName,
lastName: data.lastName
};
});
}
});
});
res.status(200).json(userData);

Console.log显示有数据来自数据库:

{ imageUrl: 'www.test.de', firstName: 'Fender', lastName: 'Fen' }
{ imageUrl: 'www.test.de', firstName: 'Baveler', lastName: 'Bav' }

感谢您的宝贵时间

最佳答案

这是因为 UserAccountingData.find 异步运行。所以我们需要在这段代码中添加 async/await 逻辑。

首先,定义查找函数。

const findUserAccountingData = (userIds) => new Promise((resolve, reject) => {
UserAccountingData.find({ userId: { $in: userIds } }, function (err, userAccountingData) {
if (err) {
return reject(err);
}

resolve(userAccountingData)
})
});

接下来,修改原始代码,如下所示。

let userData = {};
try {
for (let chat of chats) {
let chatId = chat.id;
let userIds = chat['userIds'];
const userAccountingData = await findUserAccountingData(userIds)
userAccountingData.forEach(function (data) {
console.log({
imageUrl: data.imageUrl,
firstName: data.firstName,
lastName: data.lastName
});
userData[data.userId] = {
imageUrl: data.imageUrl,
firstName: data.firstName,
lastName: data.lastName
};
});
}
} catch (error) {
console.log(error);
// res.status(404).json('User data not found.'); // error doesn't occur when user data not exists.
res.status(500).json(JSON.stringify(error));
}
res.status(200).json(userData);

最后,您需要将调用函数标记为异步。

关于javascript - 在 forEach 循环 javascript 中创建对象时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59704847/

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