2015-01-09 46 views
0

我在AngularJS中有一个$ http POST调用,如果请求不好,它将不会显示服务器响应。

myFactory.create = function(formData) { 
    deferred = $q.defer() 
    $http({method: 'POST', url: url, responseType: 'json', data: formData}) 
    .then(function(data) { 
     deferred.resolve(data); 
    }, function(response, status, headers, config) { 
     deferred.reject(response); 
    }); 

    return deferred.promise; 
}; 

当我提交不正确的数据时,API响应400 - 错误请求。如果我在Chrome Developer工具中查看响应,则会显示一条纯文本消息:“竖线不正确。”但是,该消息不在$ http错误回调的响应中。

我可以得到一切(状态,头文件和配置),但我的响应数据为空。

成功的POSTs被正确处理,所以我知道该功能通常有效。

任何想法,为什么我会在Chrome中看到响应,但无法通过$ http访问它?

+4

建议:不要在已经存在承诺的地方创建承诺。这就是所谓的反模式。 – rahpuser 2015-01-09 21:44:28

+0

您可以发布实际从返回的承诺中获取数据的部分吗?另外,我只是假设你将'url'改为变量,尽管它不存在。而你并没有宣布推迟为var。 – gsalisi 2015-01-09 21:44:51

+0

是的。 'url'实际上是一个变量,并在我的工厂的其他地方生成。现在,我刚刚用console.log(response)检查它,看看出现错误时返回的内容。 – 2015-01-09 21:54:47

回答

0

您可以重构这个:

myFactory.create = function(formData) { 
    var url = 'api/create'; 
    return $http({ 
    method: 'POST', 
    url: url, 
    responseType: 'json', //Are you sure that it is returning a json?? 
    data: formData 
    }); 
}; 

然后检查类似这样的承诺的回报,无论你想称呼它,

myFactory.create().then(
    function(data){ 
    console.dir(data); 
    },function(response, status, headers, config) { 
    console.dir(response); 
    }); 

这应该工作,你应该看到的数据日志。

+0

如果您不确定答案并愿意部分帮助,最好使用评论。 – 2015-01-09 22:11:28

+0

对不起,但这个答案只是太长的评论,并有很高的可能性是正确的。也许对我如何说事的一些编辑会使它听起来更好。 – gsalisi 2015-01-09 22:14:12

+0

我不同意,除了删除$ q.defer()并直接返回http承诺之外,您不会改变代码的逻辑,因为OP说响应数据为空,这不会有帮助。唯一剩下的情况是,OP的服务器可能不会返回您提到的有效JSON,这可以归结为一条评论。我想如果是这样的话,这个问题就会被封闭为一个简单的印刷错误。 – 2015-01-09 22:22:29