jQuery.ajax#get 之后出现意外的令牌冒号 JSON
Posted
技术标签:
【中文标题】jQuery.ajax#get 之后出现意外的令牌冒号 JSON【英文标题】:Unexpected token colon JSON after jQuery.ajax#get 【发布时间】:2014-08-10 06:03:45 【问题描述】:我在 nodejs 上创建了一个极简 API,它以 JSON 格式返回数据。
但是每次我尝试进行 ajax#get 调用并将我的 API 作为 URL 传递时,我都会收到一个错误,并且从 Chrome 判断,我会收到一个 "Unexpected token :"
错误;
这里是 nodejs + express 中的服务器代码:
var
http = require( 'http' ),
express = require( 'express' ),
app = express(),
server = http.createServer( app );
app.get( '/', function( req, res )
console.log( 'req received' );
res.setHeader('Content-Type', 'application/json');
res.end( JSON.stringify(
Name : "Tom",
Description : "Hello it's me!"
) );
);
server.listen(3000, function()
console.log( 'Listening on 3000' );
);
"/"
返回的 JSON 为:"Name":"Tom","Description":"Hello it's me!"
。
这是我从客户端 js 打来的电话:
$.ajax(
url: findUrl,
type: 'get',
dataType: 'jsonp',
success: function ( data )
self.name( data.Name );
self.description( data.Description );
,
error: function( jqXHR, textStatus, errorThrown )
alert(errorThrown);
);
绘制错误时我得到:"jQuery111108398571682628244_1403193212453 was not called"
有人可以帮我吗?
我知道已经有人问过这个问题,但我还没有找到修复我的程序的解决方案。
【问题讨论】:
检查你的dataType
- $.ajax()
@Andreas :我猜你指的是“jsonp”,我把它改成了“json”。我现在收到“XMLHttpRequest 无法加载 localhost:3000。请求的资源上没有 'Access-Control-Allow-Origin' 标头。因此不允许访问 Origin 'null'。”我该如何解决这个问题?
【参考方案1】:
你想使用 dataType: "json" 而不是 "jsonp"
【讨论】:
你想使用jsonp有不同的原因,一个例子是能够跨不同域调用 同意,jsonp用于CORS,如果需要通过javascript进行跨域异步请求,则不能只使用json。 JSONP 不适用于 CORS。 JSONP 是我们在浏览器开发和支持 CORS 之前使用的 hack。 感谢您澄清我的意思。 JSONP 适用于无法使用 CORS 的情况。【参考方案2】:要支持JSONP requests,服务器必须在响应中包含P
,或“填充”。
jQuery111108398571682628244_1403193212453("Name":"Tom","Description":"Hello it's me!")
语法错误"Unexpected token :"
是因为JSONP被解析为JavaScript,其中...
也代表blocks。它只是利用 JSON 和 JavaScript 的类似语法来定义传递给全局函数调用的数据。
默认情况下,jQuery 将包含一个带有函数名称的callback
查询字符串参数:
var callback = req.query.callback;
var data = JSON.stringify(
Name : "Tom",
Description : "Hello it's me!"
);
if (callback)
res.setHeader('Content-Type', 'text/javascript');
res.end(callback + '(' + data + ')');
else
res.setHeader('Content-Type', 'application/json');
res.end(data);
ExpressJS 还包括已经实现此条件的res.jsonp()
:
app.get( '/', function( req, res )
console.log( 'req received' );
res.jsonp(
Name : "Tom",
Description : "Hello it's me!"
);
);
【讨论】:
您对 JSONP 请求的回答中的链接已损坏。请更新。以上是关于jQuery.ajax#get 之后出现意外的令牌冒号 JSON的主要内容,如果未能解决你的问题,请参考以下文章
JSON 错误中出现意外的令牌,但我使用的是“produces = “text/plain””?
Ajax GET 请求后表单提交失败(无效的 CSRF 令牌)。怎么修?
在jQuery ajax POST之后使用GET重新加载当前页面[重复]