关于获取 Request 返回数据的问题
发布于 10 年前 作者 Hamniba 9654 次浏览 最后一次编辑是 8 年前 来自 问答
# 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.

请问:

  1. 怎样正确获取到 getData 函数的返回值?
  2. 请解释下为什么 data 返回值为 undefined ?
  3. 这个问题涉及到 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,总想找方法避开。

回到顶部