Как использовать асинхронные вызовы библиотеки в функциях AWS Lambda? - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь использовать библиотеку nodejs-8.12, созданную lob.com, в функции AWS Lambda. Код выглядит так:

'use strict';


module.exports.handler = async (event, context) => {

  var imagine all the variable defined here

  console.log(front)
  console.log(r)

  // Create the address
  Lob.addresses.create({
    name: r.name,
    email: '',
    phone: '',
    address_line1: r.address1,
    address_line2: r.address2 || "",
    address_city: r.city,
    address_state: r.state,
    address_zip: r.zipcode,
    address_country: r.country
  }, function (err, address) {
    console.log(address)
    if (err) {
      console.log(err);
    } else {
      Lob.postcards.create({
        description: '',
        to: address.id,
        front: front,
        back: back,
      }, function (err, postcard) {
        var card = postcard
        if (err) {
          console.log(err);
        } else {
          console.log('The Lob API responded with this postcard object: ', postcard)

        }
      });
    }
  });


  return {
    statusCode: 200,
    body: JSON.stringify({
      message: 'Go Serverless v1.0! Your function executed successfully!',
      input: event,
    }),
  };

  // Use this code if you don't use the http event with the LAMBDA-PROXY integration
  // return { message: 'Go Serverless v1.0! Your function executed successfully!', event };
};

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

Теперь я понимаю, что функция не ждет ни одного из обратных вызовов. Я где-то читал, что вам нужно использовать invoke при вызове асинхронных функций, но я не уверен, как бы я это сделал при использовании внешних библиотек, которые сами управляют запросами. Есть ли способ заставить функцию ждать, пока все это закончится?

1 Ответ

0 голосов
/ 31 октября 2018

Я решил вашу проблему следующим образом:

    'use strict';


    module.exports.handler = async (event, context, callback) => {

        //Create the address
        var promise = new Promise((resolve,reject)=> {
            Lob.addresses.create({
                name: r.name,
                email: '',
                phone: '',
                address_line1: r.address1,
                address_line2: r.address2 || "",
                address_city: r.city,
                address_state: r.state,
                address_zip: r.zipcode,
                address_country: r.country
            }, function (err, address) {

                if(err) return reject(err)

                return resolve(address)
            });
        })

        promise.then((data) => {

            Lob.postcards.create({
                description: '',
                to: data.id,
                front: front,
                back: back,
            }, function (err, postcard) {

                var message = 'Go Serverless v1.0! Your function executed successfully!'
                var code = 200

                if(err)
                {
                    message = err;
                    code = 500
                }

                return callback(null, {
                    statusCode: code,
                    body: JSON.stringify({
                        message: message,
                        input: event,
                    }),
                });

            });
        }).catch(reason => {

            return callback(null, {
                statusCode: 500,
                body: JSON.stringify({
                    message: reason,
                    input: event,
                }),
            });
        })
    };

Я использовал обещания для разрешения первого вызова, после его разрешения я вызвал второй метод.

Я готовлю вам пример (асинхронный, обратный вызов и обещание): Здесь работает

Просто вы должны адаптировать свой код!

Надеюсь помочь вам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...