在一个函数内多次获取请求

我试图从两个url发送JSON到一个网页(我正在创build一个网页)。 当我发送一个请求,它完美的工作,但只要我添加另一个请求,它发送一个错误,说:“发送后无法设置标题:。

app.get("/service", function(req, res) { request("http://example.com", function(error, response, body) { if (!error && response.statusCode == 200) { var data = JSON.parse(body); res.render("example.ejs", { data: data }); } }) request("http://123.com", function(error, response, body) { if (!error && response.statusCode == 200) { var data = JSON.parse(body); res.render("example.ejs", { data: data }); } }) }); 

发生这个错误是因为你渲染example.ejs两次,这是不允许的。 我会告诉你两个方法来实现你的目标没有任何错误。

1)这是最好的做法。

 // Install request-promise package first using this command below: npm install request-promise; // then replace your code with this one below: app.get("/service", function(req, res) { var request = require('request-promise'); var data1; request("http://example.com") .then(function(data) { data1 = JSON.parse(data); return request("http://123.com"); }) .then(function(data) { data2 = JSON.parse(data); console.log('data1', data1, 'data2', data2); res.render("example.ejs", { data1: data1, data2: data2 }); }); }); 

第二种方法:

2)这种方法是不好的做法,避免使用内部callbackcallback,但无论如何,它的工作原理。

 app.get("/service", function(req, res) { request("http://example.com", function(error, response, body) { if (!error && response.statusCode == 200) { var data1 = JSON.parse(body); request("http://123.com", function(error, response, body) { if (!error && response.statusCode == 200) { var data2 = JSON.parse(body); console.log('data1', data1, 'data2', data2); res.render("example.ejs", { data1: data1, data2: data2 }); } }); } }); }); 

总结:我build议你用1种方法,阅读这篇关于承诺的文章: https : //strongloop.com/strongblog/promises-in-node-js-with-q-an-alternative-to-callbacks/并编写干净的代码。 我只是简单地解释一下promise是避免callback内部callback的工具。