我正在使用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错误。
答案 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
}
}
而不是导入!