[英]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错误。
您的函数是async , email.check().then(...)
返回一个从未等待过的承诺。 在您的lambda处理程序中删除异步或等待await email.check().then(...)
返回的承诺。 如果删除异步 ,则必须使用lambda的callback属性。
任何“可启用”的方法均被视为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.