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重新加载当前页面[重复]

laravel 4持续数据正在进行 - jquery ajax提交

laravel 4持续数据正在进行 - jquery ajax提交