我在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);
};
如果公会不存在,则应为公会创建一个新条目并在有人运行config命令时保存更新的配置设置
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多个旧的;-;
答案 0 :(得分:0)
如果我理解正确,问题就出在这里:
return await data.updateOne(settings);
data
应该是实际的collection/model
,根据let data = await client.getGuild(guild);
,它应该返回一个模型,但是我99%的肯定不是。好吧,我看不到client.getGuild
的作用,所以..这就是为什么我只确定99%的原因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
变量更新了docs数据,如果成功,则可以通过破坏性方法将某些值显示给bot的用户。
或直接在await createGuild();
中触发updateGuild
,如果允许的话,也没有向上的代码段。