我有一个节点服务器和来自另一个服务器的应用程序通过jquery执行AJAX jsonp请求来获取json参数数组,但是当我请求数据时,jquery会抛出此错误:
Uncaught TypeError: Cannot read property 'toLowerCase' of undefined
请求已发送,我收到回复,但我无法在javascript客户端获取数据
节点服务器:
var my_http = require('http');
var databaseUrl = "leitordecarga"; // "username:password@example.com/mydb"
var collections = ["tables"]
var db = require("mongojs").connect(databaseUrl, collections);
var callback = [];
db.tables.find(function(err,values){
if(err || !values){
console.log('error');
}else{
values.forEach(function(value){
callback.push(value);
});
}
});
my_http = require("http");
my_http.createServer(function(request,response){
response.writeHeader(200, {"Content-Type": "application/json"});
response.write(JSON.stringify(callback));
response.end();
}).listen(8080);
客户端的Javascript:
$(document).ready(function(){
$.ajax({
url:'http://localhost:8080/mongo.js',
dataType:'jsonp',
type: "GET",
jsonp : "callback",
contentType: "application/jsonp",
success: function(data){
console.log(data);
},
error: function(data){
console.log(data.getResponseHeader());
}
}).done(function( data ) {
console.log(data);
});
});
即时通讯使用jquery 2.1.0,但我已尝试其他版本,错误仍然存在
我的问题是如何在成功条款中获取数据
答案 0 :(得分:3)
这种情况下的问题似乎是这一行:
console.log(data.getResponseHeader());
你不应该在没有任何参数的情况下调用getResponseHeader。技术上的错误是jQuery在调用toLowerCase()之前不检查密钥是否作为参数给出,但是,如果没有给出参数,实际的getResponseHeader实现也会抛出错误。
如果您只想返回所有响应标头,则应使用:
console.log(data.getAllResponseHeaders())
答案 1 :(得分:1)
JSONP响应与JSON响应不同。使用JSONP,您实际上可以使用JavaScript代码进行响应。
所以你必须修改你的代码:
首先,在脚本顶部需要querystring
模块:
var qs = require('querystring');
然后你必须重写你的HTTP请求处理程序:
my_http.createServer(function(request,response){
var funcName = qs.parse(request.url).callback;
response.writeHeader(200, {"Content-Type": "text/javascript"});
response.write(funcName + '(' + JSON.stringify(callback) + ');');
response.end();
}).listen(8080);
您可以详细了解JSONP here