首页 > 解决方案 > 无法使用 Node.js (ERR_HTTP_HEADERS_SENT) 获取 redis 键值对

问题描述

尝试使用 Node.js 从我的 localhost redis 客户端获取键值对。

  1. 如果我res.json()在函数/for 循环内部包含,我会收到多次发送响应的 HTTP_HEADER 错误。

  2. 如果我在函数/循环之外定义它,我会得到一个空数组。

错误:

_http_outgoing.js:485
    throw new ERR_HTTP_HEADERS_SENT('set');
    ^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

下面是代码app.js

router.get('/route1', function(req, res)
{ 
    var valarr=[];
    client.keys('*', function(err, keys) {
        console.log(keys);
        for(var i=0;i<keys.length;i++){
            client.get(keys[i], function (error, value) {
                if (err) return console.log(err);
                console.log(value);
                valarr.push(value);      
                // res.json({result1:keys, result2:valarr});
                //I get ERR_HTTP_HEADERS_SENT if res.json() is defined here
            });  
        }
        console.log(valarr); //Empty
        res.json({result1:keys, result2:valarr});
        //Returns an empty array (valarr)
    });
});

标签: javascriptnode.jsredishttp-headers

解决方案


你得到(ERR_HTTP_HEADERS_SENT),因为你没有检查值变量是否有值。只需使用 IF 添加条件来检查值变量。如果值将具有值,那么只有它会被添加到 valarr 数组中,并将发送更新的 valarr 数组作为响应。

解决方案 :

router.get('/route1', function(req, res)
{ 
    var valarr=[];
    client.keys('*', function(err, keys) {
        console.log(keys);
        for(var i=0;i<keys.length;i++){
            client.get(keys[i], function (error, value) {
                if (err) return console.log(err);

                if(value){
                  console.log(value);
                  valarr.push(value);      
                  res.json({result1:keys, result2:valarr});
                }
            });  
        }
        console.log(valarr); //Empty
        res.json({result1:keys, result2:valarr});
        //Returns an empty array (valarr)
    });
});

推荐阅读