我正在学习 Lambda 并尝试将我的本地应用程序迁移到 AWS lambda。 这很简单。只是一个调用外部服务的函数。 我的处理程序方法调用此方法:
export const addTrack = async (token: string, parameters: any) => {
const url: string = process.env.URL as string
const headers = { ...globalHeaders, "authorization": "Bearer " + token };
try {
console.log("PARAMS:", parameters);
let response = await axios.put(url, parameters, { headers })
console.log('RESPONSE:', response.status + " | " + response.statusText + " | " + parameters.date + " | " + parameters.hours + " | " + parameters.comments)
} catch (e) {
console.error('Error trying to send a record:', parameters)
console.error(e)
throw new Error('Failing to call API: ' + e)
}
}
处理方法:
import { addTrack } from "./time-tracker-api-client"
import { DynamoDBClient, GetItemCommand } from "@aws-sdk/client-dynamodb"
const dynamoClient = new DynamoDBClient({})
export const handler = async (message: any) => {
let body = JSON.parse(message.Records[0].body);
let { Item }:any = await //call to dynamoBD...
let token:string = Item.bdToken.S
addTrack(token, body)
}
注意 axios.put 调用之前和之后的 console.log 以及 catch 块中的日志。我这里有一些间歇性日志。有时显示,有时不显示。 带有 PARAMS 的日志始终显示,因此它是正确的。但有时响应日志不会显示在任何流中的cloudwatch日志中,而且也不显示任何错误日志。 看来 put 调用导致了一些错误,但它没有进入 catch 块。奇怪的是,有时当 put 调用中发生错误时,它会显示在日志中。
例如,lambda 被调用 20 次,我有 20 个 PARAMS 登录流,我的外部服务响应 17 个调用。我只有 17 个响应日志和 1 个错误日志。似乎缺少 2 个错误日志。有时候外部调用可以,但是RESPONSE日志不出现
我不明白这里发生了什么。有人可以对正在发生的事情提供一些提示吗?
我尝试在 put 调用中使用 .then().catch() 进行调用,但它也不起作用。
您似乎遇到了自发错误(20 个中的 3 个),因为您的 Lambda 函数的代码处理程序不是
awaiting
addTrack
函数在终止之前完成。确保addTrack函数完整执行。将您的处理程序代码更改为以下内容:
import { addTrack } from "./time-tracker-api-client"
import { DynamoDBClient, GetItemCommand } from "@aws-sdk/client-dynamodb"
const dynamoClient = new DynamoDBClient({})
export const handler = async (message: any) => {
let body = JSON.parse(message.Records[0].body);
let { Item }:any = await //call to dynamoBD...
let token:string = Item.bdToken.S
// Gracefully await the addTrack function to finish.
await addTrack(token, body);
}