关于获取 Request 返回数据的问题
# api.js
exports.getData = function(req, res) {
request({uri: 'api.example.com', headers: HEADERS}, function(error, response, body) {
if(!error && response.statusCode == 200) {
res.send(body); // body 是 JSON 数据.
}
else {
res.send(error);
}
});
};
# app.js
router.get('/xxx', function(req, res){
var data = api.getData(req, res);
//var data_obj = JSON.parse(data);
console.log(data);
});
在 app.js 里调用 getData 函数,此时 data 的返回值为 undefined!
试验方案二: 把它改为一般的函数调用形式,
# api.js
exports.getData = function() {
return request(..., function(){
return body;
});
};
# app.js
router.get('/xxx', function(req, res){
var data = api.getData();
//var data_obj = JSON.parse(data);
console.log(data);
});
此时的 data 返回值为 http 协议相关的信息,并不是我期望的 request 返回值 body.
请问:
- 怎样正确获取到 getData 函数的返回值?
- 请解释下为什么 data 返回值为 undefined ?
- 这个问题涉及到 JS 的哪个知识点?JS 回调函数机制? 望各位提点一下,我去查阅相关知识点。
谢谢。
6 回复
1.request是异步的,你这样写的话,getData方法里面的参数应该再加一个callback,才能拿到你想要的body吧。 2.你只是声明了data变量,getData并没有任何返回值啊,此时console.log是undefined的
恩,看一个callback的例子,道友就知道怎么写啦:D
@ruanyl 3Q,刚上手写 JS,多谢指教。
看了一下module介绍,api.getData().pipe(process.stdout)应该可以;
@ruanyl 在 getData 方法里加了一个 callback,成功获取到了 body 数据。 @ChopperLee2011 我看 request 文档里面介绍 pipe 这种写法是操作文件的吧?
@Hamniba 是stream,不等于操作文件,确实cb更适合,只是我不喜欢cb,总想找方法避开。