我们正在开发一个调用内部制作的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的异步调用,在这种情况下一切正常 - 我们可以访问错误对象的headers
和content
并正确解析它
我的问题是:为什么响应包围{ [Error: failed [400] {"original_response": "here"}] stack: [Getter] }
以及如何在这种情况下正确解析错误?我们是否遗漏某些标题(服务器或Meteor应用程序),以便Meteor在错误响应时正确构造exc
对象?
答案 0 :(得分:1)
嗯,显然Meteor v1.3以不同的方式包装异常,所以在我的情况下,异常中的对象现在可以通过exc.response
来访问...