繁体   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