错误:在循环多次请求中发送标头后无法设置标头

时间:2018-05-29 03:29:35

标签: node.js express

我是nodejs的初学者,当我在循环中请求多个url然后我渲染它时遇到了问题。

错误:发送后无法设置标头。

at validateHeader (_http_outgoing.js:491:11)

at ServerResponse.setHeader (_http_outgoing.js:498:)


router.get('/', function(req, res, next) {
  setInterval(function(){

             request(url1,function (error,response,body) {
                 var data1 = JSON.parse(body);

                 request(url2+data1.access_token,function (error,response,body) {
                 var data_info = JSON.parse(body);

                                   //error when it render
                               res.render('index', {data_info : data_info});
                            })
                        })
          },5000);
});

2 个答案:

答案 0 :(得分:1)

这不完全是一个循环,我理解你的意思是你用setInterval()重复调用同一个函数。

一旦您使用res.render()发送了第一个响应,该响应完成了该请求的响应过程,则后续尝试使用该res对象失败。

如果您想以5秒的间隔向客户端发送数据,您可能应该查看websockets或将setInterval()调用传递给客户端,以便每隔5秒轮询您的服务器,其中如果您的服务器代码可以更改为:

router.get('/', (req, res) => {
  request(url1, (error, response, body) => {
    const data1 = JSON.parse(body);
    request(`${url2}${data1.access_token}`, (error, response, body) => {
      const data_info = JSON.parse(body);
      res.render('index', { data_info });
    });
  });
});

答案 1 :(得分:0)

您可以使用Async Module

const async = require('async');
router.get('/', function (req, res, next) {
   async.waterfall([
       function(callback) {
           request(url1, function (error,response,body) {
               if(err) {
                   callback(err)
               }else {
                    var data1 = JSON.parse(body);
                    callback(data1)
               }

           }) 
       },
       function(data1, callback) {
           request(url2+data1.access_token, function(error,response,body) {
                if(err) {
                   callback(err)
               }else {
                   var data_info = JSON.parse(body);
                    callback(null, data_info)
               }
           }) 
       }
   ], function(err, result) {
       if(err) {
           res.json({success: false, error: err, message: "Something went wrong.!"})
       }else {
            res.render('index', {
                data_info : result
            });
       }
   })
})