Как отлаживать проект nodemon в VSCode

У меня есть проект NodeJs, и я запускаю его с помощью nodemon,
Я хочу запустить его в режиме отладки для задач разработки, но не могу этого сделать.

Я обнаружил, что мне нужно добавить правильную конфигурацию в файл launch.json в папке .vscode,
у меня есть файл app.js, который является основным файлом приложения.
И приложение работает на node version 4.6.2 и на Port 8080 .
Обычно я запускаю приложение с помощью команды npm run dev.

Ниже приведен мой файл 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": "MyApp",
            "program": "${workspaceFolder}/app.js",
            "runtimeVersion": "4.6.2",
            "protocol": "legacy",
            "port": 8080
            //"runtimeExecutable": "/home/user/.nvm/versions/node/v4.6.2/bin/node"
        },
        {
            "type": "node",
            "request": "launch",
            "name": "nodemon",
            "runtimeExecutable": "nodemon",
            "program": "${workspaceRoot}/app.js",
            "restart": true,
            "console": "integratedTerminal",
            "internalConsoleOptions": "neverOpen",
            "runtimeVersion": "4.6.2",
            "protocol": "legacy",
            "port": 8080
        },
        {
            "type": "node",
            "request": "launch",
            "name": "DEBUG",
            "runtimeExecutable": "nodemon",
            "program": "${workspaceFolder}/app.js",
            "restart": true,
            "console": "integratedTerminal",
            "internalConsoleOptions": "neverOpen",
            "runtimeVersion": "4.6.2",
            "protocol": "legacy",
            "port": 8080
        }
    ]
}

Файл package.json выглядит следующим образом -

{
  "name": "myapp",
  "description": "myapp",
  "version": "1.35.0",
  "private": true,
  "scripts": {
    "dev": "nodemon app.js",
    "debug": "nodemon app.js"
  },
  "dependencies": {
    "async": "1.3.0",
    "aws-sdk": "2.7.20",
    "aws-xray-sdk": "^2.1.0",
    "aws-xray-sdk-restify": "^1.3.0-beta",
    "bcrypt": "0.8.5",
    "body-parser": "1.12.3",
    "compression": "^1.7.0",
    "connect-flash": "0.1.1",
    "cookie-parser": "1.3.4",
    "cron": "1.0.9",
    "csurf": "^1.9.0",
    "csvtojson": "^1.1.2",
    "date-utils": "1.2.16",
    "dotenv": "4.0.0",
    "email-templates": "1.2.1",
    "express": "4.12.3",
    "express-handlebars": "2.0.0",
    "express-jwt": "^5.1.0",
    "express-mailer": "0.2.4",
    "express-session": "1.11.1",
    "express-validator": "3.1.3",
    "handlebars": "^3.0.3",
    "helmet": "^3.5.0",
    "html-pdf": "1.4.0",
    "json-2-csv": "2.0.12",
    "jsonwebtoken": "^7.3.0",
    "multer": "^0.1.8",
    "mysql": "2.6.2",
    "newrelic": "1.25.0",
    "node-schedule": "^1.3.0",
    "nodemailer": "^1.3.4",
    "nodemailer-ses-transport": "1.2.0",
    "passport": "0.2.1",
    "passport-local": "1.0.0",
    "path": "0.11.14",
    "promise": "7.0.0",
    "qs": "^2.4.1",
    "replaceall": "0.1.6",
    "request": "2.55.0",
    "run-parallel": "1.1.0",
    "validator": "^7.0.0",
    "winston": "^2.3.1",
    "winston-daily-rotate-file": "^1.7.0",
    "xlsx": "0.8.8"
  },
  "devDependencies": {
    "nodemon": "^1.17.3"
  }
}

Приложение запускается, когда я запускаю конфигурации DEBUG и nodemon.
Но код не приостанавливается на точках останова, которые я установил в файле app.js.

