我是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);
});
答案 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
});
}
})
})