簡體   English   中英

AWS Lambda承諾有回調問題

[英]AWS Lambda promise with callback issue

我正在使用mail-confirm來驗證電子郵件地址,並且Lambda函數正在返回,而不是在等待諾言結果

email.check()。然后(結果=> {

並直接跳到

console.log('callback issue');

並返回。 我希望電子郵件檢查完成並在回調內部返回結果對象。 而是在promise可以解決之前返回該函數。 任何指針將不勝感激。

功能示例:

const MailConfirm = require('mail-confirm');
const isemail = require('isemail');

module.exports.app = async (event, context) => {
  let request = JSON.parse(event.body)


  if(request.email){
    var emailToValidate = request.email
    if(isemail.validate(emailToValidate)){
      console.log(`${emailToValidate} - stage 1 pass`);

      const email = new MailConfirm({
        emailAddress: emailToValidate,
        timeout: 2000,
        invalidMailboxKeywords: ['noreply', 'noemail']
      });

      //Promise issue
      email.check().then(results=>{
        console.log(results); 
        return {
          statusCode: 200,
          body: JSON.stringify({
            validatedEmail: emailToValidate,
            isValid: true,
          }),
        };     
      }).catch(err=>{
        console.log(`${emailToValidate} stage 2/3 failed`)
        return {
          statusCode: 200,
          body: JSON.stringify({
            validatedEmail: emailToValidate,
            isValid: false,
            message: err,
          }),
        };         
      });
      //Returns here
      console.log('callback issue');
    }else{
      return {
        statusCode: 200,
        body: JSON.stringify({
          validatedEmail: emailToValidate,
          isValid: false,
          message: 'Failed stage 1 validation',
        }),
      }; 
    }
  }

  // return {
  //   statusCode: 500,
  //   body: JSON.stringify({
  //     message: 'Something went wrong.',
  //   }),
  // };
};

編輯:

感謝大家的回應。 我已經實現了等待,並且在測試時運行良好

test@gmail.com

但是如果我驗證

test@email.com

email.check()函數不會返回,而我的lambda函數將返回一個空白響應(到API網關502)。 我不確定let results = await email.check();之后會發生什么let results = await email.check(); 驗證test@email.com 我的Lambada功能沒有超時。

 try{
    let results = await email.check();
    console.log(results); 
    //Returns ok on test@gmail.com
    return {
      statusCode: 200,
      body: JSON.stringify({
        validatedEmail: emailToValidate,
        isValid: true,
      }),
    };
  } catch(err){
    console.log(`${emailToValidate} stage 2/3 failed`)
    return {
      statusCode: 200,
      body: JSON.stringify({
        validatedEmail: emailToValidate,
        isValid: false,
        message: err,
      }),
    };    
  }

Lambda日志START Version: $LATEST test@email.com - stage 1 pass END REPORT Duration: 647.88 ms Billed Duration: 700 ms Memory Size: 128 MB Max Memory Used: 21 MB

API網關502錯誤的網關(由於Lambda函數響應為空) { "message": "Internal server error" }編輯2:

事實mail-confirm在驗證test@email.com時,在mail-confirm收到554錯誤。

您的函數是asyncemail.check().then(...)返回一個從未等待過的承諾。 在您的lambda處理程序中刪除異步或等待await email.check().then(...)返回的承諾。 如果刪除異步 ,則必須使用lambdacallback屬性。

任何“可啟用”的方法均被視為Promise,並且將異步執行。 因此, email.check()被作為Promise調用,並且不會阻止代碼執行,這導致在獲得響應之前調用console.log() 由於您已經在lambda處理程序中使用了async/await ,因此可以在繼續操作之前先等待email.check()的響應。

let resp = await email.check().then(results=>{
    console.log(results); 
    return {
        statusCode: 200,
        body: JSON.stringify({
            validatedEmail: emailToValidate,
            isValid: true,
        }),
    };
})

console.log( resp ); // outputs object returned from email.check()

您需要閱讀一些內容,但基本上需要執行異步函數中返回“可以像這樣等待的承諾”的所有操作

module.exports.app = async (event, context, callback) => {
    try {
    const results = await SomeClass.somePromise()

    const anotherResult = await SomeOtherClass.somePromise()

// do some stuff

    callback(null, some_valid_http_response)


    } catch (e) [

        callback(e, null) // or handle another way
    }
}

簡而言之,您不等待一些承諾。然后,您只是等待諾言。

如果您想避免自己陷入痛苦,請切換到Node 8.10,您可以使用大多數最新的ES6功能,只需確保使用:

const someLib = require('whatever)

而不是進口!

暫無
暫無

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

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