在 Meteor 中解析错误的服务器响应
Parsing erroneous server responses in Meteor
我们正在开发一个 Meteor 应用程序,它调用 in-house made RESTful API。我们的服务器期望 "Content-type: application/json"
header 已设置并且它总是以相同的 header (Content-Type: application/json; charset=UTF-8
) 和 JSON-formatted body 响应,无论状态码。
几个例子:
# 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
object 不是正确的 JSON-formatted object(我们正在用 Meteor 尝试这个1.2 和 1.3),但看起来像这样:
{ [Error: failed [400] {"errors": [{"description": "error desc.", "location": "error location", "name": error name"}], "status": "error"}] stack: [Getter] }
在 200 响应的情况下,result
是正确的 JSON object,我们可以毫无问题地解析它。
我们尝试将我们的服务器调用更改为 Meteor 的异步调用,在这种情况下一切正常 - 我们可以访问错误 object 的 headers
和 content
并正确解析它.
我的问题是:为什么响应环绕 { [Error: failed [400] {"original_response": "here"}] stack: [Getter] }
以及在这种情况下如何正确解析错误?我们是否在某处(服务器或 Meteor 应用程序)遗漏了一些 header 以便 Meteor 在收到错误响应时正确构造 exc
object?
好吧,显然 Meteor v1.3 正在以不同的方式包装异常,所以在我的例子中,现在可以使用 exc.response
访问异常中的对象...
我们正在开发一个 Meteor 应用程序,它调用 in-house made RESTful API。我们的服务器期望 "Content-type: application/json"
header 已设置并且它总是以相同的 header (Content-Type: application/json; charset=UTF-8
) 和 JSON-formatted body 响应,无论状态码。
几个例子:
# 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
object 不是正确的 JSON-formatted object(我们正在用 Meteor 尝试这个1.2 和 1.3),但看起来像这样:
{ [Error: failed [400] {"errors": [{"description": "error desc.", "location": "error location", "name": error name"}], "status": "error"}] stack: [Getter] }
在 200 响应的情况下,result
是正确的 JSON object,我们可以毫无问题地解析它。
我们尝试将我们的服务器调用更改为 Meteor 的异步调用,在这种情况下一切正常 - 我们可以访问错误 object 的 headers
和 content
并正确解析它.
我的问题是:为什么响应环绕 { [Error: failed [400] {"original_response": "here"}] stack: [Getter] }
以及在这种情况下如何正确解析错误?我们是否在某处(服务器或 Meteor 应用程序)遗漏了一些 header 以便 Meteor 在收到错误响应时正确构造 exc
object?
好吧,显然 Meteor v1.3 正在以不同的方式包装异常,所以在我的例子中,现在可以使用 exc.response
访问异常中的对象...