簡體   English   中英

AWS Axios 請求中的 NodeMailer Lambda function

[英]NodeMailer inside of Axios request on a AWS Lambda function

我必須承認我對 Javascript 和異步函數很陌生,我的主要專長是 Python 但我現在工作的客戶要求我使用 Node.js 開發一些功能。

我遇到的問題是在 Axios 請求鏈完成后使用NodeMailer發送 email。 這在 AWS 上的 Lambda function 內部。 在我的本地機器上,如果我從處理程序中提取代碼並執行它,它就像一個魅力。 然而,在 AWS 上,似乎從未到達發送 email 的代碼段。

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. 使用上次調用的數據調用 /orders API 端點
  3. 使用來自第二次 API 調用的數據使用 NodeMailer 發送 email

我很確定我在使用 promise 時犯了一些錯誤,因為我發現它們與我通常使用同步代碼的方式完全不同。

感謝任何人的任何提示!

axios()的第二次調用異步運行,但您不等待它,或在 promise 鏈中返回它。

將調用更改為:

   .then(some_values => {

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

應該做的伎倆。

或者,您可以簡單地刪除箭頭 function 中的大括號,以確保從 axios 調用產生的 promise 然后是 function 的返回值。這看起來像:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM