我想在AWS lambda上构建适当的打字稿项目。
现在,我有以下定义:
export type HttpResponse = {
statusCode: number;
headers: {};
body: string;
}
export async function readCollection (event, context, callback): Promise<HttpResponse>{
console.log(event); // Contains incoming request data (e.g., query params, headers and more)
const data = [
{
id: "a7b5bf50-0b5b-11e9-bc65-6bfc39f23288",
name: "some thing",
uri: `/notifications/a7b5bf50-0b5b-11e9-bc65-6bfc39f23288`
}
]
const response = {
statusCode: 200,
headers: {
},
body: JSON.stringify({
status: "ok",
data: data
})
};
return response;
};
但是
我要使用官方定义,而不是我的自定义HttpResponse
类型。
但是我要导入和返回哪种正式类型?
答案 0 :(得分:3)
经过几天的研究,我发现答案是如此接近;)
您返回Promise<APIGateway.MethodResponse>
import { APIGateway } from "aws-sdk";
export async function readCollection (event, context, callback): Promise<APIGateway.MethodResponse> {
console.log(event); // Contains incoming request data (e.g., query params, headers and more)
const data = [
{
id: "a7b5bf50-0b5b-11e9-bc65-6bfc39f23288",
name: "some thing",
uri: `/notifications/a7b5bf50-0b5b-11e9-bc65-6bfc39f23288`
}
]
const response = {
statusCode: "200",
headers: {
},
body: JSON.stringify({
status: "ok",
data: data
})
};
return response;
};
答案 1 :(得分:2)
@types/aws-lambda package提供在AWS Lambda函数内部使用TypeScript的类型。对于使用API Gateway's Lambda Proxy integration type调用的AWS Lambda函数,请执行以下步骤:
安装软件包
$ yarn add --dev @types/aws-lambda
或者,如果您更喜欢npm:
$ npm i --save-dev @types/aws-lambda
然后在您的处理程序文件中:
import { APIGatewayProxyEvent, Context, APIGatewayProxyResult } from "aws-lambda"
export async function hello (event: APIGatewayProxyEvent, context: Context): Promise<APIGatewayProxyResult> {
return {
statusCode: 200,
body: JSON.stringify({
message: 'Hello world',
input: event,
})
}
}
答案 2 :(得分:0)
AWS Lambda types将处理程序定义为:
export type Handler<TEvent = any, TResult = any> = (
event: TEvent,
context: Context,
callback: Callback<TResult>,
) => void | Promise<TResult>;
因此,基本上Generics决定了返回类型是什么。
如果您将其他AWS服务与lambda(例如API Gateway)一起使用,则您输入的内容和响应可能会有所不同。
答案 3 :(得分:-1)
您需要返回一个回调,否则,如果您的lambda由s3触发,它将认为它没有执行,并会不时继续执行您的函数,从而生成重复调用。您还需要从API网关请求返回回调,以便向用户发送适当的响应。
成功致电:
callback(null, response);
对于错误呼叫:
callback(error, null);