我写了一个typescript Lambda API。如图所示,callback complete
记录的位置,lambda在10秒后响应。你也可以在时间戳中看到。
export const handler = async (event, context, callback) => {
const { headers: { Authorization } } = event
start = Date.now()
const auth = await authorizer(Authorization)
console.log(`Authorizer took ${Date.now() - start} seconds to complete`)
if (!auth.isAuthenticated) {
callback(null, { statusCode: 401, body: JSON.stringify("Unauthorized") })
return
}
start = Date.now()
const associations = await dynamoDb.query({
// DynamoDB Query params
}).promise()
console.log(`DynamoDB query took ${Date.now() - start} seconds to complete`)
const customers = associations.Items.map(association => association.customer)
if (customers.length === 0) {
callback(null, { statusCode: 200, body: JSON.stringify([]) })
return
}
start = Date.now()
const customerDetails = await pool.query(`XXXXXXXX`)
console.log(`PostgreSQL query took ${Date.now() - start} milliseconds to complete`)
const { rows } = customerDetails
callback(null, { statusCode: 200, body: JSON.stringify(rows) })
console.log('callback complete')
return
}
1条答案
按热度按时间t5zmwmid1#
在搜索了AWS Documentations之后,我发现了这个-
当您在处理程序中使用回调时,函数将继续执行,直到事件循环为空或函数超时。在所有事件循环任务完成之前,不会将响应发送到调用方。
在我的例子中,事件循环任务仍然运行PostgreSQL连接池机制,因此,lambda继续执行10秒。
我们仍然可以使用回调,根据文档-
如果函数超时,则返回错误。您可以通过将context.callbackWaitsForEmptyEventLoop设置为false来配置运行库以立即发送响应。
在我看来,@jarmod的评论在这里是更干净的做法。