Node JS Express как я могу отправить ошибку 404, если плохой запрос сделан к стороннему API? - PullRequest
0 голосов
/ 06 февраля 2020

На моем Node JS сервере у меня есть этот обработчик маршрута, который отправляет запрос стороннему API для получения имени пользователя:

app.get('/players/:player', apiLimiter, function(request, response) {

const player = request.params.player;
const api_url = `https://api.com/shards/steam/players?filter[playerNames]=${player}`;

var options = {
   method: "GET",
   observe: 'body',     
   };

   let apiRequest = https.request(api_url, options, function (res) {

    let data = "";

    res.on("data", chunk => {
        data += chunk;
    }) 

    res.on("end", () => { 

           let objectParsed =  JSON.parse(JSON.stringify(data)); 
           response.send(objectParsed);               
    }) 

  if(!player) {
  res.status(404).send("Not found.");
}


})
apiRequest.end();

}) 

Это прекрасно работает, чтобы получить существующего пользователя. Однако, если я добавлю поддельное имя пользователя на свою страницу / Players, эта страница все равно будет загружена со статусом 200 вместо получения ответа 404. Страница загружается и выглядит испорченной, потому что фактически не получает никаких данных из API.

Я чувствую, что это глупый вопрос. В своем исследовании я нашел, как обрабатывать ошибки, если это просто маршрут, а не если этот маршрут зависит от параметра пути, как в / Players /: player

Я нашел вопрос, который был похож на мой ( Как вызвать ошибку 404 в express. js? ), и я попытался использовать оператор If: if (!player){res.status(404).send("Not found."); }, но без кости Я использую это если утверждение в неправильном месте?

Как мне заставить мой сервер Node JS ответить 404, если пользователь из базы данных не существует?

1 Ответ

1 голос
/ 06 февраля 2020

Вы должны проверить результат вызова API и посмотреть, вернули ли вы верные данные и отправить туда 404. Я также добавил проверку, чтобы убедиться, что что-то было передано для имени игрока, и отправил обратно 400 (неверный запрос), если не указан ни один игрок:

app.get('/players/:player', apiLimiter, function(request, response) {

    const player = request.params.player;
    if (!player) {
        res.status(400).send("No player specified.");
        return;
    }

    const api_url = `https://api.com/shards/steam/players?filter[playerNames]=${player}`;

    var options = {
        method: "GET",
        observe: 'body',
    };

    let apiRequest = https.request(api_url, options, function(res) {

        let data = "";

        res.on("data", chunk => {
            data += chunk;
        })

        res.on("end", () => {

            let objectParsed = JSON.parse(data);
            // test objectParsed here
            if (!some condition in objectParsed) {
                res.status(404).send("No data for that player name.");
            } else {
                response.send(objectParsed);
            }
        });
    });
    apiRequest.end();
});

Кроме того, вы не хотите JSON.parse(JSON.stringify(data)) Вот. Ваши данные уже являются строкой. Просто сделайте JSON.parse(data).

FYI, если вы используете небольшую библиотеку HTTP-запросов, такую ​​как got(), этот код становится намного проще, так как он накапливает ответ и анализирует JSON для вас в одной строке кода, как в:

let data = await got(options).json()
...