我已经为Rest API编写了一些基类。现在,我需要为处理程序使用功能性包装,而不是使用扩展此基础Rest API类的类。
但是,我不想重复所做的所有工作以使该包装方法起作用。
我已经尝试了以下方法来使其工作
// api.ts
const handler = (e: APIGatewayEvent, ctx: Context) =>
functionalRestLambdaHandler(e, ctx, (e: APIGatewayEvent, ctx: Context) => {
const handler = new ApiHandler(e, ctx);
const { id } = this.getPathParameters();
const { assigned = false } = this.getQueryStringParameters();
try {
return this.success(handler.handle(id, assigned));
} catch (e) {
return this.error(e);
}
});
//baseHandler.ts
export abstract class RestLambdaHandler extends BaseLambdaHandler<APIGatewayProxyEvent> {
...
async success<T>(
body?: T,
headers?: Headers,
): Promise<APIGatewayProxyResult> {
...
}
getHeaders<T extends StringMap>(): T {
...
}
getPathParameters<T extends StringMap>(): T {
...
}
getQueryStringParameters<T extends StringMap>(): T {
...
}
getBody<T>(): T {
...
}
}
export const functionalRestLambdaHandler = (
e: APIGatewayProxyEvent,
ctx: Context,
handler: (
event: APIGatewayProxyEvent,
context: Context,
) => Promise<APIGatewayProxyResult>
) => {
function arrowBind<T>(
e: APIGatewayProxyEvent,
ctx: Context,
context: T,
fn: (
event: APIGatewayProxyEvent,
context: Context,
) => Promise<APIGatewayProxyResult>
): typeof fn & T {
let arrowFn;
return function(e: APIGatewayProxyEvent, ctx: Context) {
arrowFn = eval(fn.toString());
return arrowFn(e, ctx);
}.call({ e, ctx, context });
}
return arrowBind(e, ctx, { ...RestLambdaHandler }, handler);
};
当我在API处理程序中console.log
离开this
时,我看到了类成员属性(诸如headers
属性之类的东西);但是,我看不到任何方法(诸如方法this.getHeaders()
,this.success()
等)。
如何将RestLambdaHandler类中的所有方法绑定到处理程序方法中的this
关键字?
编辑: 我最终只是做以下事情
export const createRestLambdaHandler = (
event: APIGatewayProxyEvent,
context: Context,
handler: (...args: any[]) => Promise<APIGatewayProxyResult>
) => {
class Handler extends RestLambdaHandler {}
const restLambdaHandler = new Handler(event, context);
return handler.call(restLambdaHandler);
};
这完成了我需要完成的工作,缺点是您不能使用箭头功能作为functionalRestLambdaHandler
的回调。