Проблема узла JS с циклами for и foreach - PullRequest
0 голосов
/ 27 марта 2019

Это действительно озадачивает меня, пока 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 появляются, когда я консольный выход из цикла в режиме реального времени, консольный вход в цикл в режиме реального времени ничего не показывает, кроме последний блок кода, который я разместил, и это возвращает один результат.

Локальный компьютер - это windows, на котором работает Node v11.6, а в реальном времени - Ubuntu, на котором работает v11.12 узла.

Итак, подведем итог:

На работающем сервере эти вышеупомянутые циклы не работают, я могу вернуть массивы, когда консоль регистрирует данные вне циклов, но только на последнем из них отображаются какие-либо данные, когда консоль регистрируется внутри цикла.

На локальной машине все работает как положено. В обоих случаях отчеты о перехвате ошибок null, поэтому ошибок нет.

Ответы [ 2 ]

1 голос
/ 27 марта 2019
res.map((result) => {
 client.channels.get(result.forchannel).send({ embed });
});

Это может помочь вам.

0 голосов
/ 28 марта 2019

Я обнаружил, в чем проблема, хотя у моего бота есть и опция подписки, и опция отмены подписки, мой код не учитывает очевидное: администратор сервера раздора, удаляющий канал, затем оставляет строку в базе данных, которая при подаче в цикл возвращается в состояние false, поскольку канал больше не существует и останавливает автоматическую публикацию.

Рабочий код сначала проверяет, существует ли канал на самом деле, перед обработкой через массив.

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

client.channels.has проверяет, что канал существует, и потому что в операторе if будет продолжаться публикация только на тех каналах, которые возвращают true.

...