我应使用哪种类型的TypeScript中的AWS Lambda响应返回到套件AWS API网关方法响应?

时间:2018-12-30 09:03:05

标签: typescript aws-lambda aws-api-gateway

我想在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类型。

但是我要导入和返回哪种正式类型?

4 个答案:

答案 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)一起使用,则您输入的内容和响应可能会有所不同。


链接到处理程序类型:https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/aws-lambda/index.d.ts#L1076-L1089

答案 3 :(得分:-1)

您需要返回一个回调,否则,如果您的lambda由s3触发,它将认为它没有执行,并会不时继续执行您的函数,从而生成重复调用。您还需要从API网关请求返回回调,以便向用户发送适当的响应。

成功致电:

callback(null, response);

对于错误呼叫:

callback(error, null);