【问题标题】:Debugging nest.js application with vscode使用 vscode 调试 nest.js 应用程序
【发布时间】:2018-09-05 09:11:49
【问题描述】:

我正在测试 nest.js 框架,但我正在努力使用 VSCode 运行它,以便正确调试我的代码。这与此处Running nest.js from VS Code 描述的问题几乎相同。但是我确保我使用的是最新的软件包。我总是收到这个错误:

Error: Cannot find module 'cats/cats.module'
    at Function.Module._resolveFilename (module.js:485:15)
    at Function.Module._load (module.js:437:25)
    at Module.require (module.js:513:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (c:\Users\user\Documents\random-api\dist\app.module.js:11:26)
    at Module._compile (module.js:569:30)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:503:32)
    at tryModuleLoad (module.js:466:12)
    at Function.Module._load (module.js:458:3)

npm run start 完美运行,但我想用 VSCode IDE 调试应用程序。

我的 package.json 依赖项:

  "dependencies": {
    "@nestjs/common": "^4.6.6",
    "@nestjs/core": "^4.6.6",
    "@nestjs/microservices": "^4.6.6",
    "@nestjs/testing": "^4.6.6",
    "@nestjs/websockets": "^4.6.6",
    "reflect-metadata": "^0.1.12",
    "rxjs": "^5.5.7",
    "typescript": "^2.7.2"
  },
  "devDependencies": {
    "@types/express": "^4.11.1",
    "@types/jest": "^22.2.2",
    "@types/node": "^9.6.0",
    "@types/supertest": "^2.0.4",
    "jest": "^22.4.3",
    "nodemon": "^1.17.2",
    "prettier": "^1.11.1",
    "supertest": "^3.0.0",
    "ts-jest": "^22.4.2",
    "ts-node": "^5.0.1",
    "tsconfig-paths": "^3.1.3",
    "tslint": "5.9.1",
    "tslint-microsoft-contrib": "^5.0.3"
  },

我的 vscode 的 launch.json:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "Launch Program",
            "program": "${workspaceFolder}\\dist\\main.js",
            "smartStep": true,
            "outFiles": [
                "${workspaceFolder}/dist/**/*.js"
            ]
        }
    ]
}

我尝试使用 typescript 文件作为路径的相同 launch.json,但抛出了相同的异常:

"program": "${workspaceFolder}\\src\\main.ts",

【问题讨论】:

  • 所以我已经确保所有依赖项都在那里,确保你所有的 vs 代码插件都是更新的。有时一个有问题的插件会导致 vs 代码给出这样的错误,
  • Vscode 和所有插件都是最新的。
  • 我认为它与“相对进口”有关。当我使用 import { PlayersModule } from './players/players.module'; 而不是 import { PlayersModule } from 'players/players.module'; 它工作正常。
  • 这对我有用:Step by step instructions
  • 以下是对我有用的分步说明:Step by step instructions

标签: typescript


【解决方案1】:

试试这个 launch.json:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "Debug Nest Framework",
            "args": ["${workspaceFolder}/src/main.ts"],
            "runtimeArgs": ["--nolazy", "-r", "ts-node/register"],
            "sourceMaps": true,
            "cwd": "${workspaceRoot}",
            "protocol": "inspector"
        }
    ]
}

【讨论】:

  • 很好,但是在使用模块别名时还需要注册 tsconfig-paths,如下所示: "runtimeArgs": ["--nolazy", "-r", "ts-node/register" , "-r", "tsconfig-paths/register"],否则调试器会喊"找不到模块..."。如果您同意,请更新您的答案吗?
  • 成功了。我赞成这个回应。但是,它不会在监视模式下运行应用程序。有没有办法在手表模式下运行它?
  • 要在监视模式下运行应用程序,请运行此命令 -> npm run start:dev 。你会在 package.json 中找到所有配置
  • 不能使用嵌套全局模块。如何修复使用
  • @Saurabh47g 不清楚。如何从 launch.json 使用 npm run start:dev?
【解决方案2】:

我尝试了接受的答案和所有其他差异,但没有一个对我有用,但真正对我有用的是连接到 9229 端口。我所做的是使用以下配置添加/修改您的launch.json

.vscode/launch.json

{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "attach",
      "name": "Attach NestJS WS",
      "port": 9229,
      "restart": true,
      "stopOnEntry": false,
      "protocol": "inspector"
    }
  ]
}

