У меня есть эти две функции:
import { handler } from '../lib/handler-lib'
import { APIGatewayEvent, Context } from 'aws-lambda'
export const producer = handler(async (
_event: APIGatewayEvent,
_context: Context
): Promise<object> => {
return {
some: 'data result'
}
})
import {
APIGatewayEvent,
APIGatewayProxyResult,
Context
} from 'aws-lambda'
export const handler = (lambda: Function): object => {
return async (
event: APIGatewayEvent,
context: Context
): Promise<APIGatewayProxyResult> => {
let body: object
let statusCode: number
try {
body = await lambda(event, context)
statusCode = 200
} catch (e) {
body = { error: e.message }
statusCode = 500
}
return {
body: JSON.stringify(body),
statusCode
}
}
}
Можно ли это вообще упростить?
Обе функции определяют типы для event
и context
, было бы здорово, если бы это делала только вторая функция, чтобы все вызывающие могли бесплатно получать объявления типов.
Должны ли аргументы lambda: Function
быть определены?
Сначала я бы более четко определил функцию lambda
с входными и выходными значениями.
lambda: (e: APIGatewayEvent, ctx: Context) => Promise<any>
Также вы можете сделать свой код более кратким, просто вернувшись без создания временных переменных:
import {
APIGatewayEvent,
APIGatewayProxyResult,
Context
} from 'aws-lambda'
export const handler = (lambda: (e: APIGatewayEvent, ctx: Context) => Promise<any>): object => {
return async (
event: APIGatewayEvent,
context: Context
): Promise<APIGatewayProxyResult> => {
try {
return {
body: JSON.stringify(await lambda(event, context)),
statusCode: 200
}
} catch (e) {
return {
body: JSON.stringify({ error: e.message }),
statusCode: 500
}
}
}
}
Да, как правило, вы редко, если когда-либо захотите использовать объект типа или функцию типа, например. не делай
Promise<object>
или этоl(lambda: Function): object
. Они не делают того, что вы могли бы подумать.