使用HOF高阶函数实现TypeScript编写的AWS Lambda函数入参事件日志输出
你当前的实现模式完全可以支持打印APIGatewayEvent参数的需求,Lambda执行时会将event作为第一个参数传入handler函数,你只需要在包装函数的参数列表中提取第一个参数即可完成打印。
调整后的日志高阶函数实现如下:
import { APIGatewayEvent } from 'aws-lambda'; import util from 'util'; // 可按你的期望命名为withLogger export function withLogger<T extends (...args: any[]) => any>( func: T, ): (...funcArgs: Parameters<T>) => ReturnType<T> { const funcName = func.name || 'anonymousLambda'; return (...args: Parameters<T>): ReturnType<T> => { // Lambda入参第一个就是APIGatewayEvent对象 const event = args[0] as APIGatewayEvent; // 使用util.inspect打印避免循环引用报错 console.log(`[${funcName}] 触发事件:`, util.inspect(event, { depth: null })); // 可选:异步函数特殊处理,支持打印返回结果和错误日志 const result = func(...args); if (result instanceof Promise) { return result.then(res => { console.log(`[${funcName}] 执行结果:`, util.inspect(res, { depth: null })); return res; }).catch(err => { console.error(`[${funcName}] 执行报错:`, err); throw err; }) as ReturnType<T>; } return result; }; }
调用方式和你期望的完全一致:
const getProfileHandler: APIGatewayProxyHandler = async ( event: APIGatewayEvent, ): Promise<APIGatewayProxyResult> => { // 原业务逻辑不变 const { requestContext } = event; const response = otherFunction(event) return response } // 导出时用高阶函数包装原handler即可 export const myLambdaFunction = withLogger(getProfileHandler);
额外说明:
- 如果不需要打印返回结果和错误,只保留event打印的逻辑即可
- 也可以直接用
JSON.stringify(event, null, 2)打印结构化日志,但是要注意event中如果存在循环引用对象,会触发序列化报错,更推荐用node内置的util.inspect处理
内容的提问来源于stack exchange,提问作者ldeepl
相关产品推荐
相关产品推荐