package.json 中(嵌套新的CLI 命令,需要6.8.x,请参阅此blog

{
  "name": "nest-app",
  "scripts": {
    "start:debug": "nest start --debug --watch"
  }
}

终于成功了!

【讨论】:

  • 效果很好,谢谢!我更喜欢附加到正在运行的实例,因为我发现它不那么具有侵入性。
  • 如果你去设置=>调试>节点:自动附加并打开它,当你在集成终端中运行npm run start:debug时,VSCode会自动附加。
  • @JWess 我刚试了你说的,还是不行
  • 这个!将调试器附加到已经运行的进程似乎总是更容易。
  • 我会说这应该是正确的答案,因为它使用本机嵌套配置并且仅使用 vscode 作为工具(应该是)
【解决方案3】:

无需搞砸.vscode/launch.json,只需关注官方Auto Attach intro 和... Just Works!

比如我要调试我的项目quiz:

  1. 将“自动附加”切换为“开启”

  1. 像往常一样运行应用程序,因为这个项目是npm run server:dev

  2. 应用启动成功后,附加到进程

  1. 看到第一个了吗?点击它!完毕!现在您可以单击断点并进行检查!

【讨论】:

  • 太棒了!即使仅在第一步之后,这也对我有用。我已经在调试模式下启动了我的 nestjs 应用程序(npm run start:debug)。所以按下 Ctrl+Shift+P 并输入“Auto Attach”,选择并瞧,我可以设置断点和调试器语句!谢谢!
  • 这应该被标记为已接受的答案。非常感谢。
  • 这是我所有项目中最简单的首选解决方案。
  • 这是最简单的答案。谢谢!
  • 正常工作 :) 这是最直接的答案
【解决方案4】:

如果你想在终端输出日志+所有调试功能,你可以使用npm启动+附加,这里是launch.json的配置:

{
  "type": "node",
  "request": "launch",
  "name": "Nest Debug",
  "runtimeExecutable": "npm",
  "runtimeArgs": [
    "run",
    "start:debug",
    "--",
    "--inspect-brk"
  ],
  "console": "integratedTerminal",
  "restart": true,
  "protocol": "auto",
  "port": 9229,
  "autoAttachChildProcesses": true
},

将在控制台+调试中显示完整的日志输出

【讨论】:

  • 这是迄今为止我为新 NestJS 用户找到的最佳解决方案。这会编译、调试和监视项目中文件的更改。其他一切都错过了刚刚学习 NestJS 的人。
  • 天哪,这是最好的解决方案。这应该是投票赞成的答案。
  • 效果很好,只需从侧面菜单或更广为人知的活动栏访问的 vscode“运行和调试”窗口创建一个 launch.json 并将其粘贴到“配置”中:[]。谢谢@Sasha Ladnov
【解决方案5】:

这是一个有效的配置。希望这对某人有帮助:)

确保在runtimeArgs 下添加tsconfig-paths/register 行,否则您将收到错误消息,提示您的某些用户定义模块未找到。

如果您的根项目文件夹下有一个应用程序文件夹名称,请将 &lt;YOUR_APP_ROOT_FOLDER&gt; 名称替换为您的应用程序文件夹名称,否则将其从脚本的路径中删除。

注意:确保在 vscode 上执行此调试配置之前停止运行您的应用,因为此调试脚本将在同一端口上启动您的应用的新实例。

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "Debug Nest Framework",
            "args": [
                "${workspaceFolder}/<YOUR_APP_ROOT_FOLDER>/src/main.ts"
            ],
            "runtimeArgs": [
                "--nolazy",
                "-r",
                "ts-node/register",
                "-r",
                "tsconfig-paths/register"
            ],
            "sourceMaps": true,
            "cwd": "${workspaceRoot}/<YOUR_APP_ROOT_FOLDER>",
            "protocol": "inspector"
        }
    ]
}

