我正在我的网站内进行聊天。为了存储数据,我使用聊天、用户、消息集合。
我希望结果在数组中包含:
[{
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/