Ошибка [ERR_HTTP_HEADERS_SENT]: невозможно удалить заголовки после их отправки клиенту - PullRequest
0 голосов
/ 31 марта 2020

Я выполняю простую выборку API, но получаю следующую ошибку:

UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot remove headers after they are sent to the client, и я не уверен, почему это происходит:

Код указан ниже, а также напечатан экран ошибки предоставляется. Я не уверен, может ли это быть проблемой, связанной с асинхронным поведением nodejs:

var express = require('express');
var router = express.Router();
var axios = require('axios');
const NodeCache = require('node-cache');
const myCache = new NodeCache();

let hitCount = 0;

/* GET home page. */
router.get('/', function(req, res, next) {
    res.render('index', { title: 'Express' });
});


router.get('/hello', async function(req, res, next) {
    const allData = myCache.get('allData');

    if (!allData) {
        hitCount++;
        console.log(`hit ${hitCount} number of times`);
        try {
            const { data } = await axios.get(
                'https://api.vesselfinder.com/vesselslist?userkey=KEY'
            );
            const [ metaData, ships ] = data;
            myCache.set('allData', data, 70);
            console.log(data + 'This is the data');
            res.send(data);
        } catch (error) {
            res.send(error);
            console.log(error);
        }
    }
    console.log('this is the data:', allData);
    res.send(allData);
});

module.exports = router;

Что я сделал до сих пор , чтобы решить эту проблему ошибка была:

Я использовал этот источник , который имеет широкое объяснение того, в чем может быть проблема, с широким объяснением типа ошибок. Однако было бесполезно понимать, что происходит.

Также я нашел это полезное , а также это , но этот последний, в частности, был ошибкой в ​​коде за недостающее утверждение return. Кажется, моя ошибка связана с TypeError: data is not iterable, но это невозможно, потому что моя подписка с предоставленной информацией работает идеально.

Ближайший пост, который я нашел, это этот , который в основном утверждает, что «Иногда это происходит из-за асинхронного поведения nodejs». Теперь я вижу, что это случилось со мной, но я не уверен, как это можно решить в этой ситуации.

Журнал ошибки также показан здесь на экране печати ниже для полноты:

error

Что я могу сделать, чтобы устранить эту ошибку? Я провел много исследований, и я не уверен, как позаботиться об асинхронном поведении nodejs. Спасибо за указание правильного направления для решения этой проблемы.

1 Ответ

2 голосов
/ 31 марта 2020

Вы получаете эту ошибку, потому что вы звоните res.send() несколько раз:

router.get('/hello', async function(req, res, next) {
    const allData = myCache.get('allData');

    if (!allData) {
        hitCount++;
        console.log(`hit ${hitCount} number of times`);
        try {
            const { data } = await axios.get(
                'https://api.vesselfinder.com/vesselslist?userkey=KEY'
            );
            const [ metaData, ships ] = data;
            myCache.set('allData', data, 70);
            console.log(data + 'This is the data');
            res.send(data); // <-- FIRST TIME
        } catch (error) {
            res.send(error);
            console.log(error);
        }
    }
    console.log('this is the data:', allData);
    res.send(allData); // <-- SECOND TIME
});

Вызов res.send() завершит ответ, поэтому вы не сможете вызвать его снова.

Вы можете перемотать второй вызов внутри условия else, чтобы убедиться, что вызывается только один:

router.get('/hello', async function(req, res, next) {
    const allData = myCache.get('allData');

    if (!allData) {
      // ...
    }
    else {
      console.log('this is the data:', allData);
      res.send(allData); // <-- SECOND TIME
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...