检查 firebase 中的文档是否存在

时间:2021-01-12 23:17:50

标签: javascript firebase google-cloud-firestore discord.js

我正在编写一个 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
        })
    }

这是我的消息事件的开始,我希望它检查文档是否存在,如果不存在,则如上所示设置变量。问题是此代码似乎对每条消息都运行,并且会覆盖其自身 所以如果我尝试改变一些东西,它会重置下一条消息

2 个答案:

答案 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)

这里需要注意的几件事:

  1. getset 操作在 doc 上完成,在您的情况下为 guildInfo(您收到 TypeError: guildInfo.set is not a function 因为您试图在顶部执行 set 操作get 而应该在文档中)
  2. 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