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

时间:2016-04-07 11:48:03

标签: javascript json meteor httprequest httpexception

我们正在开发一个调用内部制作的RESTful API的Meteor应用程序。我们的服务器期望设置"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),但它看起来像这样: / p>

{ [Error: failed [400] {"errors": [{"description": "error desc.", "location": "error location", "name": error name"}], "status": "error"}] stack: [Getter] }

如果是200响应,result是一个合适的JSON对象,我们可以毫无问题地解析它。

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

我的问题是:为什么响应包围{ [Error: failed [400] {"original_response": "here"}] stack: [Getter] }以及如何在这种情况下正确解析错误?我们是否遗漏某些标题(服务器或Meteor应用程序),以便Meteor在错误响应时正确构造exc对象?

1 个答案:

答案 0 :(得分:1)

嗯,显然Meteor v1.3以不同的方式包装异常,所以在我的情况下,异常中的对象现在可以通过exc.response来访问...