gpt4 book ai didi

javascript - 如何使用 promise 和循环 mongoose 集合

转载 作者:行者123 更新时间:2023-11-30 19:32:47 28 4
gpt4 key购买 nike

我正在我的网站内进行聊天。为了存储数据,我使用聊天、用户、消息集合。

我希望结果在数组中包含:

[{
username (another one, not me)
last update
last message
}]

在聊天模型中,我只有 chatid两个成员的数组,所以我需要循环访问 User 集合以获取 user name 使用用户 id 来自它。我想在数组中保存所有名称(将来我还想遍历消息以获取每个 chatid 的最新消息)。问题是当我返回 chatsList 时它是空的。我想我需要以某种方式使用 Promise,但我不完全确定它应该如何工作。

Chat.find({ members: userId })
.then(chats => {
let chatsList = [];
chats.forEach((chat, i) => {
let guestId = chat.members[1 - chat.members.indexOf(userId)];
User.findOne({ _id: guestId })
.then(guest => {
let chatObj = {};
name = guest.name;
chatsList.push(name);
console.log("chatsList", chatsList)
})
.catch(err => console.log("guest err =>", err))
})
return res.json(chatsList)
})
.catch(err => {
errors.books = "There are no chats for this user";
res.status(400).json(errors);
})

最佳答案

确实,Promise.all是你要找的:

Chat.find({ members: userId })
.then(chats => {
let userPromises = [];
chats.forEach((chat, i) => {
let guestId = chat.members[1 - chat.members.indexOf(userId)];
userPromises.push(User.findOne({ _id: guestId }));
});
return Promise.all(userPromises).then(guests => {
let chatsList = [];
guests.forEach(guest => {
chatsList.push(guest.name);
});
return res.json(chatsList);
});
});
});

尽管使用 ID 列表($in 查询)对 DB 进行一次调用可能会更好。像这样:

Chat.find({ members: userId })
.then(chats => {
let ids = [];
chats.forEach((chat, i) => {
let guestId = chat.members[1 - chat.members.indexOf(userId)];
ids.push(guestId);
});
return User.find({_id: {$in: ids}}).then(guests => {
let chatsList = [];
guests.forEach(guest => {
chatsList.push(guest.name);
});
return res.json(chatsList);
});
});
});

您可能还想验证每个 id 是否都有对应的 guest

关于javascript - 如何使用 promise 和循环 mongoose 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56259178/

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