Как мне получить доступ к содержимому ошибки при использовании фьючерсов в Meteor?

#asynchronous #meteor

#асинхронный #метеор

Вопрос:

Я использую фьючерсы для выполнения асинхронного вызова сбалансированных платежей. Я хочу перехватывать ошибки и отправлять их обратно пользователю, чтобы я мог сообщить им, почему их платеж не удался.

Вот что я получаю на консоли сервера. Как я могу проанализировать ошибки [0].status или ошибки [0].category_code из этой ошибки? Я пытался просто console.log(error[0].status); , но это ничего не дает.

 I20140616-14:38:59.169(0)?     "errors": [
I20140616-14:38:59.169(0)?         {
I20140616-14:38:59.170(0)?             "status": "Conflict",
I20140616-14:38:59.170(0)?             "category_code": "card-not-validated",
I20140616-14:38:59.170(0)?             "additional": null,
I20140616-14:38:59.170(0)?             "status_code": 409,
I20140616-14:38:59.171(0)?             "category_type": "logical",
I20140616-14:38:59.171(0)?             "extras": {},
I20140616-14:38:59.171(0)?             "request_id": "OHMf39d5030f56311e39cde02a
1fe53e539",
I20140616-14:38:59.171(0)?             "description": "Card cannot be validated.
 Your request id is OHMf39d5030f56311e39cde02a1fe53e539."
I20140616-14:38:59.172(0)?         }
I20140616-14:38:59.172(0)?     ]
  

Вот функция future, которую я использую.

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

  function extractFromPromise(promise) {
    var fut = new Future();
    promise.then(function (result) {
      fut["return"](result);
    }, function (error) {      
      fut["throw"](error);
      fut.return(error.message);
    });
    return fut.wait();
  }
  

Я вызываю эту функцию из своего кода, используя что-то вроде этого.

 var customerData =  extractFromPromise(balanced.marketplace.customers.create({
        'name': customerInfo.fname   " "   customerInfo.lname,
        "address": {
          "city": customerInfo.city,
          "state": customerInfo.region,
          "line1": customerInfo.address_line1,
          "line2": customerInfo.address_line2,
          "postal_code": customerInfo.postal_code,
        },
        'email': customerInfo.email_address, 
        'phone': customerInfo.phone_number
        }));
  

Комментарии:

1. Вы, вероятно, имели в виду errors[0] , а не error[0] , верно? Не могли бы вы также предоставить future код, который вы используете здесь?

2. Я имел в виду ошибку [0]. Я опубликовал приведенный выше код, надеюсь, это поможет объяснить. Я также пробовал error.errors [0] и errors [0], я ничего не получаю ни от одного из них.

3. Какой код сгенерировал этот "errors": [...] журнал?

Ответ №1:

Я получил некоторую помощь и получил ответ. Надеюсь, это поможет другим. Вот переписанный код, который я изначально написал.

Код future одновременно возвращал и выдавал ошибку, поэтому она была удалена, код также был немного очищен.

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

  function extractFromPromise(promise) {
    var fut = new Future();
    promise.then(function (result) {
       fut.return(result);
     }, function (error) { 
       console.log(error);      
       fut.throw(error);
    });
    return fut.wait();
  }
  

А затем все это оборачивается в try catch. Я консольно выхожу из системы из разных частей сообщения. Оказалось, что JSON был строковым, поэтому его нужно было сначала проанализировать, тогда я мог бы получить доступ к ошибке, как к обычным данным JSON. И я только что узнал, что никакие ошибки не вернутся к клиенту, если вы Meteor.error сначала не используете синтаксис.

 var customerData;

      try {
        customerData =  extractFromPromise(balanced.marketplace.customers.create({
        'name': customerInfo.fname   " "   customerInfo.lname,
        "address": {
          "city": customerInfo.city,
          "state": customerInfo.region,
          "line1": customerInfo.address_line1,
          "line2": customerInfo.address_line2,
          "postal_code": customerInfo.postal_code,
        },
        'email': customerInfo.email_address, 
        'phone': customerInfo.phone_number
        }));
    } catch (e) {
      console.log(JSON.parse(e.message).errors[0].extras);  
      console.log(JSON.parse(e.message).errors[0].category_code);            
      var error = JSON.parse(e.message).errors[0]; 
      throw new Meteor.Error(error.category_code, error.status_code, error.description, error.extras);
    }