Справочные ссылки -
1. https://github.com/Microsoft/vscode-recipes/tree/master/nodemon
2. https://github.com/bdspen/nodemon_vscode
3. Можно ли настроить код Visual Studio для запуска с помощью nodemon
4. Не удается выполнить отладку в VSCode путем подключения к Chrome
5. https://code.visualstudio.com/docs/editor/debugging

Какие изменения требуются в package.json или какие-либо исправления в конфигурации запуска - launch.json, которые помогут мне отлаживать приложение в VSCode для моего варианта использования?


person Ani    schedule 17.11.2018    source источник


Ответы (6)


Измените package.json на

"scripts": {
    "dev": "node app.js",
    "debug": "nodemon --inspect app.js"
}

--inspect предназначен для версий> = 6.3. --legacy или --auto для более старых версий

И launch.json в:

"version": "0.2.0",
"configurations": [
    {
        "type": "node",
        "request": "attach",
        "name": "Node: Nodemon",
        "processId": "${command:PickProcess}",
        "restart": true,
        "protocol": "inspector"
    }
]

флаг перезапуска здесь является ключевым.

Запустить приложение через новый скрипт отладки

npm запустить отладку

  • В режиме отладки выберите конфигурацию Узел: Nodemon и нажмите воспроизведение или F5.
  • Выберите процесс, начатый выше

Подробнее: vscode nodemon рецепт

person The Geek    schedule 17.01.2019
comment
--inspect is for versions >= 6.3. --legacy or --auto for older versions относится к node, текущий - v15. - person Timo; 12.04.2021
comment
Примечание: процесс, который вы должны выбрать, НЕ является процессом nodemon, а процессом node, который запускает ваше приложение. - person Marc; 20.04.2021

В конфигурации vscode вы можете установить runtimeExecutable, который будет запускать указанную вами программу. установите restart:true, чтобы отладчик кода vs мог перезапустить процесс.

Это пример конфигурации:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node", 
            "request": "launch",
            "name": "nodemon",
            "runtimeExecutable": "nodemon",
            "program": "${workspaceFolder}/bin/www",
            "restart": true,
            "console": "integratedTerminal",
            "internalConsoleOptions": "neverOpen",
            "env": {
                "debug": "app:*",
            }
        }
    ]
}

Обновите program до файла узла, который нужно отлаживать.

Это проще, чем прикрепить отладчик к работающему процессу узла.

person Ridham Tarpara    schedule 17.12.2019
comment
Я знаю, что мы не должны писать комментарии только для того, чтобы поблагодарить, но БОЛЬШОЕ СПАСИБО. Я не знаю, сколько разных launch.json я безуспешно пробовал до этого! (хотя в моем случае мне пришлось заменить "${workspaceFolder}/bin/www" на "${workspaceFolder}/server"). - person Sebastián Vansteenkiste; 22.01.2021
comment
Я узнал, что когда я использую launch, как в вашем примере, мне нужен ключ program, связанный с моим файлом отладки html (но ваш program относится к папке, а не к файлу). Если я использую attach, как в другом примере Geek, мне нужны processId и pick the process, которые я хочу отлаживать (что я начал раньше с nodemon). - person Timo; 12.04.2021

nodemon прослушивает изменения файлов и перезапускает приложение в другом процессе

Итак, ваша конфигурация верна, но отладчик никогда не «видит» точки останова.

Нет смысла запускать режим отладки с nodemon.

Это функция, которую вы можете запросить в VScode (автоматический перезапуск при изменении кода)

