外部 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 包中
如何使用无服务器框架从另一个 lambda 异步调用 lambda