【发布时间】:2021-05-13 15:52:40
【问题描述】:
上下文:
我有一个在 discord.js 上运行的 discord 机器人,我最近创建了一个 MongoDB 数据库来存储一些我可以在未来某个时候使用的元素。 我想检索特定不和谐“公会”的所有成员并将它们放入单独的 MongoDB 文档中。
我的工作:
首先,我使用 :
获取这些成员const members = await testGuild.members.fetch();
这会返回一个“Discord.Collection”对象,它本质上是一个 Map 对象。
然后我使用 mongoose 连接到我的 MongoDB,并使用以下方法为成员集合的每个成员创建一个新文档:
await mongo().then(async mongoose => {
try {
members.each(async member => {
const {user} = member
await discordUserSchema.findOneAndUpdate({
_id: user.id
}, {
_id: user.id,
username: user.username,
discriminator: user.discriminator,
avatar: user.avatar,
bot: user.bot
}, {
upsert: true
});
});
} finally {
mongoose.connection.close();
}
});
我的问题是 finally 块在我的 try 块完成之前执行,我收到此错误:
(node:25008) UnhandledPromiseRejectionWarning: MongoError: server is closed
如果我删除 try/finally 块,我没有任何错误,并且文档已正确添加到我的集合中,但这不是正确的方法...
我还尝试在每个循环内部连接到我的数据库,但这很糟糕,因为它打开然后关闭我添加到集合中的每个成员的连接,最终,我收到超时错误。
我在这里错过了什么?为什么 finally 块会很快执行?那是因为我的循环中的异步函数吗?我该如何以不同的方式处理?
谢谢。
【问题讨论】:
-
尝试
await Promise.all(members.each(async ...等待,假设.each返回承诺数组......它可能不会。如果存在,您可能需要更像members.map的东西。无论如何,您需要以一种或另一种方式等待所有这些承诺。 -
@David784
await Promise.all在这种情况下无济于事。不是Array.prototype.map。 -
@David784 谢谢!你把我放在正确的轨道上,然后 AlexZeDim 给了我完整的答案!祝你有美好的一天!
标签: javascript node.js mongodb mongoose discord.js