我正在研究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
答案 0 :(得分:24)
数据字符串
如上所述,您可以使用--data
选项将字符串数据作为事件传递给函数。
serverless invoke local -f {function_name} --data '{ "queryStringParameters": {"id":"P50WXIl6PUlonrSH"}}'
数据文件
您还可以做的是将--path
传递到数据为event
的json文件,然后在“事件文件”中定义所需的数据。
serverless invoke --function {function_name} --path event_mock.json
您可以通过某种方式从呼叫中返回事件,并将其保存在JSON文件中,或者从Amazon获取。他们提供了一些示例: https://docs.aws.amazon.com/lambda/latest/dg/eventsources.html
请记住,如果同时传递--path
和--data
,则--path
文件中包含的数据将覆盖--data
传递的数据标记。
文档:https://serverless.com/framework/docs/providers/aws/cli-reference/invoke#invoke-local
答案 1 :(得分:5)
使用--data
并传递是要发送到本地lambda的任何格式的数据。
字符串数据示例:
无服务器调用--function functionName --stage dev --region us-east-1-数据“ hello world”
JSON数据示例:
无服务器调用--function functionName --stage dev --region us-east-1 --data'{“ property1”:“ value”}'
文件中的JSON数据:
无服务器调用--function functionName --stage dev --region us-east-1 --path lib / data.json
可以从here
访问完整的文档希望有帮助。
答案 2 :(得分:2)
QueryStringParameters 和 pathParameters 是两种不同的输入类型。
对于前者,接受的回应对我有用。
对于后者几乎相同,只需将 queryStringParameters 替换为 pathParameters
sls invoke local -f {function_name} --data '{ "pathParameters": {"id":"1"}}'
答案 3 :(得分:1)
以供将来参考。您的案件本来可以解决的。刚刚通过Kannaiyans JSON示例弄清楚了。
sls invoke local -f getFoodDetails --data '{ "queryStringParameters": {"food_id":"123"}}'
答案 4 :(得分:0)
我尝试了使用属性--data
的答案,但都不有效。
实际上,问题在于--data
会将字符串值传递给框架。因此,如果您在JavaScript文件中编写内容:console.log(typeof(event));
,则会得到String
而不是Object
。这意味着无服务器框架无法将输入正确转换为JSON对象。这就是为什么出现 xx个未定义错误的原因。
我的解决方案是使用-p
(或--path
)属性。在您的示例中,请按照下列步骤操作:
{"pathParameters":{"food_id":"100"}}
food_id
,请使用event.pathParameters.food_id
sls invoke local -f yourFunction -p test.json
答案 5 :(得分:0)
您似乎已经遇到的本地调用难题是调试lambda运行时与dynamodb资源。理想情况下,您要同时调用lambda运行时和实时dynamodb表。如今,无服务器本地调用和AWS SAM CLI都调用lambda运行时,而不是实时云堆栈。
只要拥有Lambda的ARN,就可以使用Stackery CLI调用lambda运行时以及云堆栈。 (免费)这是一个示例debugging a serverless framework lambda。
答案 6 :(得分:0)
这里还有所有其他选项的替代方法。我写了一篇关于此的博客文章,并在详细介绍之后将其链接。
您需要处理两个基本方面:
对于第一个,我只是将Mocha添加到项目中,并使用了单元测试框架作为一种能够单击IDE中的按钮并使代码与测试数据一起执行的方法。我也可以进行本地调试,单步执行代码等操作。额外的好处是,如果像我一样,只是为了执行代码而进行设置,那么您仍然拥有单元测试套件的开始,可以根据需要稍后充实
第二个,更容易。有一个名为aws-sdk-mock的npm模块,它允许您注册特定AWS服务和方法(例如DynamoDB.query或S3.putItem)的侦听器,并以您希望的任何内容响应该请求,甚至发生错误您希望测试代码如何处理不可思议的问题;一个AWS服务出现故障。
通过设置这两个元素,我可以在本地测试我开发的任何处理程序。最终,您将永远需要在云中进行一些集成测试,因为对于要使用的实际云服务,无论看起来多么精致或多么出色,都没有本地替代品,但这可以使您走得很远。>