【问题标题】:Database errors if specific guild doesn't exist如果特定公会不存在,则数据库错误
【发布时间】:2020-01-09 16:25:36
【问题描述】:

我的 discord 机器人上有每个公会的设置。但是,由于某种原因,如果公会不存在,则会出错。我的机器人所在的公会超过 150 个,而且这是最近才添加的。我不知道该怎么做才能让它工作......

如果数据为空,我尝试了不同的调用方法,但我总是收到错误并最终得到这段原始代码

client.updateGuild = async (guild, settings) => {
    let data = await client.getGuild(guild);

    if (typeof data !== 'object') data = {};
    for (const key in settings) {   
        if (data[key] !== settings[key]) data[key] = settings[key];
        else return;
    }

    console.log(`Guild "${data.guildName}" updated settings: ${Object.keys(settings)}`);
    return await data.updateOne(settings);
};

如果公会不存在,它应该为公会创建一个新条目并在有人运行配置命令时保存更新的配置设置

client.createGuild = async settings => {
        const defaults = Object.assign({ _id: mongoose.Types.ObjectId() }, client.config.defaultSettings);
        const merged = Object.assign(defaults, settings);

        const newGuild = await new Guild(merged);
        return newGuild.save()
            .then(console.log(`Default settings saved for guild "${merged.guildName}" (${merged.guildID})`));
    };

这是更新后添加到公会时运行的命令,但就像我说的那样有超过150个旧的;-;

【问题讨论】:

  • 您是否尝试添加 updateOne {upsert:true} 的选项?根据mongoose docs (mongoosejs.com/docs/api/model.html#model_Model.updateOne) 默认为false,如果不存在,它允许在数据库中创建新文档。
  • 不,我没有。我什至没有看到。我现在就试试!
  • (node:19704) UnhandledPromiseRejectionWarning: TypeError: data.updateOne is not a function
  • return await data.updateOne(settings, {upsert:true});
  • 我需要它来运行 client.createGuild 并使用该 ^^' 中的设置

标签: node.js mongodb discord.js


【解决方案1】:

如果我理解正确,问题就出在此处: return await data.updateOne(settings);

  1. data 应该是一个实际的 collection/model 并且根据 let data = await client.getGuild(guild); 它应该返回一个模型,但我 99% 确定它不是。好吧,我不明白 client.getGuild 做了什么,所以.. 这就是为什么我只确定 99% 的原因
  2. 问题的第二个向量在这里,settings 对象应该等于这些架构:{filter_field: value},{update_field: value},{upsert:true},因此:
... = await model_name.updateOne({filter: value},{update: field},{upsert:true}).exec(callback)

还有更多,如果你想:

如果没有数据库条目,我需要updateGuild 函数来运行createGuild 函数

我猜updateGuild 里面应该是这样的,没有createGuild 方法:

let result = await model_name.findOneAndUpdate(
            {
                fieldName: filterValue,
            },
            new Class(object),
            {
                upsert : true,
                new: true,
                setDefaultsOnInsert: true,
                runValidators: true,
                lean: true
            }
        ).exec();

在这种情况下,result 变量已经更新了文档数据,如果成功,一些值可以通过破坏性方法显示给机器人的用户。 或者直接触发await createGuild();,在updateGuild 中,如果允许的话,不需要向上的代码sn-p。

【讨论】:

  • 对不起!获取公会是client.getGuild = async guild => { const data = await Guild.findOne({ guildID: guild.id }); if (data) return data; else return client.config.defaultSettings; };
  • 就是这样。现在我可以从字面上确认第一个场景已经到位,因为如果您的数据库中没有guildgetGuild 会出现else 异常,其中data 变得不是猫鼬模型。这就是您在return await data.updateOne(settings); 字符串中收到错误的原因。老实说,我强烈建议你重写那部分代码,但我猜它是 class 的一部分 getter/setter 所以可能不是一个选项。
  • 我不确定如何在不重写整个代码的情况下重写该部分,但这确实解释了我遇到的其他一些问题!
  • 好吧,你没有足够的 SW 代表和我聊天,那么你的 discord.tag 是什么?或者你可能想给我写一条消息,我会解释一下。我的标签是AlexZeDim#2812,是的,我有一个默认的绿色头像。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 2016-11-19
  • 2019-07-28
  • 2013-05-08
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多