You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:39:05