【问题标题】:Which type do I return with AWS lambda responses in typescript to suite AWS APIGateway Method Response?我在 typescript 中返回哪种类型的 AWS lambda 响应以适应 AWS APIGateway 方法响应?
【发布时间】:2019-09-26 21:15:18
【问题描述】:

我想在 AWS lambda 上构建一个合适的 typescript 项目。

现在,我有以下定义:

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 类型。

但是我应该导入和返回哪个官方类型呢?

【问题讨论】:

  • 我认为 AWS 没有“官方”类型,您可能会找到社区类型。另外我认为您正在寻找的是 API Gateway 定义,因为 lambda 可以根据您对它的操作返回您想要的任何内容。
  • True .. IT 更多的是 'api 网关方法响应类型' ;)

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


【解决方案1】:

@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,
    })
  }
}

【讨论】:

  • 您只需将“APIGatewayProxyHandler”应用于该函数,它将继承事件和上下文的类型。 /** * Works with Lambda Proxy Integration for Rest API or HTTP API integration Payload Format version 1.0 * @see - https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html */ export type APIGatewayProxyHandler = Handler&lt;APIGatewayProxyEvent, APIGatewayProxyResult&gt;;
【解决方案2】:

经过几天的研究,我发现答案如此接近;)

你回Promise&lt;APIGateway.MethodResponse&gt;

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;
};

【讨论】:

  • 不错。我赞成你的回答并删除了我的。我已经使用 Lambda 好几年了,但找不到这个。伟大的工作@wzr1337
  • 其实这是不正确的。 “aws-sdk”包为 AWS 客户端 SDK 提供类型,并从 github.com/aws/aws-sdk-js/blob/… 导入类型,但这是用于在 API Gateway 中创建/修改实际 API 的 API Gateway 控制平面 REST API,如 @987654322 中所述@ 。请参阅下面的答案,了解实现此目的的替代(和正确)方法。
【解决方案3】:

AWS Lambda types 将处理程序定义为:

export type Handler<TEvent = any, TResult = any> = (
    event: TEvent,
    context: Context,
    callback: Callback<TResult>,
) => void | Promise<TResult>;

所以基本上你可以决定返回类型是什么,这要感谢Generics

如果您使用其他带有 lambda 的 AWS 服务(例如 API Gateway),您的输入和响应可能会有所不同。


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

【讨论】:

    【解决方案4】:

    您需要返回一个回调,否则如果您的 lambda 是由 s3 put 触发的,它会认为它没有执行,并且会不时地继续执行您的函数,生成重复调用。您还需要从 API Gateway 请求中返回回调,以便向用户发送正确的响应。

    成功调用:

    callback(null, response);
    

    对于错误调用:

    callback(error, null);
    

    【讨论】:

    • 上面的代码可以正常返回一个promise..你不需要回调
    • 问题是:我应该指定哪个 Typescript 类型作为 promise 的返回值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2018-02-28
    • 2020-03-15
    相关资源
    最近更新 更多