AWS Lambda обещают с проблемой обратного вызова - PullRequest
0 голосов
/ 10 ноября 2018

Я использую mail-verify для проверки адреса электронной почты, и функция Lambda возвращает, а не ждет результата обещания на

email.check (). Затем (результаты => {* * 1 006

И прыгает прямо на

console.log ('проблема с обратным вызовом');

и возвращается. Я ожидаю, что проверка электронной почты завершится и вернет объект результатов внутри обратного вызова. Вместо этого функция возвращается до разрешения обещания. Любые указатели будут оценены.

Пример функции:

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.',
  //   }),
  // };
};

EDIT:

Спасибо всем за ваши ответы. Я реализовал await, и он хорошо работает при тестировании

test@gmail.com

. Однако, если я проверю

test@email.com

функция email.check() не возвращается, и моя лямбда-функция возвращается с пустым ответом (502 для шлюза API). Я не уверен, что происходит после 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,
      }),
    };    
  }

Лямбда бревна 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 Bad Gateway (из-за того, что ответ функции Lambda равен нулю) { "message": "Internal server error" } РЕДАКТИРОВАТЬ 2:

Оказывается, я получаю ошибку 554 в mail-confirm при проверке test@email.com.

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

Любой метод, который является «доступным», считается Обещанием и будет выполняться асинхронно. Следовательно, email.check() вызывается как Обещание и не будет блокировать выполнение кода, в результате чего console.log() вызывается до того, как вы получите ответ. Поскольку вы уже используете 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()
0 голосов
/ 11 ноября 2018

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

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)

вместо импорта!

0 голосов
/ 10 ноября 2018

Ваша функция async , email.check().then(...) возвращает обещание, которое никогда не ожидается на вашей стороне. Удалите async в вашем лямбда-обработчике или дождитесь await email.check().then(...) возвращенного обещания. Если вы удалите async , вы должны будете использовать свойство обратного вызова для lambda.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...