当前位置: 首页 > 知识库问答 >
问题:

错误[ERR_HTTP_HEADERS_SENT]:无法删除发送到客户端的标头

严宏旷
2023-03-14

我正在执行简单的 API 提取,但收到以下错误:

UnhandledPromiseRejectionWarning:Error[ERR_HTTP_HEADERS_SENT]:无法在将标头发送到客户端后删除它们,我不确定发生这种情况的原因:

代码在下面,还提供了错误的打印屏幕。我不确定这是否与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;

到目前为止,我解决这个错误的方法是:

我使用了这个来源,它对错误类型的广泛解释解释了问题所在。然而,理解发生了什么是没有用的。

我还发现这很有用,这也很有用,但最后一个特别是一个缺失语句< code>return的代码错误。我的错误似乎与< code > type error:data is not iterable 有关,但这是不可能的,因为我提供的订阅工作正常。

我找到的最接近的帖子基本上是这样的:“有时这是由于nodejs的异步行为而发生的。”现在我看到这发生在我身上,但我不知道在这种情况下如何解决。

为了完整起见,错误日志也显示在下面的打印屏幕中:

我能做什么来处理这个错误?我做了很多研究,但我不确定如何处理< code>nodejs的异步行为。谢谢你为解决这个问题指出了正确的方向。

共有1个答案

黄伟
2023-03-14

您收到此错误是因为您正在调用res。多次发送()

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
    }
});
 类似资料: