如何将参数传递给无服务器调用本地
How to pass parameters to serverless invoke local
我正在处理 aws 无服务器项目,需要在本地测试 lambda 函数。
我正在使用 serverless invoke local -f {function_name}
命令来测试不请求任何路径或查询参数的 API 调用。
我的问题是如何使用此命令将任何路径或查询参数传递给函数?
示例无服务器描述
getFoodDetails:
handler: handler.getFoodDetails
events:
- http:
method: get
path: /foods/{food_id}
cors: true
request:
parameters:
paths:
food_id: true
使用 --data
并传递您要发送到本地 lambda 的任何格式的数据。
字符串数据示例:
serverless invoke --function functionName --stage dev --region
us-east-1 --data "hello world"
JSON 数据示例:
serverless invoke --function functionName --stage dev --region
us-east-1 --data '{ "property1": "value"}'
JSON 来自文件的数据:
serverless invoke --function functionName --stage dev --region
us-east-1 --path lib/data.json
可以从 here
访问完整的文档
希望对您有所帮助。
供日后参考。你的案子本来可以这样解决的。感谢 Kannaiyans JSON 示例。
sls invoke local -f getFoodDetails --data '{ "queryStringParameters": {"food_id":"123"}}'
数据字符串
如前所述,您可以使用 --data
选项将 字符串数据作为事件传递给您的函数。
serverless invoke local -f {function_name} --data '{ "queryStringParameters": {"id":"P50WXIl6PUlonrSH"}}'
数据文件
您还可以将 --path
传递给 json 文件,其中数据为 event
,并在 "event file" 中定义您想要的数据.
serverless invoke --function {function_name} --path event_mock.json
You could somehow return the event from a call and save it in a JSON file or grab one from Amazon. They provide some examples:
https://docs.aws.amazon.com/lambda/latest/dg/eventsources.html
请记住,如果您同时传递 --path
和 --data
,--path
文件中包含的数据将覆盖您通过 --data
flag.
文档:https://serverless.com/framework/docs/providers/aws/cli-reference/invoke#invoke-local
我试过使用属性 --data
的答案,但 两个 都不起作用。
事实上,问题在于 --data
会将字符串值传递给框架。因此,如果您在 javascript 文件中写入:console.log(typeof(event));
,您将得到 String
而不是 Object
。这意味着无服务器框架 不会将输入正确地转换为 JSON 对象 。这就是为什么你得到 xx of undefined 错误。
我的解决方案是使用-p
(或--path
)属性。在您的示例中,请执行以下步骤:
- 在控制台的当前位置创建一个 .json 文件。例如:test.json
- 在json文件中写入:
{"pathParameters":{"food_id":"100"}}
- 在js文件中,要得到
food_id
,使用event.pathParameters.food_id
- 运行 命令:
sls invoke local -f yourFunction -p test.json
您似乎 运行 遇到的本地调用的一个挑战是调试 lambda 运行time 与 dynamodb 资源。理想情况下,您希望同时调用 lambda 运行time 和 live dynamodb table。今天,无服务器本地调用和 AWS SAM CLI 都调用 lambda 运行time,但不调用实时 cloudstack。
只要您拥有 Lambda 的 ARN,就可以使用 Stackery CLI 调用 lambda 运行time 和 cloudstack。 (它是免费的)这是一个例子 debugging a serverless framework lambda.
这里还有一个替代所有其他选项的方法。我写了一篇关于此的博客文章,并会在了解一些细节后 link 它。
您需要处理两个基本方面:
- 通过将事件对象传递给处理程序来执行处理程序和业务逻辑中的代码
- 以易于测试的方式处理对 AWS 服务的请求
对于第一个,我只是将 Mocha 添加到项目中并使用单元测试框架作为一种能够单击 IDE 中的按钮并使用测试数据执行代码的方法。我还可以毫无问题地进行本地调试、逐步执行代码等。额外的好处是,如果你像我一样设置它,纯粹是为了执行你的代码,你仍然有一个单元测试套件的开始,如果你愿意,你可以稍后充实
第二个更简单。有一个名为 aws-sdk-mock 的 npm 模块,它允许您为特定的 AWS 服务和方法(例如 DynamoDB.query 或 S3.putItem)注册一个侦听器,并根据您的意愿响应该请求,如果您想测试您的代码如何处理不可思议的事情,甚至会出现错误;一项 AWS 服务出现故障。
通过这两个元素的设置,我可以在本地测试我开发的任何处理程序。最终,您将始终需要在云中进行一些集成测试,因为对于您将要使用的实际云服务,无论看起来多么精致或多么棒,都没有本地替代品,但这可以让您走得更远。
QueryStringParameters 和 pathParameters 是两种不同的输入类型。
对于前者,接受的回复对我有效。
后面的差不多,只是把queryStringParameters换成pathParameters
sls invoke local -f {function_name} --data '{ "pathParameters": {"id":"1"}}'
顺便说一句,您可以创建另一个函数并将您要调用的函数的所有测试用例放入其中。
module.exports.testerFunction = () => {
functionIWatnedToInvoke(para1, para2, para3);
functionIWatnedToInvoke(para4, para5, para6);
functionIWatnedToInvoke(para7, para8, para9);
}
然后
sls invoke local --function testerFunction
我正在处理 aws 无服务器项目,需要在本地测试 lambda 函数。
我正在使用 serverless invoke local -f {function_name}
命令来测试不请求任何路径或查询参数的 API 调用。
我的问题是如何使用此命令将任何路径或查询参数传递给函数?
示例无服务器描述
getFoodDetails:
handler: handler.getFoodDetails
events:
- http:
method: get
path: /foods/{food_id}
cors: true
request:
parameters:
paths:
food_id: true
使用 --data
并传递您要发送到本地 lambda 的任何格式的数据。
字符串数据示例:
serverless invoke --function functionName --stage dev --region us-east-1 --data "hello world"
JSON 数据示例:
serverless invoke --function functionName --stage dev --region us-east-1 --data '{ "property1": "value"}'
JSON 来自文件的数据:
serverless invoke --function functionName --stage dev --region us-east-1 --path lib/data.json
可以从 here
访问完整的文档希望对您有所帮助。
供日后参考。你的案子本来可以这样解决的。感谢 Kannaiyans JSON 示例。
sls invoke local -f getFoodDetails --data '{ "queryStringParameters": {"food_id":"123"}}'
数据字符串
如前所述,您可以使用 --data
选项将 字符串数据作为事件传递给您的函数。
serverless invoke local -f {function_name} --data '{ "queryStringParameters": {"id":"P50WXIl6PUlonrSH"}}'
数据文件
您还可以将 --path
传递给 json 文件,其中数据为 event
,并在 "event file" 中定义您想要的数据.
serverless invoke --function {function_name} --path event_mock.json
You could somehow return the event from a call and save it in a JSON file or grab one from Amazon. They provide some examples: https://docs.aws.amazon.com/lambda/latest/dg/eventsources.html
请记住,如果您同时传递 --path
和 --data
,--path
文件中包含的数据将覆盖您通过 --data
flag.
文档:https://serverless.com/framework/docs/providers/aws/cli-reference/invoke#invoke-local
我试过使用属性 --data
的答案,但 两个 都不起作用。
事实上,问题在于 --data
会将字符串值传递给框架。因此,如果您在 javascript 文件中写入:console.log(typeof(event));
,您将得到 String
而不是 Object
。这意味着无服务器框架 不会将输入正确地转换为 JSON 对象 。这就是为什么你得到 xx of undefined 错误。
我的解决方案是使用-p
(或--path
)属性。在您的示例中,请执行以下步骤:
- 在控制台的当前位置创建一个 .json 文件。例如:test.json
- 在json文件中写入:
{"pathParameters":{"food_id":"100"}}
- 在js文件中,要得到
food_id
,使用event.pathParameters.food_id
- 运行 命令:
sls invoke local -f yourFunction -p test.json
您似乎 运行 遇到的本地调用的一个挑战是调试 lambda 运行time 与 dynamodb 资源。理想情况下,您希望同时调用 lambda 运行time 和 live dynamodb table。今天,无服务器本地调用和 AWS SAM CLI 都调用 lambda 运行time,但不调用实时 cloudstack。
只要您拥有 Lambda 的 ARN,就可以使用 Stackery CLI 调用 lambda 运行time 和 cloudstack。 (它是免费的)这是一个例子 debugging a serverless framework lambda.
这里还有一个替代所有其他选项的方法。我写了一篇关于此的博客文章,并会在了解一些细节后 link 它。
您需要处理两个基本方面:
- 通过将事件对象传递给处理程序来执行处理程序和业务逻辑中的代码
- 以易于测试的方式处理对 AWS 服务的请求
对于第一个,我只是将 Mocha 添加到项目中并使用单元测试框架作为一种能够单击 IDE 中的按钮并使用测试数据执行代码的方法。我还可以毫无问题地进行本地调试、逐步执行代码等。额外的好处是,如果你像我一样设置它,纯粹是为了执行你的代码,你仍然有一个单元测试套件的开始,如果你愿意,你可以稍后充实
第二个更简单。有一个名为 aws-sdk-mock 的 npm 模块,它允许您为特定的 AWS 服务和方法(例如 DynamoDB.query 或 S3.putItem)注册一个侦听器,并根据您的意愿响应该请求,如果您想测试您的代码如何处理不可思议的事情,甚至会出现错误;一项 AWS 服务出现故障。
通过这两个元素的设置,我可以在本地测试我开发的任何处理程序。最终,您将始终需要在云中进行一些集成测试,因为对于您将要使用的实际云服务,无论看起来多么精致或多么棒,都没有本地替代品,但这可以让您走得更远。
QueryStringParameters 和 pathParameters 是两种不同的输入类型。
对于前者,接受的回复对我有效。
后面的差不多,只是把queryStringParameters换成pathParameters
sls invoke local -f {function_name} --data '{ "pathParameters": {"id":"1"}}'
顺便说一句,您可以创建另一个函数并将您要调用的函数的所有测试用例放入其中。
module.exports.testerFunction = () => {
functionIWatnedToInvoke(para1, para2, para3);
functionIWatnedToInvoke(para4, para5, para6);
functionIWatnedToInvoke(para7, para8, para9);
}
然后
sls invoke local --function testerFunction