Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Meteor中解析错误的服务器响应_Javascript_Json_Meteor_Httprequest_Httpexception - Fatal编程技术网

Javascript 在Meteor中解析错误的服务器响应

Javascript 在Meteor中解析错误的服务器响应,javascript,json,meteor,httprequest,httpexception,Javascript,Json,Meteor,Httprequest,Httpexception,我们正在开发一个Meteor应用程序,它调用内部制作的RESTful API。我们的服务器希望设置“Content-type:application/json”头,它总是使用相同的头(Content-type:application/json;charset=UTF-8)和json格式的主体进行响应,而不管状态代码如何 几个例子: # SERVER RESPONDED WITH 200: HTTP/1.1 200 OK Content-Length: 338 Content-Type: appl

我们正在开发一个Meteor应用程序,它调用内部制作的RESTful API。我们的服务器希望设置
“Content-type:application/json”
头,它总是使用相同的头(
Content-type:application/json;charset=UTF-8
)和json格式的主体进行响应,而不管状态代码如何

几个例子:

# SERVER RESPONDED WITH 200:
HTTP/1.1 200 OK
Content-Length: 338
Content-Type: application/json; charset=UTF-8
Date: Thu, 07 Apr 2016 10:44:33 GMT
Server: nginx

{
    "result": "Hello, world!",
    "status": "OK"
}


# RESPONSE WITH SOME ERRORS:
HTTP/1.1 400 Bad Request
Content-Length: 547
Content-Type: application/json; charset=UTF-8
Date: Thu, 07 Apr 2016 10:23:49 GMT
Server: nginx

{
    "errors": [
        {
            "description": "error desc.",
            "location": "error location",
            "name": "error name"
        }
    ],
    "status": "error"
}
在Meteor中,我们使用如下方法调用API:

let url = 'https://server.url/path';
var auth = "user:pass";
var headers = {"Content-type": "application/json"};

let objId = 100;
let report_type = 'some_type';
let data = {
    object_id: objId,
    report_type: report_type
};
let payload = {auth, headers, data};
try {
    var result = HTTP.post(url, payload);
} catch (exc) {
    console.log(exc);
    return exc;
}
return result;
这里的问题是,当服务器响应4xx/5xx错误时,
exc
对象不是一个正确的JSON格式的对象(我们正在Meteor 1.2和1.3中尝试这一点),但它看起来是这样的:

{ [Error: failed [400] {"errors": [{"description": "error desc.", "location": "error location", "name": error name"}], "status": "error"}] stack: [Getter] }
在200响应的情况下,
结果
是一个合适的JSON对象,我们可以毫无问题地解析它

我们试图将我们的服务器调用更改为Meteor的异步调用,在这种情况下,一切正常-我们可以访问错误对象的
标题
内容
,并正确解析它


我的问题是:为什么响应围绕着
{[Error:failed[400]{“original_response”:“here”}]stack:[Getter]}
,在这种情况下如何正确解析错误?我们是否在某个地方(服务器或Meteor应用程序)丢失了一些头,以便Meteor在得到错误响应时正确构造
exc
对象?

显然Meteor v1.3以不同的方式包装异常,因此在我的情况下,异常中的对象可以通过
exc.response
now…

Meteor在出现4xx/5xx响应时抛出错误,您的服务器响应在错误中,您可以解析错误字符串并获取JSON数据。查看文档,似乎使用异步回调不会引发错误,然后您可能会得到结果:啊,是的,我忘了提到我们尝试使用异步调用,我将用以下信息更新我的帖子:)