UnhandledPromiseRejectionWarning: необработанное отклонение обещания (идентификатор отклонения: #) Ошибка: 200 - PullRequest
0 голосов
/ 27 мая 2018

При выполнении моего запроса на выборку через iTunes store Извлечь список лучших фильмов в iTunes из https://itunes.apple.com/us/rss/topmovies/limit=20/json

const fetch = require('node-fetch');

module.exports = function (app) {
    //Get homepage
    app.get('/', async (req, res) => {
        const url = 'https://itunes.apple.com/us/rss/topmovies/limit=20/json';
        const movie = req.params.id
        const movieResult = await fetch(url);
        const statusCodeIs200Or300 = movieResult.ok;
        const movieError = movieResult.statusText;
        const movieJson = await movieResult.json();
        const movieToRender = movieJson.feed.entry;
        console.log(movieResult.ok);
        if (movieResult.status == 200) {
          res.render('home', { movies: movieToRender});
        }
        throw new Error(movieResult.status);
    });

    // Get route for each specific the movies
    app.get('/movie/:id', async (req, res) => {
        const url = 'https://itunes.apple.com/us/rss/topmovies/limit=20/json';
        const movie = req.params.id
        const movieResult = await fetch(url)
        const statusCodeIs200Or300 = movieResult.ok
        const movieError = movieResult.statusText
        const movieJson = await movieResult.json()
        const movieToRender = movieJson.feed.entry[movie]
        // if statetement
        if (movieResult.status == 200) {
          res.render('modal', { movie: movieToRender})
        }
        throw new Error(movieResult.status);
    });


}

UnhandledPromiseRejectionWarning: необработанное отклонение обещания (идентификатор отклонения: #) Ошибка: 200

, пожалуйста, помогите мне с этой ошибкой

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

В ответе Фади объясняется, как правильно обрабатывать исключения в обещании, но в вашем случае вам также нужно что-то возвращать из ваших функций, иначе это всегда выдаст ошибку:

app.get('/', async (req, res) => {
    const url = 'https://itunes.apple.com/us/rss/topmovies/limit=20/json';
    const movie = req.params.id
    const movieResult = await fetch(url);
    const statusCodeIs200Or300 = movieResult.ok;
    const movieError = movieResult.statusText;
    const movieJson = await movieResult.json();
    const movieToRender = movieJson.feed.entry;
    console.log(movieResult.ok);
    if (movieResult.status == 200) {
      // here you should return something to handle the case were all is good else the execution is going to continue and move onto to throw an exception. 
      return res.render('home', { movies: movieToRender});
     // this should do the trick and in case your rendering function return an error it would be propagated as well.
    }
    throw new Error(movieResult.status);
});

в сочетании с правильной обработкой ошибокэто даст что-то вроде:

app.get('/', async (req, res) => {
    const url = 'https://itunes.apple.com/us/rss/topmovies/limit=20/json';
    const movie = req.params.id
    try {
        const movieResult = await fetch(url);
        const statusCodeIs200Or300 = movieResult.ok;
        const movieError = movieResult.statusText;
        const movieJson = await movieResult.json();
        const movieToRender = movieJson.feed.entry;
        console.log(movieResult.ok);
        if (movieResult.status == 200) {
            return res.render('home', { movies: movieToRender});
        }
        throw new Error(movieResult.status);
    } catch (err) {
        // handle the error correctly here: e.g. use an error template
        res.status(500).send(error.message);
    }
});
0 голосов
/ 27 мая 2018

ошибка просто означает, что вы не обрабатываете часть отклонения в обычном обещании, есть часть .catch () , как показано ниже

new Promise(function(resolve, reject) {
  resolve('Success');
  //reject('err)
})
.then(function(value) {
console.log("everything ok")
})
.catch(function(e) {
  console.log(e); // "oh, no!"
})

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

try {
      await  await fetch(url)
    } catch (err) {
      //handle error 
    }

или, возможно, промежуточное программное обеспечение, подобное этому

const express = require('express');

const app = express();

app.get('/', safeHandler(handler));

app.listen(3000);

function safeHandler(handler) {
  return function(req, res) {
    handler(req, res).catch(error => res.status(500).send(error.message));
  };
}

async function handler(req, res) {
  await new Promise((resolve, reject) => reject(new Error('Hang!')));
  res.send('Hello, World!');
}

, более поздняя часть была взята этим источником решение безопасного обработчика

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...