我正在编写一个 discord.js bot,我想使用 firestore 作为数据库
client.on('message', async message => {
if (message.author.bot || message.guild === null) return;
let guildInfo = firestore.doc(`servers/${message.guild.id}`)
if (!guildInfo.exist) {
guildInfo.set({
prefix: "!",
logsOn: false,
logsID: 0,
welcomeOn: false,
welcomeID: 0,
welcomeMessage: "",
wordFilterOn: false
})
}
这是我的消息事件的开始,我希望它检查文档是否存在,如果不存在,则如上所示设置变量。问题是此代码似乎对每条消息都运行,并且会覆盖其自身 所以如果我尝试改变一些东西,它会重置下一条消息
答案 0 :(得分:1)
如果您阅读 reading a document 上的 Firestore 文档,您会发现您需要调用 get()
才能从数据库中实际读取文档。有了这些知识,代码就会变成这样:
let guildInfo = await firestore.doc(`servers/${message.guild.id}`).get()
if (!guildInfo.exist) {
...
如果您的环境不支持 async
/await
,则等效为:
firestore.doc(`servers/${message.guild.id}`).get().then((guildInfo) => {
if (!guildInfo.exist) {
...
答案 1 :(得分:0)
这里需要注意的几件事:
get
和 set
操作在 doc 上完成,在您的情况下为 guildInfo
(您收到 TypeError: guildInfo.set is not a function
因为您试图在顶部执行 set
操作get
而应该在文档中)exists
对你得到的对象执行。代码应该是(在async
/await
的支持下)
let guildInfo = firestore.doc(`servers/${message.guild.id}`);
let guildDoc = await guildInfo.get();
if (!guildDoc.exists) {
guildInfo.set( {} // your message here
);
}
在没有 async
/await
支持的情况下,@frank-van-puffelen 解决方案应该可行,除非您可能需要将 !guildDoc.exist
更改为 !guildDoc.exists
。>