我正在使用request
模块向网址发出HTTP GET请求以获取JSON响应。
但是,我的功能并没有返回响应的正文。
有人可以帮帮我吗?
这是我的代码:
router.get('/:id', function(req, res) {
var body= getJson(req.params.id);
res.send(body);
});
这是我的getJson
功能:
function getJson(myid){
// Set the headers
var headers = {
'User-Agent': 'Super Agent/0.0.1',
'Content-Type': 'application/x-www-form-urlencoded'
}
// Configure the request
var options = {
url: 'http://www.XXXXXX.com/api/get_product.php',
method: 'GET',
headers: headers,
qs: {'id': myid}
}
// Start the request
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
return body;
}
else
console.log(error);
})
}
答案 0 :(得分:6)
res.send(body);
在getJson()函数返回之前调用。
您可以将回调传递给getJson:
getJson(req.params.id, function(data) {
res.json(data);
});
...并在getjson函数中:
function getJson(myid, callback){
// Set the headers
var headers = {
'User-Agent': 'Super Agent/0.0.1',
'Content-Type': 'application/x-www-form-urlencoded'
}
// Configure the request
var options = {
url: 'http://www.XXXXXX.com/api/get_product.php',
method: 'GET',
headers: headers,
qs: {'id': myid}
}
// Start the request
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
callback(body);
}
else
console.log(error);
})
}
或只是致电:
res.json(getJson(req.params.id));
答案 1 :(得分:2)
问题在于你正在做回报,期望路由器获得内容。
由于是异步回调,因此不起作用。您需要将代码重构为异步。
当您执行return body;
时,正在返回的函数是请求的回调,并且您不会将正文发送到路由器。
试试这个:
function getJson(myid, req, res) {
var headers, options;
// Set the headers
headers = {
'User-Agent': 'Super Agent/0.0.1',
'Content-Type': 'application/x-www-form-urlencoded'
}
// Configure the request
options = {
url: 'http://www.XXXXXX.com/api/get_product.php',
method: 'GET',
headers: headers,
qs: {'id': myid}
}
// Start the request
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
res.send(body);
} else {
console.log(error);
}
});
}
这台路由器:
router.get('/:id', function(req, res) {
getJson(req.params.id, req, res);
});
在这里,您将res
参数传递给getJson
函数,因此请求的回调将能够在能够执行时立即调用它。