56

我正在开发一个 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
4

8 回答 8

88

数据串

如上所述,您可以使用该--data选项将字符串数据作为事件传递给您的函数

serverless invoke local -f {function_name} --data '{ "queryStringParameters": {"id":"P50WXIl6PUlonrSH"}}'

数据文件

您还可以做的是将 a 传递--path给以数据为 的 json 文件event,并在“事件文件”中定义您想要的数据。

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

于 2018-10-12T10:21:24.650 回答
16

使用--data 和传递是您希望将其发送到本地 lambda 的任何格式的数据。

字符串数据示例:

无服务器调用 --function functionName --stage dev --region us-east-1 --data "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

完整的文档可以从这里访问

希望能帮助到你。

于 2018-09-10T04:34:59.387 回答
14

我已经尝试了该属性的答案,--data不起作用。
实际上问题在于--data会将字符串值传递给框架。因此,如果您在 javascript 文件中写入:console.log(typeof(event));,您将得到String而不是Object. 这意味着无服务器框架不会正确地将输入转换为 JSON 对象。这就是为什么你得到xx 的未定义错误。

我的解决方案是使用-p(or --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
于 2019-05-09T09:46:18.273 回答
5

备查。你的案子就这样解决了。多亏了 Kannayans JSON Example,才弄明白。

sls invoke local -f getFoodDetails --data '{ "queryStringParameters": {"food_id":"123"}}'
于 2018-10-12T07:08:25.410 回答
4

QueryStringParameters 和 pathParameters 是两种不同的输入类型。

对于前者,接受的回应对我有用。

对于后者几乎相同,只需将queryStringParameters替换为pathParameters

sls invoke local -f {function_name} --data '{ "pathParameters": {"id":"1"}}'
于 2021-03-18T13:14:52.667 回答
1

这里还有所有其他选项的替代方案。我写了一篇关于此的博客文章,并在完成一些细节后将其链接。

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

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

对于第一个,我刚刚将 Mocha 添加到项目中,并使用单元测试框架作为一种能够单击 IDE 中的按钮并使用测试数据执行代码的方式。我还可以毫无问题地进行本地调试、逐步执行代码等。额外的好处是,如果你只是像我一样设置它,纯粹是为了执行你的代码,你仍然有一个单元测试套件的开始,如果你愿意,你可以在以后充实

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

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

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

于 2019-10-11T10:23:57.730 回答
0

By the way, you can create another function and put into it all test cases for the one you wanted to invoke.

module.exports.testerFunction = () => {
  functionIWatnedToInvoke(para1, para2, para3);
  functionIWatnedToInvoke(para4, para5, para6);
  functionIWatnedToInvoke(para7, para8, para9);
}

then

sls invoke local --function testerFunction
于 2022-01-03T23:27:04.840 回答
0

您似乎遇到的一个本地调用挑战是调试 lambda 运行时与 dynamodb 资源。理想情况下,您希望同时调用 lambda 运行时和实时 dynamodb 表。今天,无服务器本地调用和 AWS SAM CLI 都调用 lambda 运行时,但不调用实时云堆栈。

只要您拥有 Lambda 的 ARN,就可以使用 Stackery CLI 调用 lambda 运行时和 cloudstack。(它是免费的)这是一个调试无服务器框架 lambda的示例。

于 2019-10-11T06:30:11.417 回答