typescript AWS Lambda在代码返回后需要10秒才能结束

z2acfund  于 2023-05-23  发布在  TypeScript
关注(0)|答案(1)|浏览(113)

我写了一个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
}
t5zmwmid

t5zmwmid1#

在搜索了AWS Documentations之后,我发现了这个-
当您在处理程序中使用回调时,函数将继续执行,直到事件循环为空或函数超时。在所有事件循环任务完成之前,不会将响应发送到调用方。
在我的例子中,事件循环任务仍然运行PostgreSQL连接池机制,因此,lambda继续执行10秒。
我们仍然可以使用回调,根据文档-
如果函数超时,则返回错误。您可以通过将context.callbackWaitsForEmptyEventLoop设置为false来配置运行库以立即发送响应。
在我看来,@jarmod的评论在这里是更干净的做法。

相关问题