本地调用AWS Lambda函数voidTransaction时如何正确传递event与context?
问题
我编写了如下AWS Lambda函数:
export const voidTransaction = async function ( event: ApiEvent, context: ApiContext, ): Promise<ApiResponse> { return lambdaWrapper(async () => { const body = await start<NayaxVoidRequestBody>(event, context, 'Void-Request'); return { body: await voidNayaxTransaction( event.pathParameters.transactionId, body.reasonText, body.reasonCode, ), }; }); };
我需要在另一个函数中调用该函数并传入event和context,但当我按如下方式指定event时:
const voidResponse = await voidTransaction(pathParameters: { transactionId: transaction.id, }, context);
出现错误提示:Argument of type '{ pathParameters: { transactionId: any; }; }' is not assignable to parameter of type 'APIGatewayProxyEvent'
请问该如何正确传递参数?
解决方案
报错原因是你传入的对象不符合APIGatewayProxyEvent(即你的ApiEvent类型)的完整结构要求,仅传递pathParameters字段不足以满足类型校验。你可以通过以下两种方式解决:
方式一:构造符合类型要求的完整event对象
根据ApiEvent的类型定义,补充所有必要字段(至少包含你的函数和start方法用到的内容):
// 构造符合ApiEvent规范的event对象 const mockEvent: ApiEvent = { pathParameters: { transactionId: transaction.id }, // 若start函数需要读取请求body,需将参数转为JSON字符串填入 body: JSON.stringify({ reasonText: "撤销原因描述", reasonCode: "对应的原因编码" }), // 补充其他ApiEvent要求的必填字段,如httpMethod、requestContext等,可选字段可按需省略 httpMethod: "POST", requestContext: {} }; // 调用voidTransaction函数 const voidResponse = await voidTransaction(mockEvent, context);
方式二:抽离核心逻辑简化调用
将业务逻辑从Lambda入口函数中抽离,内部调用时直接使用核心函数,无需构造复杂的event对象:
// 抽离核心业务逻辑 export const voidNayaxTransactionHandler = async ( transactionId: string, reasonText: string, reasonCode: string ) => { return await voidNayaxTransaction(transactionId, reasonText, reasonCode); }; // 原Lambda入口函数 export const voidTransaction = async function ( event: ApiEvent, context: ApiContext, ): Promise<ApiResponse> { return lambdaWrapper(async () => { const body = await start<NayaxVoidRequestBody>(event, context, 'Void-Request'); return { body: await voidNayaxTransactionHandler( event.pathParameters.transactionId, body.reasonText, body.reasonCode, ), }; }); }; // 内部调用时直接使用抽离的函数 const voidResponse = await voidNayaxTransactionHandler(transaction.id, "撤销原因描述", "原因编码");
这种方式不仅能避免类型报错,还能让代码结构更清晰,减少重复的对象构造工作。
内容的提问来源于stack exchange,提问作者Rajarshi Ghoshal
相关产品推荐
相关产品推荐

