【问题标题】:Skip to else if property is undefined如果属性未定义,则跳至 else
【发布时间】:2019-07-06 07:39:43
【问题描述】:

我有创建团队并将数据放入数据库的功能。现在我正在尝试检查团队是否已经存在,如果确实存在,则回复消息。我的 if 语句有问题。

如果(结果[0].teamname == teamName)

当 result[0].teamname 未定义时,它会显示无法读取未定义的属性 'teamname',它会忽略 else 并引发错误。我怎样才能做到不忽略其他?

这是我用来创建团队的函数。

function createTeam(teamName, members, message) {
teamName = teamName.replace("_", " ");
let insertTeam = `INSERT INTO teams (teamname) VALUES ('${teamName}');`;

db.select(`SELECT id_t, teamname FROM teams WHERE teamname = '${teamName}'`, function(err, result) {
    if (err) {
        throw err;
    } else {
        if (result[0].teamname == teamName) {
            if (message.guild !== null) message.delete();

            message.reply("this team already exists!");
        } else {
            db.query(insertTeam);

            db.select(`SELECT id_t FROM teams WHERE teamname = '${teamName}'`, function(err, result) {
                if (err) {
                    throw err;
                } else {
                    for (let i = 0; i < members.length; i++) db.query(`INSERT INTO team_user (user, team) VALUES ('${members[i]}' , ${result[0].id_t})`);
                }
            });

            if (message.guild !== null) message.delete();

            let newTeam = new Discord.RichEmbed()
            .setThumbnail("https://cdn.discordapp.com/emojis/542789472421675028.png?v=1")
            .setColor("#15f153")
            .addField("New team has been created!", `Team ${teamName} has been created with total of ${members.length} members!\nGood luck!`);

            message.channel.send(newTeam);
        }
    }
});

到目前为止我尝试了什么:

  1. 检查 result[0].teamname 是否未定义
  2. 检查结果长度是否不为 0
  3. try-catch 语句

【问题讨论】:

  • 您的结果对象是否具有包含行数的属性?我认为您真的不需要从结果中检查团队名称,您已经在按团队名称进行查询。您只需要检查结果返回的行数是否 >= 1
  • if(result &amp;&amp; result[0] &amp;&amp; result[0].teamname &amp;&amp; result[0].teamname == teamName) 应该这样做。如果任何条件返回 false,它就会短路(而不是继续寻找可能不存在的对象的 teamname 属性)。

标签: javascript mysql node.js discord.js


【解决方案1】:

if (result[0] && result[0].teamname == teamName)

首先你需要检查 result[0] 是否未定义

【讨论】:

  • result = undefined 试试你的代码;)我确定你也忘了检查结果
  • 哦,好吧...我现在觉得自己很愚蠢。有帮助,非常感谢!
【解决方案2】:

您需要short-circuit 条件。这意味着您要先检查result 是否存在,然后再检查result 的属性

例如,您的代码应如下所示:

if (result && result[0] && result[0].teamname == teamName) {
    //Do something
}

【讨论】:

    【解决方案3】:

    如果结果是一个值以上的数组,那么你需要遍历它们中的每一个,你可以使用过滤数组方法:

    var found = result.filter((row) => row.teamname == teamName);
    
    if (found.length) {
    
    }
    

    您也可以像@ThomasKleßen 在评论中提到的那样检查结果是否未定义:

    var found = result && result.filter((row) => row.teamname == teamName).length;
    
    if (found) {
    
    }
    

    【讨论】:

      【解决方案4】:

      你总是可以做一个默认值

      if ((result || [{}])[0].teamname == teamName)
      

      如果结果是假的,它将默认为一个空对象的数组,这将允许数组访问和点表示法工作,但等于失败。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-10
        • 2021-03-20
        • 1970-01-01
        • 2021-01-24
        相关资源
        最近更新 更多