AWS Lambda承诺出现回调问题

时间:2018-11-10 05:42:13

标签: node.js aws-lambda

我正在使用mail-confirm来验证电子邮件地址,而Lambda函数将返回而不是等待

上的承诺结果
  

email.check()。then(results => {

然后直接跳到

  

console.log('回调问题');

并返回。我希望电子邮件检查完成并在回调内部返回结果对象。而是在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.',
  //   }),
  // };
};

编辑:

感谢大家的回应。我已经实现了await,并且在测试

时效果很好
  

test@gmail.com

。但是,如果我验证

  

test@email.com

email.check()函数没有返回,而我的lambda函数返回了一个空白响应(到API网关的502)。我不确定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中遇到554错误。

3 个答案:

答案 0 :(得分:0)

您的函数是 async object返回的承诺从未在您身边等待。在您的lambda处理程序中删除 async 或等待返回的promise email.check().then(...) 。如果您删除异步,则必须使用callback property of lambda.

答案 1 :(得分:0)

任何“ thenable”方法都被视为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()

答案 2 :(得分:0)

您需要阅读一些内容,但是基本上,异步函数中的任何操作都可以返回一个可以像这样等待的承诺

dataArray

简而言之,您不等待某些承诺,而是等待承诺。

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

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
    }
}

而不是导入!