NodeMailer внутри Ax ios запроса на AWS лямбда-функцию - PullRequest
0 голосов
/ 27 мая 2020

Должен признать, что я новичок в функциях Javascript и asyn c, мой основной опыт - Python, но клиент, над которым я сейчас работаю, попросил меня разработать некоторые функции с использованием Node.js.

Проблема, с которой я сталкиваюсь, заключается в отправке электронного письма с использованием NodeMailer после завершения цепочки запросов Ax ios. Это внутри лямбда-функции на AWS. На моей локальной машине, если я извлекаю код из обработчика и выполняю его, он работает как шарм. На AWS, однако, похоже, что фрагмент кода для отправки электронного письма никогда не достигается.

exports.handler = async (event) => {
    email_address = event.queryStringParameters.email_address;

    // initialize nodemailer transport
    let transporter = nodemailer.createTransport({
        service: 'gmail',
        port: 8000,
        secure: false,
        auth: {
            user: 'username@gmail.com',
            pass: 'PASS',
        },
    });

    await axios({
        method: 'GET',
        url: 'https://api.a-service.com/accounts?email=' + email_address,
        auth: {
            username: username,
            password: password
        }
    })
    .then(response => {

        // MY PIECE OF CODE

        return some_values;
    })
    .then(some_values => {

        axios({
            method: 'GET',
            url: 'https://api.a-service.com/orders/' + some_values,
            auth: {
                username: username,
                password: password
            }
        })
        .then(response => {
            // MY PIECE OF CODE

            return some_other_values;
        })
        .then(some_other_values => {
            try{
                transporter.sendMail({
                    from: "User",
                    to: email_address, // list of receivers
                    subject: "Hello " // Subject line
                    text: JSON.stringify(some_other_values), // plain text body
                    html: JSON.stringify(some_other_values), // html body
                });
            } catch (e) {
                console.log(e);
            }
        });
    })
    .catch(error => {
        errors = error;
    })

    if (errors){
        return makeResponse(400, errors);
    } else {
        return makeResponse(200, 'Successful');
    }
};

Процесс выглядит следующим образом:

  1. Вызовите / accounts Конечная точка API и получить из нее некоторые данные
  2. Использовать данные из предыдущего вызова для вызова конечной точки API / orders
  3. Использовать данные из второго вызова API для отправки электронного письма с помощью NodeMailer

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

Спасибо всем за любые подсказки!

1 Ответ

0 голосов
/ 06 августа 2020

Второй вызов axios() выполняется асинхронно, но вы не ожидаете его и не возвращаете в цепочке обещаний.

Изменение вызова на:

   .then(some_values => {

      return axios({...})
             .then(...)
    })

должно сделайте трюк.

В качестве альтернативы вы можете просто удалить фигурные скобки в стрелочной функции, чтобы гарантировать, что обещание, полученное в результате вызова ax ios, а затем цепочки, является возвращаемым значением функции. Это будет выглядеть так:

    .then(some_values => axios({...})
                         .then(...))
...