代码之家  ›  专栏  ›  技术社区  ›  Lasitha Yapa Programmer

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

  •  8
  • Lasitha Yapa Programmer  · 技术社区  · 8 年前

    我正在从事一个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
    
    3 回复  |  直到 8 年前
        1
  •  66
  •   maxrodrigo    7 年前

    数据字符串

    --data 通过a的选项 .

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

    数据文件

    你也可以通过考试 --path 将数据作为 event

    serverless invoke --function {function_name} --path event_mock.json
    

    您可以通过调用返回事件并将其保存在JSON文件中,或者从Amazon获取一个。它们提供了一些例子: https://docs.aws.amazon.com/lambda/latest/dg/eventsources.html

    记住如果你两个都通过了 --路径 和 --数据 --路径 文件将覆盖用 --数据 旗帜。

    文档: https://serverless.com/framework/docs/providers/aws/cli-reference/invoke#invoke-local

        2
  •  11
  •   Kannaiyan    8 年前

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

    字符串数据示例:

    无服务器调用--函数名--阶段开发--区域 us-east-1——数据“你好世界”

    JSON数据示例:

    无服务器调用--函数名--阶段开发--区域

    无服务器调用--函数名--阶段开发--区域

    here

    希望有帮助。

        3
  •  11
  •   barbsan Cibi    7 年前

    我试过这个属性的答案 --data 也不 作品。
    --数据 将向框架传递字符串值。因此,如果在javascript文件中编写: console.log(typeof(event)); ,你会得到 String 而不是 Object . 这意味着无服务器框架 无法将输入正确转换为JSON对象 xx未定义

    -p (或 --path )属性。在您的示例中,请遵循以下步骤:

    1. 在控制台的当前位置创建一个.json文件。如:测试.json
    2. 在json文件中写入: {"pathParameters":{"food_id":"100"}}
    3. food_id ,使用 event.pathParameters.food_id
    4. 运行命令: sls invoke local -f yourFunction -p test.json
        4
  •  5
  •   d0utone    7 年前

    供日后参考。你的案子就这样解决了。多亏了Kannaiyans的JSON示例,我才明白这一点。

    sls invoke local -f getFoodDetails --data '{ "queryStringParameters": {"food_id":"123"}}'
    
        5
  •  1
  •   pafede2    5 年前

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

    对于前者,公认的回答对我有效。

    因为后者几乎是一样的,只要更换 查询字符串参数 通过

    sls invoke local -f {function_name} --data '{ "pathParameters": {"id":"1"}}'
    
        6
  •  0
  •   Abnerg    6 年前

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

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

        7
  •  0
  •   Gareth McCumskey    6 年前

    这里还有一个替代所有其他选项的方法。我写了一篇关于这一点的博客文章,并将在浏览一些细节后进行链接。

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

    1. 通过向处理程序传递事件对象来执行处理程序和业务逻辑中的代码

    对于第一个,我只是将Mocha添加到项目中,并使用单元测试框架作为一种方式,可以单击IDE中的按钮,并使用测试数据执行代码。我也可以做本地调试,逐步通过代码等没有问题。另外一个好处是,如果你像我一样,仅仅是为了执行你的代码,你仍然有一个单元测试套件的开始,如果你愿意的话,你可以在以后充实起来

    对于第二个,它更容易。有一个名为aws sdk mock的npm模块,它允许您为特定的aws服务和方法(例如DynamoDB.query查询或者S3.putItem),并以任何希望的方式响应该请求,即使您希望测试代码如何处理不可想象的错误,AWS服务也会停止。

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

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