【问题标题】:Meteor: Get data from error response?Meteor:从错误响应中获取数据?
【发布时间】:2015-12-31 04:39:32
【问题描述】:

我有这个流星代码:

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] }

如何从该响应中获取 status (400) 对 js 中的变量?

var errorStatus = SOME CODE HERE

【问题讨论】:

  • 这是无效的 JSON。
  • 它是一个响应头。
  • 哦,对不起,我不知道。关于如何从该响应标头中获取该状态的任何想法?
  • 显示您用于查询的代码
  • 尝试拨打console.log(JSON.stringify(error));查看结果。

标签: javascript json meteor


【解决方案1】:

目前 Meteor.wrapAsync 中有一个bug,因此输出错误消息有点痛苦。最好制定一种解决问题的新方法。此解决方法的所有功劳归功于 github/meteor 论坛用户 @faceyspacey 的解决方法。

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;!

【讨论】:

  • 是的!谢谢!好接球 J!
【解决方案2】:

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

{
    "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 属性获取错误代码。

或者,虽然不建议这样做,但您可以使用 Regex 解析您获得的整个字符串并获取 [Error: failed [XXXX] 中的数字

【讨论】:

    【解决方案3】:

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

    var response = '{ [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] }';
    alert(response.match(/\[([0-9]+)\]/)[1]);

    【讨论】:

      【解决方案4】:

      您可以使用 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'];
      

      【讨论】:

      • 无法解析无效的 JSON。
      猜你喜欢
      • 2016-05-29
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多