person Mazki516    schedule 17.11.2018
comment
Итак, какие изменения мне нужно сделать, чтобы запустить его в режиме отладки, какие изменения в package.json или launch.json помогут мне отладить? - person Ani; 18.11.2018
comment
Изменения в launch.json. Используйте узел в качестве исполняемого файла, и отладчик начнет останавливаться на точках останова. (Как первый член в вашем launch.jsomn - person Mazki516; 18.11.2018
comment
использовать runtimeExecutable: node вместо runtimeExecutable: nodemon? - person Ani; 18.11.2018
comment
извините, не сработало, приложение запускается, но не останавливается ни на одной из точек останова: '( - person Ani; 18.11.2018

Я столкнулся с аналогичной проблемой, связанной с процессом Dockerized nodemon. Я нашел решение в этой статье. Мне удалось заставить его работать, изменив три вещи:

  1. Добавлен --inspect=0.0.0.0 в сценарий npm, запустивший службу (в моем случае с именем debug):
  "scripts": {
    "debug": "nodemon -w lib -w server.js --inspect=0.0.0.0 server.js"
  }
  1. Убедитесь, что порт 9229 (или любой другой порт отладки, который вы хотите использовать) открыт в контейнере Docker. Я использую docker-compose, поэтому он определен в связанном yaml:
ports:
  - "8080:8080"
  - "9229:9229"
  1. Добавление следующей конфигурации в launch.json в VS Code:
    "configurations": [
        {
            "name": "Attach to Node in Docker",
            "type": "node",
            "address": "localhost",
            "port": 9229,
            "request": "attach",
            "restart": true
        }
    ]

Параметр "restart": true позволяет отладчику автоматически повторно подключаться, когда nodemon перекомпилирует вещи после изменения наблюдаемого файла.

person rotarydial    schedule 04.12.2020

Вы можете запустить и подключить nodemon с помощью F5, однако для этого потребуется немного больше настроек.

Нам нужно будет сначала предварительно запустить nodemon через задачу VS Code, а затем подключиться.

Я использую удаленный отладчик для подключения, поскольку он не требует дополнительных щелчков мыши для выбора процесса для подключения, а средство выбора процесса VS Code в настоящее время сломан в WSL2, которая является моей основной средой разработки.

tasks.json (из этого ответа):

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "npm dev",
      "type": "npm",
      "script": "dev",
      "isBackground": true,

      // This task is run before some debug tasks.
      // Problem is, it's a watch script, and since it never exits, VSCode
      // complains. All this is needed so VSCode just lets it run.
      "problemMatcher": [
        {
          "pattern": [
            {
              "regexp": ".",
              "file": 1,
              "location": 2,
              "message": 3
            }
          ],
          "background": {
            "activeOnStart": true,
            "beginsPattern": ".",
            "endsPattern": "."
          }
        }
      ]
    }
  ]
}

launch.json:

{
  "type": "node",
  "request": "attach",
  "name": "Launch & Attach",
  "restart": true,
  "localRoot": "${workspaceRoot}",
  "remoteRoot": "${workspaceRoot}",
  "preLaunchTask": "npm dev"
}

И в скрипте npm dev (для узла> = 6.9):

nodemon --watch src -e js --exec node --inspect .

Обратите внимание: этот подход не сработает, если ваш процесс запускается более 10 секунд. В этом случае вам нужно будет выяснить, как сигнализировать VS Code, когда задача предварительного запуска завершена. Вероятно, этого можно достичь, поиграв с регулярным выражением beginPattern / endPattern, хотя я этого не пробовал.

person kDar    schedule 16.02.2020

Как предлагает @the Geek,

  1. Вам следует изменить launch.json следующим образом:

    {
        "version": "0.2.0",
        "configurations": 
      [    
        {
            "type": "node",
            "request": "attach",
            "name": "Attach by Process ID",
            "processId": "${command:PickProcess}"
        }
      ]
    }
    
  2. Запустите сервер «npm run dev» (как вы можете видеть, в свойстве «request» мы установили подключение. Таким образом, мы должны сначала запустить сервер, а затем подключить отладчик).

  3. Щелкните слева от vscode на значке, похожем на ошибку. Сверху вы увидите маленький зеленый значок воспроизведения. Щелкните стрелку раскрывающегося списка справа от него и выберите «Прикрепить по идентификатору процесса».

  4. Щелкните значок воспроизведения, и полоса внизу vscode должна стать темно-оранжевой. Теперь попробуйте сделать запрос. Точки останова будут попадать правильно!

person Andreas    schedule 20.01.2020