我无法使用Node.JS从HTTP GET请求返回JSON。
通过示例和文档阅读,这是我提出的:
var http = require('http');
var options = {
host: 'some.host.com',
path: '/some/path'
};
var callback = function(response) {
var raw = '';
response.on('data', function(d) {
raw += d;
});
response.on('end', function() {
var data = JSON.parse(raw);
});
return data;
};
http.request(options, callback).end()
我还尝试从data
范围内返回response.on
而没有任何运气。请注意,使用CURL,我可以毫无问题地获取数据。
我做错了什么以及如何修复上述代码以获取JSON?
答案 0 :(得分:2)
您永远不会从回调中返回值。
如果在回调中获得值,则需要使用另一个回调来提取值或在现场使用它:您无法返回它。问题永远是"好吧,现在我有这些数据,我想用它做什么?"答案"归还"是不可接受的。
例如,这应该有效:
var http = require('http');
var options = {
host: 'some.host.com',
path: '/some/path'
};
var useData = function(data) {
// do something
}
var callback = function(response) {
var raw = '';
response.on('data', function(d) {
raw += d;
});
response.on('end', function() {
var data = JSON.parse(raw);
useData(data);
});
};
http.request(options, callback).end()
(另外,不是您的主要问题,但您有两个名为data
的变量:var data
行中的一个本地行,return
行中的另一个全局变量。)
修改强>
我很困惑为什么我不能"返回"来自回调的值。 Don函数有返回值/变量,还是计算值?
他们这样做,但为时已晚。比喻时间。
<强>同步强>
玛莎告诉约翰接听电话,然后耐心地等待谈话结束。然后她问他是谁以及他们想要什么。约翰说他们的邻居正在要一杯糖。她告诉他去给邻居一杯糖。然后,她出去见她的朋友。var reply = john.answerPhone();
var action = reply.figureOutResponse();
john.tellToDo(action);
错误的异步:
玛莎告诉约翰接电话,告诉她这是什么,然后出去见她的朋友。当她离开家时,她试图按照约翰的声音处理答复 - 但约翰甚至没有拿起接收器,更不用说告诉她什么了 - 所以她神经衰弱了。如果她试图阅读这张纸条,它仍然是一张白纸(即使我们忽略了它可能还在房子里的事实),所以她还有另一个故障。如果有人还在乎,五分钟后约翰挂断电话,并宣布他的邻居需要糖到空房子,因为玛莎不再在那里了。为了以防万一,他还给她写了一张便条。没有人告诉他还有什么可做,他拿起报纸开始浪费时间。该笔记永远不会被阅读。var note;
var reply = john.answerPhone(function(reply) {
note = reply;
return reply;
};
note.figureOutResponse();
// Cannot read property 'figureOutResponse' of undefined
reply.figureOutResponse();
// Cannot read property 'figureOutResponse' of undefined
纠正异步:
玛莎告诉约翰接电话,然后打电话给她,因为她必须出去和朋友见面。她出去了,约翰拿起电话。五分钟后,约翰打电话给玛莎的手机说这是一个寻找糖的邻居。她告诉他要把杯子装满并送给邻居,然后挂起来继续乘坐公共汽车。var marthasCellphone = function(data, respondCallback) {
var action = data.figureOutResponse();
respondCallback(action);
}
john.answerPhone(function(data) {
// callback here: no returns, pass data on to another callback
var action = marthasCellphone(data, function(action) {
// another callback here; use action immediately
john.tellToDo(action);
});
});
reply.figureOutResponse();