Как мне обработать UnhandledPromiseRejectionWarning в Node.JS - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть несколько методов, которые используют модуль request для получения изображений по URL-адресам и возвращает его как Promise, он работает, но когда изображение не найдено, он отклоняет обещание с кодом состояния 404. Я посмотрел на это предупреждение, и сказано, что для обработки отклонения вы должны настроить обратный вызов catch после then (), но я не использую then (), я использую async / await.

Это код для получения картинка:

/**
 * Returns picture from S3
 * @param {String} filename Name of the file with extension
 * @returns {String} Base64 string of the file
 */
getPictureFromS3: function (filename) {
    return new Promise((resolve, reject) => {
        let url = this.getURLFromS3(filename);
        request(url, (err, res, body) => {
            if (err) reject(err);
            if (res.statusCode !== 200) {
                reject(`Invalid status code <${res.statusCode}>`);
            }
            resolve(new Buffer.from(body).toString('base64'));
        });
    });
}

И вот как я называю метод:

try{
    socket.on('server get pictures', () => db.getPictures(data=>{
        if(data!==null){
            data.forEach(async e=>{
                let picture = await utils.getPictureFromS3(e.getFilename());
            });
        }
    }));
}catch(err){
    console.log(err);
}

Полное предупреждение:

(node:256) UnhandledPromiseRejectionWarning: Invalid status code <404>
(node:256) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which 
was not handled with .catch(). (rejection id: 1)
(node:256) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Использование узла v10.14.2.

1 Ответ

2 голосов
/ 19 февраля 2020

Здесь есть две проблемы

  • Вы пытаетесь выполнить асин c операцию внутри forEach, которая не работает с обещаниями. Вам нужно использовать for..of l oop или Promise.all, если вы можете делать что-то параллельно.

  • Исключением является повышение внутри слушателя, поэтому оно не будет пузыриться снаружи, поэтому Ваш улов не будет выполнен. Вы должны переместить свою попытку поймать внутри. Как то так

socket.on("server get pictures", () =>
  db.getPictures(data => {
    if (data !== null) {
      for(const e of data) {
        try {
          let picture = await utils.getPictureFromS3(e.getFilename());
        } catch (err) {
          console.log(err);
        }
      }
    }
  })
);

...