Javascript 流星:从错误响应中获取数据?

Javascript 流星:从错误响应中获取数据?,javascript,json,meteor,Javascript,Json,Meteor,我有这个流星代码: Meteor.methods({ 'addEmailToList': function(email){ var mailChimpCall = Meteor.wrapAsync(HTTP.call); try { var result = mailChimpCall( 'POST', 'https://us10.api.mailchimp.com/3.0/lists/yyy/members/', { auth: 'xxx',

我有这个流星代码:

Meteor.methods({
  'addEmailToList': function(email){

    var mailChimpCall = Meteor.wrapAsync(HTTP.call);

    try {
    var result = mailChimpCall( 'POST', 'https://us10.api.mailchimp.com/3.0/lists/yyy/members/', {
      auth: 'xxx',
      header: 'content-type: application/json',
      data: {"email_address":email, "status":"subscribed"}
    });
  } catch(error){
    console.log(error);
    throw new Meteor.Error("Bad result: ", "It was an error when posting");
  }

  return result

  }
});
导致这种反应的原因是:

{ [Error: failed [400] {"type":"http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/","title":"Member Exists","status":400,"detail":"jeff@jeff.com is already a list member.  Use PUT to insert or update list members.","instance":""}] stack: [Getter] }
如何从js中对变量的响应中获取
状态
(400)

var errorStatus = SOME CODE HERE

您需要找到如何从响应中获取适当的错误对象,该对象是:

{
    "type": "http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/",
    "title": "Member Exists",
    "status": 400,
    "detail": "jeff@jeff.com is already a list member.  Use PUT to insert or update list members.",
    "instance": ""
}
之后,您可以使用
status
属性获取错误代码


或者,尽管不建议使用正则表达式,但您可以使用正则表达式解析得到的整个字符串,并在
[错误:失败[XXXX]

这是无效的JSON,但您可以使用正则表达式得到该数字:

var response='{[Error:failed[400]{“type”:http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/,“标题”:“成员存在”,“状态”:400,“详细信息”:jeff@jeff.com已是列表成员。请使用PUT插入或更新列表成员。“,“实例”:“}]堆栈:[Getter]}”;

警报(response.match(/\[([0-9]+)\]/)[1]);
您可以通过使用jquery或Javascript获得。首先您必须将响应转换为有效的JSON字符串。然后应用以下方法之一

使用Jquery

  var jsonString = '{"type":"http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/","title":"Member Exists","status":400,"detail":"jeff@jeff.com is already a list member.  Use PUT to insert or update list members.","instance":""}'
    var jsonObject = $.parseJSON(jsonString);
    var errorStatus = jsonObject ['status'];
使用javascript

var jsonString = '{"type":"http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/","title":"Member Exists","status":400,"detail":"jeff@jeff.com is already a list member.  Use PUT to insert or update list members.","instance":""}'
    var jsonObject  = JSON.parse(jsonString);
    var errorStatus = jsonObject ['status'];
目前Meteor.wrapAsync中存在一个错误,因此要将错误消息发布出去有点困难。最好使用一种新方法来解决问题。此解决方案的所有成功都归功于github/Meteor forum user@FaceySpace

var Future = Npm.require( 'fibers/future' );

Meteor.makeAsync = function(fn, context) {
  return function (/* arguments */) {
    var self = context || this;
    var newArgs = _.toArray(arguments);
    var callback;
    for (var i = newArgs.length - 1; i >= 0; --i) {
      var arg = newArgs[i];
      var type = typeof arg;
      if (type !== "undefined") {
        if (type === "function") {
          callback = arg;
        }
        break;
      }
    }
    if(!callback) {
      var fut = new Future();
            callback = function(error, data) {
               fut.return({error:  error, data: data});
            };
      ++i; 
    }
    newArgs[i] = Meteor.bindEnvironment(callback);
    var result = fn.apply(self, newArgs);
    return fut ? fut.wait() : result;
  };
};

例如,将其放置在
server/lib/makeAsync.js
这样的位置,并像使用Meteor.wrapAsync一样使用它,但要注意的是,这会返回一个带有错误和数据键的对象,而不是抛出错误。因此,用
if(response.error)替换现有的try/catch
获取错误,并且
var statusCode=response.data.statusCode;

这是无效的JSON。这是一个响应头。哦,对不起,我不知道。关于如何从该响应头中获取该状态,有什么想法吗?显示用于进行查询以调用
控制台.log(JSON.stringify(error))的代码;
并检查结果。您无法解析invlid JSON。是的!谢谢!很好!