我有一个与布尔值相关的 Mongoose 错误

Posted

技术标签:

【中文标题】我有一个与布尔值相关的 Mongoose 错误【英文标题】:I have A Mongoose Error Related To Booleans 【发布时间】:2021-02-09 08:28:20 【问题描述】:

我正在制作一个不和谐的机器人并使用 mongodb,我有一个 bool 值,但是每当我运行经济命令时,该 bool 值都会从 false 设置为 true。我不希望它被设置为真,但我知道是什么导致它为真。这是我的代码。

const  MessageEmbed  = require('discord.js');
const colors = require('../../colors.json');
const user = require('../../models/user');
const User = require('../../models/user');
const mongoose = require('mongoose');
const ms = require('parse-ms');

module.exports = 
 name: 'beg',
 description:
  'This command can only be used once every 5 hours and gives you $50.',
 category: 'economy',
 usage: 'beg',
 aliases: [],
 run: async (client, message, args) => 
  let reward = 50;
  let timeout = 18000000;

  const S = new MessageEmbed();
  S.setAuthor(message.author.username);
  S.setColor(colors.green);
  S.setDescription(`Here, take $$reward!`);
  S.setFooter(
   message.author.username,
   message.author.displayAvatarURL( dynamic: true, size: 512 )
  );
  S.setThumbnail(client.user.displayAvatarURL());
  S.setTimestamp();
  S.setTitle('Beg!');

  User.findOne(
   
    userID: message.author.id,
   ,
   async (err, user) => 
    if (err) console.error(err);
    if (!user) 
     const newUser = new User(
      _id: mongoose.Types.ObjectId(),
      userID: message.author.id,
      username: message.author.username,
      lb: 'all',
      money: 0,
      deposited: 0,
      iq: 0,
      job: 'None',
      daily: 0,
      beg: 0,
      work: 0,
      aq: 0,
      counteraq: 0,
      counterw: 0,
      reputation: 0,
      banked: 0,
      badge: 0,
      charm: 0,
      ring: 0,
      necklace: 0,
      penguin: 'None',
      fish: 0,
      melon: 0,
      orange: 0,
      meat: 0,
      chocolate: 0,
      neckact: false,
      charmact: false,
      badgeact: false,
      ringact: false,
      muteCount: 0,
      warnCount: 0,
      kickCount: 0,
      banCount: 0,
     );
     newUser
      .save()
      .then((result) => console.log(result))
      .catch((err) => console.error(err));
     const sentBeg = await message.channel.send( embed: S );
     else 
     if (timeout - (Date.now() - user.beg) > 0) 
      let cdt = ms(timeout - (Date.now() - user.beg));

      const cd = new MessageEmbed();
      cd.setAuthor(message.author.username);
      cd.setColor(colors.red);
      cd.setDescription(
       `Please stop begging! It's quite selfish! Please wait at least: $cdt.hoursh, $cdt.minutesm and $cdt.secondss.`
      );
      cd.setFooter(
       message.author.username,
       message.author.displayAvatarURL( dynamic: true, size: 512 )
      );
      cd.setThumbnail(client.user.displayAvatarURL());
      cd.setTimestamp();
      cd.setTitle('Stop Begging!');
      const sentCD = await message.channel.send( embed: cd );
      else 
      if ((user.ringact = true)) 
       user.beg /= timeout;
       user.money += reward;
       user.save().catch((err) => console.error(err));
       message.channel.send(S);
       else if ((user.ringact = false)) 
       user.money += reward;
       user.beg = Date.now();
       user.save().catch((err) => console.error(err));
       message.channel.send(S);
      
     
    
   
  );
 ,
;

【问题讨论】:

【参考方案1】:

这个问题有一个非常简单的解决方法。您已经错误地定义了 if 语句。要检查一个值是否等于另一个值,您可以使用bar == foobar === foo(这两种方法之间的区别can be found here)。

但是,您在 if 语句中使用单个等号,用于为变量赋值。以下是修复代码的方法:

更改以下行:

if (user.ringact = true) 
  //...
 else if (user.ringact = false) 
  //...

到这里:

if (user.ringact === true) 
  //...
 else if (user.ringact === false) 
  //...


作为一个小奖励,该代码可以缩短为以下内容:

if (user.ringact) 
  //...
 else 
  //...

或者如果你想进一步缩短整个代码部分,你可以使用这个(它利用了ternary operator):

if (timeout - (Date.now() - user.beg) > 0) 
  //...
 else 
  user.beg = user.ringact ? user.beg / timeout : Date.now();
  user.money += reward;
  user.save().catch(err => console.error(err));
  message.channel.send(S);

【讨论】:

以上是关于我有一个与布尔值相关的 Mongoose 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Node + Express + Mongoose 中的单选按钮传递布尔值?

伊斯坦布尔封面报告对于使用 mocha 进行测试是错误的(使用 Mongoose)

使用 jquery 访问设置为 attr 的 Mongoose 模式键(布尔值),但它返回未定义

ByRef 参数类型与布尔值不匹配

React JS Typescript usestate 与布尔值

AAPT:错误:“TODO”与导出的属性 (attr) 布尔值不兼容 [重复]