我正在使用jQuery对Node.js进行AJAX调用以获取一些JSON。 JSON实际上是在Node调用的Python child_process中“构建”的。我看到JSON正在被传递回浏览器,但我似乎无法解析它 - 尽管我可以从YQL查询中解析JSONP。
进行调用的网页与Node位于同一服务器上,所以我认为在这种情况下我不需要JSONP。
以下是代码:
index.html(摘录)
function getData() {
$.ajax({
url: 'http://127.0.0.1:3000',
dataType: 'json',
success: function(data) {
$("#results").html(data);
alert(data.engineURL); // alerts: undefined
}
});
}
server.js
function run(callBack) {
var spawn = require('child_process').spawn,
child = spawn('python',['test.py']);
var resp = '';
child.stdout.on('data', function(data) {
resp = data.toString();
});
child.on('close', function() {
callBack(resp);
});
}
http.createServer(function(request, response) {
run(function(data) {
response.writeHead(200, {
'Content-Type':
'application/json',
'Access-Control-Allow-Origin' : '*' });
response.write(JSON.stringify(data));
response.end();
});
}).listen(PORT, HOST);
test.py
import json
print json.dumps({'engineName' : 'Google', 'engineURL' : 'http://www.google.com'})
AJAX调用回来后,我执行以下操作:
$("#results").html(data);
并在网页上打印以下内容:
{“engineURL": "http://www.google.com", "engineName": "Google"}
但是,当我尝试按如下方式解析JSON时:
alert(data.engineURL);
我未定义。我几乎以为我实际上并没有传回JSON对象,但我不确定。
有人可以建议我在Python中构建JSON,从Node传回JSON,或者只是不在网页上正确解析JSON吗?
感谢。
答案 0 :(得分:2)
我几乎以为我实际上并没有传回JSON对象,但我不确定。
是的,ajax响应是一个字符串。要获取对象,必须将该JSON字符串解析为对象。有两种方法可以做到这一点:
data = $.parseJSON(data);
或者,建议的方法是在$.ajax
来电中指定dataType: 'json'
。这样jQuery会在将响应传递给回调之前隐式调用响应$.parseJSON
。另外,如果您使用的是$.get
,则可以将其替换为$.getJSON
。
此外:
child.stdout.on('data', function(data) {
resp = data.toString();
// ^ should be +=
});
data
事件的回调接收数据块,你应该将它与你已经收到的数据连接起来。您可能还没有遇到过这方面的问题,因为您的JSON很小并且大部分时间都在单个块中,但不依赖它,进行适当的连接以确保您的数据包含所有块而不仅仅是最后一个。