对于 AWS lambda 无服务器 nodejs 应用程序,您如何在开发环境中执行请求?
Posted
技术标签:
【中文标题】对于 AWS lambda 无服务器 nodejs 应用程序,您如何在开发环境中执行请求?【英文标题】:for an AWS lambda serverless nodejs app, how do you execute a request in the development environment? 【发布时间】:2021-03-25 15:16:36 【问题描述】:我正在接管一个 AWS lambda 无服务器 nodejs 应用程序,并试图弄清楚如何在我的开发环境中执行端点。出于我的目的,我正在尝试模拟如下请求:
http://localhost:3000/find/product?hiveProductId=22002233&zipCode=44035
该应用在 handler.js 中包含以下内容
app.route("/find/product").get(cors(), async (req, res) =>
try
console.log(
"finding product",
req.query
);
etc...
catch (error)
console.error("caught error finding product: ", error);
res.status(500).json(error);
);
module.exports.find = serverless(app);
serverless.yml
中还有以下内容:
functions:
find:
handler: handler.find
events:
- http:
path: /find/product
method: GET
memorySize: 128
timeout: 30
private: false
cors: true
integration: lambda-proxy
request:
parameters:
querystrings:
hiveProductId: true
max: false
lat: false
lon: false
allowGeoIp: false
zipCode: false
methodReponses:
- statusCode: "200"
responseBody:
description: "array of stores with product"
responseModels:
"application/json": "Stores"
- statusCode: "404"
description: "not found"
- http:
path: /find/stores
method: GET
memorySize: 128
timeout: 30
integration: lambda-proxy
private: true
request:
parameters:
querystrings:
max: false
lat: true
lon: true
documentation:
summary: "Find the closest stores"
queryParams:
- name: "lat"
description: "latitude caller for geosearch"
required: true
- name: "lon"
description: "longtitude caller for geosearch"
required: true
- name: "max"
description: "maximum stores to location to return. default is 5"
methodReponses:
- statusCode: "200"
responseBody:
description: "array of stores sorted by distance"
responseModels:
"application/json": "Stores"
我一直在使用https://www.serverless.com/framework/docs/providers/aws/cli-reference/invoke-local/ 作为参考。 serverless invoke local
似乎是我正在寻找的东西。 serverless invoke local --function find
给出以下响应:
"statusCode": 404,
"headers":
"x-powered-by": "Express",
"content-security-policy": "default-src 'none'",
"x-content-type-options": "nosniff",
"content-type": "text/html; charset=utf-8",
"content-length": "139"
,
"isBase64Encoded": false,
"body": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<title>Error</title>\n</head>\n<body>\n<pre>Cannot GET /</pre>\n</body>\n</html>\n"
任何关于如何正确使用 serverless invoke
的建议或指示,或不同的研究方法,或任何更有成效的文档,将不胜感激。
【问题讨论】:
【参考方案1】:您在问如何测试和调试无服务器应用程序。
这是我正在使用的.vscode/launch.json
(放置在VS Code项目的根目录中)(我一直在使用VS代码):
"version": "0.2.0",
"configurations": [
"type": "node",
"request": "launch",
"name": "Launch Lambda",
"runtimeExecutable": "/Users/ninjablade/.nvm/versions/node/v12.18.0/bin/node",
"cwd": "$workspaceFolder/lambda-mock",
"program": "/usr/local/bin/sls",
"args": [
"invoke",
"local",
"-f",
"resolvers",
"-p",
"../mocks/resolvers.json"
],
"skipFiles": ["<node_internals>/**"]
,
]
正如您在此处所看到的,我们正在运行 $ sls invoke local -f function -p data
命令(您可以从 sls 框架文档中查看该命令的确切指南)
作为此命令的-p
选项,我们可以传递端点所需的任何信息。您可以轻松地从 Cloud Watch 日志中获取测试事件数据,并将其替换为您的测试输入数据。
$ sls invoke local
命令将在您的本地开发环境中模拟完全相同的 lambda 环境,并让您在本地测试您的 lambda 函数。
这篇文章对您有很大帮助Debug Serverless app by VS Code。 谢谢
【讨论】:
【参考方案2】:我没用过这个方法,所以不能说什么。我可以推荐 serverless-offline 作为不同的解决方案。 serverless-offline
【讨论】:
以上是关于对于 AWS lambda 无服务器 nodejs 应用程序,您如何在开发环境中执行请求?的主要内容,如果未能解决你的问题,请参考以下文章
如何在无服务器框架或 AWS lambda 中启用节点 js 的实验性功能
在本地测试 Elasticache 和无服务器 AWS Lambda
AWS Lambda 中的 Amazon S3 waitFor()
AWS Lambda/APIG - 新 Sequelize 的新 PostgresDialect 的新 ConnectionManager 出错