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

Posted

技术标签:

【中文标题】如何将参数传递给无服务器调用本地【英文标题】:How to pass parameters to serverless invoke local 【发布时间】:2019-02-14 11:48:10 【问题描述】:

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

【问题讨论】:

【参考方案1】:

使用--data 并传递您想要发送到本地 lambda 的任何格式的数据。

字符串数据示例:

无服务器调用 --function functionName --stage dev --region us-east-1 --data "你好世界"

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访问

希望对你有帮助。

【讨论】:

谢谢。我添加了一个示例 API 调用,您能否展示如何将 food_id 传递给该调用 event.pathParameters.food_id 是您在 json 中发送数据所需的格式。这就是它从 API Gateway 传递到 lambda 的方式。 serverless invoke local -f getFoodDetails --data '"event.pathParameters.food_id":"f00"' 我试过这个,但得到未定义的错误 'food_id'。 查看嵌套 javascript 对象的示例。 hackernoon.com/…【参考方案2】:

供日后参考。你的案子就这样解决了。多亏了 Kannayans JSON Example,才弄明白。

sls invoke local -f getFoodDetails --data ' "queryStringParameters": "food_id":"123"'

【讨论】:

【参考方案3】:

数据字符串

如上所述,您可以使用--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

【讨论】:

你怎么能用文件做到这一点?前任。 serverless invoke local --function requestUploadURL --data 'imagepath?' 【参考方案4】:

我已尝试使用属性 --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

【讨论】:

【参考方案5】:

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

只要您拥有 Lambda 的 ARN,您就可以使用 Stackery CLI 调用 lambda 运行时和 cloudstack。 (免费)这是一个例子debugging a serverless framework lambda。

【讨论】:

【参考方案6】:

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

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

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

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

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

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

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

【讨论】:

【参考方案7】:

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

对于前者,接受的响应对我有效。

后面也差不多,把queryStringParameters换成pathParameters

sls invoke local -f function_name --data ' "pathParameters": "id":"1"'

【讨论】:

【参考方案8】:

顺便说一句,您可以创建另一个函数并将您想要调用的所有测试用例放入其中。

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

然后

sls invoke local --function testerFunction

【讨论】:

您也可以通过编程方式创建具有循环和单元测试功能的其他测试用例

以上是关于如何将参数传递给无服务器调用本地的主要内容,如果未能解决你的问题,请参考以下文章

如何将构造函数参数传递给 AppDomain.CreateInstanceXXX?

如何将参数传递给 Azure 机器学习服务中的训练脚本?

如何将参数传递给Django中模板变量的方法?

如何将参数传递给 Play 中的 Jobs!框架 1.2.x?

在 ajax 调用中使用 datatable url 属性将参数传递给服务器

怎么将可变参数的函数的参数传递给另一个可变参数的函数