对于 AWS lambda 无服务器 nodejs 应用程序,您如何在开发环境中执行请求?

Posted

技术标签:

【中文标题】对于 AWS lambda 无服务器 nodejs 应用程序,您如何在开发环境中执行请求?【英文标题】:for an AWS lambda serverless nodejs app, how do you execute a request in the development environment? 【发布时间】:2021-03-25 15:16:36 【问题描述】:

我正在接管一个 AWS lambda 无服务器 nodejs 应用程序,并试图弄清楚如何在我的开发环境中执行端点。出于我的目的,我正在尝试模拟如下请求:

http://localhost:3000/find/product?hiveProductId=22002233&zipCode=44035

该应用在 handler.js 中包含以下内容

app.route("/find/product").get(cors(), async (req, res) => 
    try 
        console.log(
            "finding product",
            req.query
        );

        etc...
     catch (error) 
        console.error("caught error finding product: ", error);
        res.status(500).json(error);
    
);

module.exports.find = serverless(app);

serverless.yml中还有以下内容:

functions:
  find:
    handler: handler.find
    events:
      - http:
          path: /find/product
          method: GET
          memorySize: 128
          timeout: 30
          private: false
          cors: true
          integration: lambda-proxy
          request:
            parameters:
              querystrings:
                hiveProductId: true 
                max: false
                lat: false
                lon: false
                allowGeoIp: false
                zipCode: false
            methodReponses:
              - statusCode: "200"
                responseBody:
                description: "array of stores with product"
                responseModels:
                    "application/json": "Stores"
              - statusCode: "404"
                description: "not found"
      - http:
          path: /find/stores
          method: GET
          memorySize: 128
          timeout: 30
          integration: lambda-proxy
          private: true
          request:
            parameters:
              querystrings:
                max: false
                lat: true
                lon: true
          documentation:
            summary: "Find the closest stores"
            queryParams:
              - name: "lat"
                description: "latitude caller for geosearch"
                required: true
              - name: "lon"
                description: "longtitude caller for geosearch"
                required: true
              - name: "max"
                description: "maximum stores to location to return. default is 5"
            methodReponses:
              - statusCode: "200"
                responseBody:
                  description: "array of stores sorted by distance"
                responseModels:
                    "application/json": "Stores"

我一直在使用https://www.serverless.com/framework/docs/providers/aws/cli-reference/invoke-local/ 作为参考。 serverless invoke local 似乎是我正在寻找的东西。 serverless invoke local --function find 给出以下响应:


    "statusCode": 404,
    "headers": 
        "x-powered-by": "Express",
        "content-security-policy": "default-src 'none'",
        "x-content-type-options": "nosniff",
        "content-type": "text/html; charset=utf-8",
        "content-length": "139"
    ,
    "isBase64Encoded": false,
    "body": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<title>Error</title>\n</head>\n<body>\n<pre>Cannot GET /</pre>\n</body>\n</html>\n"

任何关于如何正确使用 serverless invoke 的建议或指示,或不同的研究方法,或任何更有成效的文档,将不胜感激。

【问题讨论】:

【参考方案1】:

您在问如何测试和调试无服务器应用程序。 这是我正在使用的.vscode/launch.json(放置在VS Code项目的根目录中)(我一直在使用VS代码):


  "version": "0.2.0",
  "configurations": [
    
      "type": "node",
      "request": "launch",
      "name": "Launch Lambda",
      "runtimeExecutable": "/Users/ninjablade/.nvm/versions/node/v12.18.0/bin/node",
      "cwd": "$workspaceFolder/lambda-mock",
      "program": "/usr/local/bin/sls",
      "args": [
        "invoke",
        "local",
        "-f",
        "resolvers",
        "-p",
        "../mocks/resolvers.json"
      ],
      "skipFiles": ["<node_internals>/**"]
    ,
  ]


正如您在此处所看到的,我们正在运行 $ sls invoke local -f function -p data 命令(您可以从 sls 框架文档中查看该命令的确切指南)

作为此命令的-p 选项,我们可以传递端点所需的任何信息。您可以轻松地从 Cloud Watch 日志中获取测试事件数据,并将其替换为您的测试输入数据。

$ sls invoke local 命令将在您的本地开发环境中模拟完全相同的 lambda 环境,并让您在本地测试您的 lambda 函数。

这篇文章对您有很大帮助Debug Serverless app by VS Code。 谢谢

【讨论】:

【参考方案2】:

我没用过这个方法,所以不能说什么。我可以推荐 serverless-offline 作为不同的解决方案。 serverless-offline

【讨论】:

以上是关于对于 AWS lambda 无服务器 nodejs 应用程序,您如何在开发环境中执行请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何在无服务器框架或 AWS lambda 中启用节点 js 的实验性功能

在本地测试 Elasticache 和无服务器 AWS Lambda

从lambda层加载时无服务器脱机未定义模块

Amazon AWS Lambda NodeJS日志记录

AWS Lambda 中的 Amazon S3 waitFor()

AWS Lambda/APIG - 新 Sequelize 的新 PostgresDialect 的新 ConnectionManager 出错