for和foreach循环的JS节点问题

时间:2019-03-27 10:56:22

标签: javascript mysql node.js foreach console.log

这真让我感到困惑,直到4天前,一切都正常,没有出现任何问题,但是当我的两个cron守护程序作业停止工作时,问题就开始了。

我什么也没想到,因此决定重新构建代码并对其进行一些改进,因为自从第一次对文件进行编码以来,我就获得了更多的见识。

问题出在这里

这在本地计算机上按预期工作

Object.keys(res).forEach(function(key) {
    const row = res[key];
      client.channels.get(row.forchannel).send({ embed });
      console.log(row.forchannel);
});

这也是如此:

res.forEach(function(row) {
      client.channels.get(row.forchannel).send({ embed });
      console.log(row.forchannel);
});

还有这个:

for (let i = 0; i < res.length; i++) {
     console.log(res[i]);
     client.channels.get(res[i].forchannel).send({ embed });
}

我遇到的问题是,当我上载到实时服务器时,它们中的任何一个都不起作用,当我在实时控制台中退出循环时,MySQL查询的结果就存在了,在实时循环中进行控制台日志记录时除了没有显示任何内容我发布的最后一块代码,它返回一个结果。

本地计算机是运行Node v11.6的Windows,而live是运行v11.12节点的Ubuntu。

总结一下:

在实时服务器上,上述那些循环不起作用,当控制台在循环外记录数据时,我可以返回数组,但在控制台中循环内的控制台记录数据时,只有最后一个可以显示任何数据。

在本地计算机上,一切正常,在两种情况下,错误捕获报告null都没有错误。

2 个答案:

答案 0 :(得分:1)

res.map((result) => {
 client.channels.get(result.forchannel).send({ embed });
});

这可能会对您有所帮助。

答案 1 :(得分:0)

我发现了问题所在,尽管我的机器人同时具有订阅和取消订阅选项,但我的代码却无法满足以下要求:不协调的服务器管理员删除了一个频道,这随后在数据库中留下了一行,当馈入该行时由于该频道已不存在,该循环返回false并停止自动发布。

工作代码首先检查通道是否确实存在,然后再处理数组。

res.map((result) => {
    if (client.channels.has(result.forchannel)) {
         client.channels.get(result.forchannel).send({ embed });
    }
});

client.channels.has检查该频道是否存在,因为它在if语句中将仅继续发布在返回true的频道上。