Shippo: Использование сгенерированной транзакции label_url в других функциях

Я надеюсь, что кто-то с большим опытом работы с API Shippo в Node поможет мне разобраться в этом.

Моя конечная цель - нажать кнопку на внешней стороне угловой формы, создать транзакцию отгрузки и использовать URL-адрес метки транзакции для создания пользовательского PDF. Все работает, за исключением отправки сгенерированного ярлыка URL в шаблон PDF.

Сначала я вставил пример создания метки одним щелчком в Shippo в маршрут Express POST. Он работал просто отлично, генерируя транзакции, которые я мог проверить, проверяя API Shippo для получения списка последних транзакций и просмотра самых последних.

Затем я добавил строки 102-111 этого примера кода и заменил им генератор обобщенных сообщений об ошибках в коде instalabel, поэтому моя текущая логика транзакций Shippo app.js выглядит следующим образом:

shippo.transaction.create({
    "shipment": shipment,
    "carrier_account": "xxxxxxxxxxxxxxxxxxxxxx",
    "servicelevel_token": "ups_ground",
    "label_file_type": "PNG"
},function(transaction, err ){
            console.log("transaction : %s", JSON.stringify(transaction, null, 4));
            // print label_url and tracking_number
            if(transaction.object_status == "SUCCESS") {
                console.log("Label URL: %s", transaction.label_url);
                console.log("Tracking Number: %s", transaction.tracking_number);
                exports.label_url = transaction.label_url;
                exports.tracking_number = transaction.tracking_number;
            }else{
                //Deal with an error with the transaction
                console.log("Message: %s", transaction.messages);
            }

    });

Мне нужно захватить label_url & tracking_number для только что созданной транзакции и использовать ее в другой функции, но все, что я пробовал до сих пор, похоже, приводит к ошибке, подобной следующей:

/src/app.js:88
    if(transaction.object_status == "SUCCESS") {
                  ^

TypeError: Cannot read property 'object_status' of null

Я предполагаю, что это потому, что функция создания этикетки доставки не экспортирует ответ, который отправляет Шиппо, поэтому я не могу использовать его в других функциях... Это верно, или я лаю не на том дереве Вот? Для справки, вот как должен выглядеть ответ Шиппо:

{
   "object_state":"VALID",
   "object_status":"SUCCESS",
   "object_created":"2014-07-25T02:09:34.422Z",
   "object_updated":"2014-07-25T02:09:34.513Z",
   "object_id":"ef8808606f4241ee848aa5990a09933c",
   "object_owner":"shippotle@goshippo.com",
   "was_test":true,
   "rate":"ee81fab0372e419ab52245c8952ccaeb",
   "tracking_number":"tracking_number_goes_here",
   "tracking_status":null,
   "tracking_url_provider":"",
   "label_url":"label_url_goes_here",
   "commercial_invoice_url": "",
   "messages":[

   ],
   "customs_note":"",
   "submission_note":"",
   "metadata":""
}

Что я могу сделать, чтобы использовать значения из этого ответа вне самой функции shippo.transaction.create?

Спасибо за прочтение.

1 ответ

Решение

Параметры, которые вы передаете в обратный вызов, используемый в shippo.transaction.create имеет свои введенные параметры в обратном порядке. Так должно быть (err, transaction) не (transaction, err), Кроме того, вы можете приковать .then() и передать обратный вызов, который принимает только (transaction) и получить доступ к любым сообщениям об ошибках в transaction.messages,

Ниже приведен рабочий пример с последней версией shippo-node-wrapper на момент написания этой статьи.

var shippo = require('./lib/shippo')('<API KEY>');

var addressFrom  = {
    "object_purpose":"PURCHASE",
    "name":"Ms Hippo",
    "company":"Shippo",
    "street1":"215 Clayton St.",
    "city":"San Francisco",
    "state":"CA",
    "zip":"94117",
    "country":"US", //iso2 country code
    "phone":"+1 555 341 9393",
    "email":"ms-hippo@goshippo.com",
};

// example address_to object dict
var addressTo = {
    "object_purpose":"PURCHASE",
    "name":"Mr Hippo",
    "company":"Happy Hippo",
    "street1":"965 Mission St",
    "street2":"Suite 425",
    "city":"San Francisco",
    "state":"CA",
    "zip":"94103",
    "country":"US", //iso2 country code
    "phone":"949-123-4567",
    "email":"mrhippo@goshippo.com",
    "metadata" : "Hippo T-Shirt Order #1043"
};

// parcel object dict
var parcel = {
    "length":"5",
    "width":"5",
    "height":"5",
    "distance_unit":"in",
    "weight":"2",
    "mass_unit":"lb",
};

var shipment = {
    "object_purpose": "PURCHASE",
    "address_from": addressFrom,
    "address_to": addressTo,
    "parcel": parcel,
    "async": false
};

shippo.transaction.create({
    "shipment": shipment,
        "carrier_account": "07280f4f96f34cc8b75e593c4835dc38",
        "servicelevel_token": "usps_priority",
        "label_file_type": "PNG"
}, function (err, transaction) {
    console.log("transaction : %s", JSON.stringify(transaction, null, 4));
    // print label_url and tracking_number
    if (transaction.object_status == "SUCCESS") {
        console.log("Label URL: %s", transaction.label_url);
        console.log("Tracking Number: %s", transaction.tracking_number);
    } else {
        //Deal with an error with the transaction
        console.log("Message: %s", transaction.messages);
    }
});

// OR 

shippo.transaction.create({
    "shipment": shipment,
        "carrier_account": "07280f4f96f34cc8b75e593c4835dc38",
        "servicelevel_token": "usps_priority",
        "label_file_type": "PNG"
}).then(function (transaction) {
    console.log("transaction : %s", JSON.stringify(transaction, null, 4));
    // print label_url and tracking_number
    if (transaction.object_status == "SUCCESS") {
        console.log("Label URL: %s", transaction.label_url);
        console.log("Tracking Number: %s", transaction.tracking_number);
    } else {
        //Deal with an error with the transaction
        console.log("Message: %s", transaction.messages);
    }
});
Другие вопросы по тегам