Ember中的JSON.parse空响应

时间:2015-08-06 15:42:00

标签: javascript symfony ember.js

在我的Ember项目中,我使用以下代码从后端获取JSON响应:

Ember.$.getJSON(
    mybackendurl.foo/mybarroute,
    function (data) {
        console.log(data);
});

在那里,我收到以下错误消息:SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data

我的后端是使用Symfony用PHP编写的,而VoryxRESTGeneratorBundle是用来发送JSON的。当我在浏览器上访问http://mybackendurl.foo/mybarroute时,我得到了一个很好的JSON响应:

{
    "links": 
    [
    {
        "id": 28,
        [...]
    }
    ]
}

使用Ember时,看起来没有正确检测到答案。我不确定问题是来自后端还是前端。我该如何解决这个问题?

其他信息:

1)Ember中的此代码生成OPTION请求,并返回空200响应:

Ember.$.ajax({
    url: http://mybackendurl.foo/mybarroute,
    type: 'GET',
    contentType: 'application/json'
});

2)我没有使用chrome

的结果

3)请求和响应标头

Request and response headers

4 个答案:

答案 0 :(得分:1)

  

更新

根据更新的请求响应标头,我猜你会遇到跨域问题。您的服务器在PORT 8000上运行,前端在端口4200上运行

要么考虑转到JSONP解决方案,要么在服务器中启用CORS。

因为浏览器不支持跨域,所以会出现错误,而ember认为这是一个糟糕的JSON。

以下是如何从symfony返回JSONP:

Returning JSONP from Symfony2 controller using AJAX call

一旦您的服务器在网址中支持callback参数,并以callback({your json})

回复

以下是如何使用Ember的jsonp:

How do I use the JSONP datatype with Ember Data?

答案 1 :(得分:1)

我认为您没有在服务器上配置CORS,除非正确配置CORS,否则您的浏览器无法从具有不同来源的内容接收数据。

如果你curl -IX OPTIONS http://whateverisyoururl,它至少应该在标题中发送这样的内容:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, OPTIONS

这不是一个ember.js问题,它是一般的跨源请求问题。

答案 2 :(得分:0)

原来是nelmio_cors中的配置问题。让我花费数小时的事情是缓存:max_age设置为3600,所以我应该等待1小时才能看到效果。

将其设置为0解决了我的问题。

nelmio_cors:
    defaults:
        allow_credentials: true
        allow_origin: ['*']
        allow_headers: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept']
        allow_methods: ['GET', 'POST', 'PUT', 'OPTIONS', 'PATCH', 'DELETE']
        expose_headers: []
        max_age: 0
        hosts: []
        origin_regex: false
    paths:
        '^/api/':
            allow_origin: ['*']
            allow_headers: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept']
            allow_methods: ['GET', 'POST', 'PUT', 'OPTIONS', 'PATCH', 'DELETE']
            max_age: 0 

答案 3 :(得分:-1)

试试这个..

Ember.$.ajax({
url: http://mybackendurl.foo/mybarroute,
type: 'GET',
contentType: 'application/json',
dataType: 'json',
success: function(result){
   console.log(result);
}});

你的网址也没有扩展名吗?我的意思是像mybarroute.php,.json,.js或.html?