外部 Http 调用上的无服务器框架/Lambda 错误

Posted

技术标签:

【中文标题】外部 Http 调用上的无服务器框架/Lambda 错误【英文标题】:Serverless Framework / Lambda Errors on External Http Calls 【发布时间】:2020-02-12 20:07:17 【问题描述】:

我使用部署到 AWS Lambda 的无服务器框架编写了一个简单的服务,它调用外部 Http 服务并返回结果。

目前该服务在本地运行良好,但在部署到 AWS 时无法运行。

异步调用解析响应似乎存在一些问题。如果我删除外部 http 调用,简单的 hello 函数可以在远程正​​常工作。

这里有一些代码供审查:

https://github.com/kevbaker/serverless-typescript-call-mock-api

这是处理程序的 sn-p:

import  APIGatewayEvent, Callback, Context, Handler  from 'aws-lambda';
import axios from 'axios';

export const hello: Handler = async (event: APIGatewayEvent, context: Context, cb: Callback) => 

  // External Http call with Axios
  let URL:string = "https://demo8946897.mockable.io";
  let mockResponse = await axios.get(URL,);

  // Send response
  const response = 
    statusCode: 200,
    body: 
      message: 'Go Serverless Webpack (Typescript) v1.0! Your function executed successfully!',
      mockResponse: mockResponse.data
    ,
  ;
  cb(null, response);

有什么想法吗?我已经为这个问题做了很多探索。更改为 Fetch-node,查看日志还没有运气。

【问题讨论】:

【参考方案1】:

解决方案是用JSON.stringify 包装响应正文。响应正文必须是一个字符串。我的 axios 结果中有嵌套对象,我在函数响应中包含mockResponse

export const hello: Handler = async (event: APIGatewayEvent, context: Context) => 

  // External Http call with Axios
  let URL:string = "https://demo8946897.mockable.io";
  let mockResponse = await axios.get(URL,);

  // Send response
  return 
    statusCode: 200,
    body: JSON.stringify(
      message: 'Go Serverless Webpack (Typescript) v1.0! Your function executed successfully!',
      mockResponse: mockResponse.data
    )
  ;

【讨论】:

【参考方案2】:

使用 Lambda 中的 Node 现在可用的 await 语法,您可以进行一些更适合该风格的更改。例如,您不再需要回调,您可以直接返回响应对象。这可能会解决您的问题:

export const hello: Handler = async (event: APIGatewayEvent, context: Context) => 

  // External Http call with Axios
  let URL:string = "https://demo8946897.mockable.io";
  let mockResponse = await axios.get(URL,);

  // Send response
  return 
    statusCode: 200,
    body: JSON.stringify(
      message: 'Go Serverless Webpack (Typescript) v1.0! Your function executed successfully!',
      mockResponse: mockResponse.data
    ),
  ;

【讨论】:

谢谢加雷斯。我更新了 github 上的代码以使用您的版本。这似乎没有解决它:( 同样,当我使用 return 语法时,它似乎没有在本地调用上返回响应对象,这很奇怪,因为我实际上在大多数其他代码中都使用了该语法. 更新代码:github.com/kevbaker/serverless-typescript-call-mock-api @KevinBaker 我更新了我的答案以包括字符串化。在写答案的时候,我实际上是在和自己争论我是否必须这样做。显然我的 50/50 决定没有按照我的方式进行,呵呵

以上是关于外部 Http 调用上的无服务器框架/Lambda 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS Lambda 上的无服务器应用程序中存储和使用 HTML 模板(使用 AWS SAM)?

从 SSM 参数生成文件并包含在无服务器框架 lambda 包中

如何在AWS Lambda函数中进行外部api调用

如何使用无服务器框架从另一个 lambda 异步调用 lambda

使用现有策略的 AWS Gateway 中的无服务器白名单 IP

AWS Lambda 上的 Nestjs(无服务器框架)|如何访问事件参数?