gpt4 book ai didi

node.js - 如何使用 TypeScript 编写的 API Gateway 在 VS Code 中调试本地 AWS Lambda 函数?

转载 作者:行者123 更新时间:2023-12-03 12:10:36 24 4
gpt4 key购买 nike

我们即将开始使用 Lambda 函数。
我们有必须使用 TypeScript 的技术限制。
当从 Postman 调用相关端点时,我希望能够在 VS Code 中调试我的 ts 文件。
所以,我们有以下开发环境:

  • Windows 10
  • 适用于 Windows 的 Docker(使用 Hyper-V,不使用 WSL 2)
  • typescript 4.1
  • Node 12.17
  • SAM CLI 1.13.2

  • 我用过 sam init使用 Hello World 模板生成初始文件夹结构。
    我已经对其进行了增强(主要基于 this article )以使用 TypeScript。
    文件夹结构
    .
    ├── template.yaml
    ├── .aws-sam
    ├── .vscode
    | └── launch.json
    ├── events
    ├── hello-world
    | ├── dist
    | ├── app.js
    | └── app.js.map
    | ├── src
    | └── app.ts
    | ├── package.json
    | └── tsconfig.json
    template.yaml
    AWSTemplateFormatVersion: '2010-09-09'
    Transform: AWS::Serverless-2016-10-31
    Description: >
    LambdaWithApiGateWayDebug

    Sample SAM Template for LambdaWithApiGateWayDebug

    Resources:
    HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
    CodeUri: hello-world/dist
    Handler: app.lambdaHandler
    Runtime: nodejs12.x
    Events:
    HelloWorld:
    Type: Api
    Properties:
    Path: /hello
    Method: get
    tsconfig.json
    {
    "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "sourceMap": true,
    "outDir": "./dist",
    "strict": true,
    "noImplicitAny": true,
    "esModuleInterop": true,
    "sourceRoot": "./src",
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
    },
    "include": ["src/**/*"],
    "exclude": ["node_modules", "**/*.spec.ts"]
    }
    package.json
    {
    "name": "hello_world",
    "version": "1.0.0",
    "description": "hello world sample for NodeJS",
    "main": "app.js",
    "repository": "https://github.com/awslabs/aws-sam-cli/tree/develop/samcli/local/init/templates/cookiecutter-aws-sam-hello-nodejs",
    "scripts": {
    "compile": "tsc",
    "start": "sam local start-api -t ../template.yaml -p 5000 -d 5678"
    },
    "dependencies": {
    "@types/aws-lambda": "^8.10.64",
    "@types/node": "^14.14.10",
    "aws-sdk": "^2.805.0",
    "source-map-support": "^0.5.19",
    "typescript": "^4.1.2"
    }
    }
    app.ts
    import { APIGatewayProxyEvent, APIGatewayProxyResult } from "aws-lambda";

    export const lambdaHandler = async (event: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> => {
    const queries = JSON.stringify(event.queryStringParameters);
    return {
    statusCode: 200,
    body: `Queries: ${queries}`
    }
    }
    app.js
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    exports.lambdaHandler = void 0;
    const lambdaHandler = async (event) => {
    const queries = JSON.stringify(event.queryStringParameters);
    return {
    statusCode: 200,
    body: `Queries: ${queries}`
    };
    };
    exports.lambdaHandler = lambdaHandler;
    //# sourceMappingURL=app.js.map
    app.js.map
    {"version":3,"file":"app.js","sourceRoot":"./src/","sources":["app.ts"],"names":[],"mappings":";;;AAEO,MAAM,aAAa,GAAG,KAAK,EAAE,KAA2B,EAAkC,EAAE;IAC/F,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC5D,OAAO;QACL,UAAU,EAAE,GAAG;QACf,IAAI,EAAE,YAAY,OAAO,EAAE;KAC5B,CAAA;AACL,CAAC,CAAA;AANY,QAAA,aAAa,iBAMzB"}
    launch.json
    {
    "version": "0.2.0",
    "configurations": [
    {
    "type": "node",
    "request": "attach",
    "name": "attach Program",
    "port": 5678,
    "address": "localhost",
    "localRoot": "${workspaceFolder}/hello-world/dist",
    "remoteRoot": "/var/task",
    "protocol": "inspector",
    "sourceMaps": true,
    "smartStep": true,
    "outFiles": ["${workspaceFolder}/hello-world/dist"]
    }
    ]
    }
    如你看到的:
  • 我的 lambda 函数定义在 hello-world/src/app.ts
  • 符合commonJs和ES2020目标到hello-world/dist/app.js带源图
  • 该模板公开了位于 hello-world/dist 下的处理程序。通过 localhost:5000/hello端点
  • 调试器正在监听端口 5678

  • 所以,当我调用 npm run start然后它打印以下输出:
    > hello_world@1.0.0 start C:\temp\AWS\LambdaWithApiGateWayDebug\hello-world
    > sam local start-api -t ../template.yaml -p 5000 -d 5678

    Mounting HelloWorldFunction at http://127.0.0.1:5000/hello [GET]
    You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template
    2020-12-08 11:40:48 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
    当我通过 Postman 向端点发出请求时,控制台会扩展为以下文本:
    Mounting C:\temp\AWS\LambdaWithApiGateWayDebug\hello-world\dist as /var/task:ro,delegated inside runtime container
    START RequestId: 04d884cf-fa96-4d58-b41c-e4196e12de13 Version: $LATEST
    Debugger listening on ws://0.0.0.0:5678/d6702717-f291-42cd-8056-22b9f029f4dd
    For help, see: https://nodejs.org/en/docs/inspector
    当我将 VS Code 附加到 Node 进程时,我只能调试 app.js而不是 app.ts .
    控制台日志结束:
    Debugger attached.
    END RequestId: 04d884cf-fa96-4d58-b41c-e4196e12de13
    REPORT RequestId: 04d884cf-fa96-4d58-b41c-e4196e12de13 Init Duration: 0.12 ms Duration: 7064.19 ms Billed Duration: 7100 ms Memory Size: 128 MB Max Memory Used: 128 MB
    No Content-Type given. Defaulting to 'application/json'.
    2020-12-08 11:40:58 127.0.0.1 - - [08/Dec/2020 11:40:58] "GET /hello HTTP/1.1" 200 -

    我应该更改什么才能调试我的 app.ts而不是 app.js ?

    最佳答案

    我写了一篇中等文章,解释了如何创建、调用和调试 TypeScript lambda 函数。
    更多详情请查看以下 link .
    要求

  • SAM CLI
  • Docker
  • Node
  • Visual studio code

  • 1-创建一个nodejs12x;
  • 创建一个 nodejs12x lambda;
  • 安装 TypeScript:npm i -g typescript
  • 初始化 typescript :tsc --init (它将创建 tsconfig.json 文件)
  • 将创建的 tsconfig.json 文件替换为以下代码:
    {
    "compilerOptions": {
    "module": "CommonJS",
    "target": "ES2017",
    "noImplicitAny": true,
    "preserveConstEnums": true,
    "outDir": "./built",
    "sourceMap": true
    },
    "include": ["handler/**/*"],
    "exclude": ["node_modules", "**/*.spec.ts"]
    }
  • 删除 app.js 文件;
  • 在处理程序文件夹内的 TypeScript 代码中创建您的 lambda(您需要创建它):
    import { 
    APIGatewayProxyEvent,
    APIGatewayProxyResult
    } from "aws-lambda";

    export const lambdaHandler = async (
    event: APIGatewayProxyEvent
    ): Promise<APIGatewayProxyResult> => {
    const queries = JSON.stringify(event.queryStringParameters);
    return {
    statusCode: 200,
    body: `Queries: ${queries}`
    }
    }
  • 调整模板.yaml。更改 lambda 的 CodeUri 路径:CodeUri: hello-world/built
  • 安装需要的 Node 包:npm install typescript @types/aws-lambda @types/node -save-dev
  • 包json:
    {
    "name": "typescript_lambda",
    "version": "1.0.0",
    "description": "hello world sample for TypeScript",
    "main": "app.js",
    "repository": "https://github.com/jafreitas90/AWS",
    "author": "Jorge Freitas",
    "license": "JorgeFreitas Ltd :)",
    "dependencies": {
    },
    "scripts": {
    "compile": "tsc"
    },
    "devDependencies": {
    "@types/aws-lambda": "^8.10.71",
    "@types/node": "^14.14.22",
    "aws-sdk": "^2.815.0",
    "typescript": "^4.1.3"
    }
    }
  • 安装
  • npm 运行编译
  • 在 lambda 函数(TypeScript 代码)中设置断点。在左侧面板上选择调试,然后开始调试(顶部的绿色按钮)。就是这样:)
  • 项目结构

  • enter image description here
    Please find more details in my tutorial.
    source code

    关于node.js - 如何使用 TypeScript 编写的 API Gateway 在 VS Code 中调试本地 AWS Lambda 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65197581/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com