【讨论】:

    【解决方案6】:

    此设置适用于我

    {
      "name": "Launch app",
      "type": "node",
      "request": "launch",
      "args": [
        "src/main.ts"
      ],
      "runtimeArgs": [
        "-r",
        "ts-node/register",
        "-r",
        "tsconfig-paths/register"
      ],
      "cwd": "${workspaceRoot}",
      "protocol": "inspector",
      "internalConsoleOptions": "openOnSessionStart",
      "env": {
        "NODE_ENV": "local",
        "NODE_PORT": "9000"
      },
      "sourceMaps": true,
      "console": "internalConsole",
      "outputCapture": "std"
    }
    

    here获取它

    【讨论】:

      【解决方案7】:

      对于使用Nrwl的人:

      Launch.json(由 @ghiscoding 提供)

      {
            "type": "node",
            "request": "attach",
            "name": "Attach NestJS WS",
            "port": 9229,
            "restart": true,
            "stopOnEntry": false,
            "protocol": "inspector"
          }
      

      终端

      ng serve nestjs_project --port 9229
      

      【讨论】:

      • 这在 Nx 工作区中对我有用,没有 launch.json 但自动附加设置为打开。如果你省略端口参数,它对我不起作用。
      【解决方案8】:

      在launch.json中有

      {
      // Use IntelliSense to learn about possible attributes.
      // Hover to view descriptions of existing attributes.
      // For more information, visit: https://go.microsoft.com/fwlink/linkid=830387
        "version": "0.2.0",
         "configurations": [
          {
              "type": "node",
              "request": "launch",
              "name": "Debug Nest Framework",
              "args": ["${workspaceFolder}/src/main.ts"],
              "runtimeArgs": ["--nolazy", "-r", "ts-node/register"],
              "sourceMaps": true,
              "cwd": "${workspaceRoot}",
              "protocol": "inspector"
          }
         ]
        }
      

      【讨论】:

      • 已编辑以反映撰写本文时使用的内容
      【解决方案9】:

      我所做的是使用 package.json 中的一个脚本自动附加 vs 代码调试过程。最重要的是,我使用了 nodemon,如果您在开发中进行了任何更改,它会与调试器一起自动重启。

      这个过程需要你全局安装nodemon,并在文件夹的根目录下添加一个nodemon-debug.json文件,如下所示。

      nodemon-debug.json

      {
          "watch": ["src"],
          "ext": "ts",
          "ignore": ["src/**/*.spec.ts"],
          "exec": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register src/main.ts"
      }
      

      然后在 package.json 中,添加一个看起来像这样的脚本

      "debug": "nodemon --config nodemon-debug.json"
      

      然后在 VS Code 中,点击 F1 > 搜索 Debug: Toggle Auto Attach。点击它以启用它。

      然后通过运行以下命令启动调试过程-

      npm run debug
      

      调试器自动开启。

      这个过程的好处是nodemon,每次你对代码进行一些修改并需要它时,它会自动与调试器一起启动。

      如需更详细的解释,请浏览此link。为我工作。

      【讨论】:

        【解决方案10】:

        我只需要通过@JWess 将this comment“提升”为真正的答案(并使用相关设置的当前位置更新它),以便更容易找到它(这对我来说是开箱即用的一个新生成的嵌套项目,无需更改任何其他配置或文件):

        如果您转到Settings &gt; Extensions &gt; Node debug 并查找设置Debug › Node: Auto Attach 并将其打开,则当您在集成终端中运行npm run start:debug(即nest start --debug --watch)时,VSCode 将自动附加。

        【讨论】:

          【解决方案11】:

          如果你遇到这样的错误

          无法读取 node_modules / typescript / lib / 的源映射 打字稿.js

          "type" 设置为 "pwa-node" 而不是 "node"

          如果你遇到这样的错误

          找不到模块 src/interceptors/auth.interceptor

          "runtimeArgs" 设置为

                [
                  "--nolazy",
                  "-r",
                  "ts-node/register",
                  "-r",
                  "tsconfig-paths/register"
                ]
          

          而不是

          [
             "--nolazy", "-r", "ts-node/register"
          ]
          

          结果:

          {
            // Use IntelliSense to learn about possible attributes.
            // Hover to view descriptions of existing attributes.
            // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
            "version": "0.2.0",
            "configurations": [
              {
                "type": "pwa-node",
                "request": "launch",
                "name": "Debug Nest Framework",
                "args": ["${workspaceFolder}/src/main.ts"],
                "runtimeArgs": [
                  "--nolazy",
                  "-r",
                  "ts-node/register",
                  "-r",
                  "tsconfig-paths/register"
                ],
                "sourceMaps": true,
                "cwd": "${workspaceRoot}"
                //   "protocol": "inspector"
              }
            ],
            "resolveSourceMapLocations": ["${workspaceFolder}/**", "!**/node_modules/**"]
          }
          

          但是我使用这个配置

          {
            "version": "0.2.0",
            "configurations": [
                {
                    "type": "node",
                    "request": "launch",
                    "name": "Debug Nest Framework",
                    "args": [
                        "${workspaceFolder}/src/main.ts"
                    ],
                    "runtimeArgs": [
                        "--nolazy",
                        "-r",
                        "ts-node/register",
                        "-r",
                        "tsconfig-paths/register"
                    ],
                    "sourceMaps": true,
                    "envFile": "${workspaceFolder}/.env",
                    "cwd": "${workspaceRoot}",
                    "console": "integratedTerminal",
                    "protocol": "inspector"
                },
                {
                  "name": "Debug Jest Tests",
                  "type": "node",
                  "request": "launch",
                  "runtimeArgs": ["--inspect-brk", "${workspaceRoot}/node_modules/.bin/jest", "--runInBand", "--coverage", "false"],
                  "console": "integratedTerminal"
              }
            ]
          }
          

          感谢本站:Click me

          【讨论】:

            【解决方案12】:

            我在 Nx Workspace(Nx 版本 11.6.3)中使用 NestJs 应用程序,它在不使用任何 launch.json 设置的情况下为我工作。

            在 VS Code 中,我刚刚启用了 Auto Attach > Smart 并使用以下命令运行了我的 NestJS 应用程序:
            nx serve &lt;nest-js-app-name&gt; --inspect=inspect --port=9229
            VS Code 会自动附加调试器。

            我的 launch.json 有一个配置来启动我的前端应用程序,而上述过程会在您启动 NestJS 应用程序时自动附加调试器。这样我就可以同时启动前端和后端进行调试。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2023-03-12
              • 2019-06-27
              • 2016-08-28
              • 2017-12-11
              • 2019-01-12
              • 2020-05-28
              • 2016-07-06
              相关资源
              最近更新 更多