Middy onError中间件未触发求助:基于Lambda Powertools场景
解决Middy错误中间件不触发的问题
检查中间件注册逻辑
- 首先确保错误中间件已正确挂载到Middy处理器实例,且注册顺序合理:Middy的
onError中间件按注册顺序执行,需避免被其他提前终止错误流程的中间件拦截(默认情况下,即使某中间件设置了响应,后续onError仍会执行,除非手动调用request.stop())。
正确注册示例:import middy from '@middy/core'; import { Logger } from '@aws-lambda-powertools/logger'; import { errorLogger } from './your-middleware-file'; const logger = new Logger({ serviceName: 'your-service' }); const baseHandler = async (event) => { // 测试:故意抛出错误验证中间件 throw new Error('Test error from handler'); }; // 挂载中间件到处理器 export const handler = middy(baseHandler) .use(errorLogger({ logger }));
校验类型定义兼容性
- 若使用Middy v3+,显式指定
MiddlewareObj的泛型参数,避免类型推断错误导致中间件不被识别:import type { MiddlewareObj } from '@middy/core'; import type { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; export const errorLogger = ({ logger }: { logger: Logger }): MiddlewareObj<APIGatewayProxyEvent, APIGatewayProxyResult> => { const onError = async (request) => { console.log("ERROR LOGGER MIDDLEWARE CALLED"); const error = request.error ?? new Error("An unknown error occurred."); logger.error(`Error occurred: ${error.message}`, error); }; return { onError }; };
排查错误抛出场景
- 确保错误在Middy生命周期内抛出:无论是handler内的同步/异步错误,还是中间件
before阶段的错误,onError都应触发。测试时直接在handler中抛出同步错误,排除业务逻辑中错误被静默捕获的情况。
修正日志查看路径
- Lambda内部的
console.log和Powertools日志会输出到CloudWatch Logs(对应Lambda函数的日志组),而非CloudFront日志。去CloudWatch中查找对应函数的日志流,才能看到中间件的输出。
内容的提问来源于stack exchange,提问作者florian norbert bepunkt
相关产品推荐
相关产品推荐

