[英]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.