#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);
}