如何将参数传递给无服务器调用本地

时间:2018-09-10 04:26:51

标签: aws-lambda serverless-framework aws-serverless

我正在研究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

7 个答案:

答案 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)属性。在您的示例中,请按照下列步骤操作:

  1. 在控制台的当前位置创建一个.json文件。例如:test.json
  2. 在json文件中写入:{"pathParameters":{"food_id":"100"}}
  3. 在js文件中,要获取food_id,请使用event.pathParameters.food_id
  4. 运行命令: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)

这里还有所有其他选项的替代方法。我写了一篇关于此的博客文章,并在详细介绍之后将其链接。

您需要处理两个基本方面:

  1. 通过将事件对象传递给处理程序,从而在处理程序和业务逻辑中执行代码
  2. 以易于测试的方式处理对AWS服务的请求

对于第一个,我只是将Mocha添加到项目中,并使用了单元测试框架作为一种能够单击IDE中的按钮并使代码与测试数据一起执行的方法。我也可以进行本地调试,单步执行代码等操作。额外的好处是,如果像我一样,只是为了执行代码而进行设置,那么您仍然拥有单元测试套件的开始,可以根据需要稍后充实

第二个,更容易。有一个名为aws-sdk-mock的npm模块,它允许您注册特定AWS服务和方法(例如DynamoDB.query或S3.putItem)的侦听器,并以您希望的任何内容响应该请求,甚至发生错误您希望测试代码如何处理不可思议的问题;一个AWS服务出现故障。

通过设置这两个元素,我可以在本地测试我开发的任何处理程序。最终,您将永远需要在云中进行一些集成测试,因为对于要使用的实际云服务,无论看起来多么精致或多么出色,都没有本地替代品,但这可以使您走得很远。

https://serverless.com/blog/serverless-local-development