如何使用来自 VSCode 的 npm 运行脚本进行调试?

我以前使用 Gulp 和运行 Gulp 从 VisualStudio 代码调试器启动我的应用程序和侦听器,但是最近需要切换到通过 Npm运行脚本。不幸的是,在 VSCode 中,我无法通过调试器运行 Npm脚本,所以我不得不运行 节点来直接启动我的服务器,从而摆脱了自动重新加载代码的侦听器任务。

这似乎是一件应该很简单的事情,但到目前为止,我还没有太多的运气。下面是我试图使用的 launch.json 文件的一个片段,但是找不到 Npm

{
...
"program": "npm",
"args": [
"run",
"debug"
],
...
}

这给我带来了以下错误。

错误请求“启动”: 程序“ c: myproject npm”不存在

相关资源:

120167 次浏览

NPM scripts and gulp is not really meant for launching your application, but rather for running tasks like compilation. If it is a node application, I would recommend you to configure your launch.json that way without npm. If you have complicated listeners or process managers like PM2, instead start your application manually from the process manager and then use an Attach configuration.

For npm tasks, you can specify a tasks.json with "command": "npm" and "args": ["run"].

  1. Configure a new debug target in your .vscode/launch.json:

    {
    "name": "Attach To npm",
    "type": "node",
    "request": "attach",
    "port": 5858,
    "address": "localhost",
    "restart": false,
    "sourceMaps": false,
    "outDir": null,
    "localRoot": "${workspaceRoot}",
    "remoteRoot": null
    }
    
  2. Config your npm to run the node with --debug-brk option:

    "scripts": {
    "start": "node app.js",
    "debug": "node --debug-brk app.js"
    ...
    
  3. Start your app from the shell as:

     $npm run debug
    
  4. The program by default will be waiting in the port 5858 to attach the debugger

  5. So, run the debugger in your visual studio code ("Attach To npm").

  6. Enjoy your debugger :)

It appears that VS Code will support npm scripts and other launch scenarios since the release from October 2016.

Below is an example as it was proposed on GitHub but has been adjusted to use --inspect-brk instead of the originally prposed --debug-brk option.

packages.json

  "scripts": {
"debug": "node --nolazy --inspect-brk=5858 myProgram.js"
},

vscode launch config

{
"name": "Launch via NPM",
"type": "node",
"request": "launch",
"cwd": "${workspaceRoot}",
"runtimeExecutable": "npm",
"runtimeArgs": [
"run-script", "debug"
],
"port": 5858
}

More recent updates for Visual Studio Code as of Summer of 2022 show that there are various ways to set up debugging support with Node.js. These methods include auto attaching to either processes started from the VSCode Integrated Terminal or the JavaScript debug terminal, or by using the traditional launch config which is now extensively documented.

I tried the solutions given by GutiMac and Jpierson but for some reasons I was not able to make the debugger work with any of those.

An alternative solution which worked fine for me (Ubuntu 16, node 8.9.1, VS 1.8.1) is to use this simple app launcher (to be added in the configuration array of VS launch.json):

{
"type": "node",
"request": "launch",
"name": "Launch Node App",
"program": "${workspaceFolder}/my-app/my-npm-start-script-dir/index.js"
}

It is feasible with npm whithout having to alter your scripts section in package.json

The trick here is to pass the --inspect-brk=9229 to node.

The command will look like npm run start -- --inspect-brk=9229

Here's the .vscode/launch.json:

{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch via NPM",
"runtimeExecutable": "${env:NVM_BIN}/npm", //change this to your npm path
"runtimeArgs": [
"run-script",
"start",
"--",
"--inspect-brk=9229"
],
"port": 9229
},


]
}

I haven't found a solution how to pass --inspect-brk=9229 to node when you are running external npm run scripts. So here is a solution for the workaround launch configuration.

If you want to debug external npm scripts with parameters or even chain of scripts, you can run them directly from node. For example such scripts as angular-cli run scripts:

"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
},

Most of external scrips live in node_modules/bin folder. You just need to find you script and figure out what js file it runs. For ng it node_modules/@angular/cli/bin/ng. So here is final launch configuration:

{
"type": "node",
"request": "launch",
"name": "Launch ng build",
"runtimeExecutable": "node",
"runtimeArgs": [
"--inspect-brk=9229",
"node_modules/@angular/cli/bin/ng"
],
"args": ["build"],
"port": 9229
}

So when you are starting debuging you get next command started:

node --inspect-brk=9229 node_modules/@angular/cli/bin/ng build

Now you are able to put a breakpoint to external scripts.

My situation was a little different. I was testing an api server and also a client (for that api server). this is what worked for me.

package.json (of the api server)

  "scripts": {
"start": "DEBUG=users:* PORT=3333 SEQUELIZE_CONNECT=models/sequelize-sqlite.yaml node user-server",
"debug": "DEBUG=users:* PORT=3333 SEQUELIZE_CONNECT=models/sequelize-sqlite.yaml node --inspect-brk user-server"
},

launch.json (of the api server)

"configurations": [
{
"type": "node",
"request": "attach",
"name": "Attach to Remote",
"address": "localhost",
"port": 9229,
"localRoot": "${workspaceFolder}",
"remoteRoot": "${workspaceFolder}",
"skipFiles": [
"<node_internals>/**"
]
},

with that done, I would do the following.

  • npm run debug
  • you should immediately get something like this - Debugger listening on ws://127.0.0.1:9229/8df6503b-00e9-43da-ac53-c54a013ba53f
  • Attach to (in the debug menu) "Attach to Remote" (or whatever name you gave if you have multiple debug configurations) and then hit Run.
  • if successful, you will immediately see something like this - Debugger attached

That would run the api server, and also have the debugger start debugging for me.

Finally, to actually test the api client, I would run the api client file like this. note - all files are in the root folder. if your files are distributed elsewhere, you will have to modify the localRoot and remoteRoot accordingly.

PORT=3333 node users-add-testthisman1.js

Here, its important to note the client configuration I had.

 var client = restify.createJsonClient({
url: 'http://localhost:'+process.env.PORT,
version: '*'
});

If you have a different configuration, then, your command line will have different arguments, of course.

I think what you're looking for is the following configurations.

Add the following object to the configurations array in .vscode/launch.json file.

{
"command": "npm run dev",
"name": "Run npm dev",
"request": "launch",
"type": "node-terminal"
}

And try debugging with the new configuration now. VSCode will take care of the debugger attachment.

Don't forget to replace npm run dev with your desired command.

This is how my launch.json looks like, and it works:

{
"version": "0.2.0",
"configurations": [
{
"name": "Launch via NPM",
"request": "launch",
"runtimeArgs": [
"run-script",
"dev"
],
"runtimeExecutable": "npm",
"skipFiles": [
"<node_internals>/**"
],
"type": "pwa-node"
}
]
}

VS Code now gives you a "Debug Script" button when you hover over the name of a script in package.json.

enter image description here

Easiest method I got to work:


1. Inside package.json:

"scripts": {
"startDebug": "node --inspect index.js"
}

(Note: Does not work with --inspect-brk, for some reason.)


2. In VSCode: Ctrl+Shift+P => Debug: Toggle Auto Attach => Only with flag (Only auto attach when the '--inspect' flag is given)

It should now say Auto Attach: With Flag at the bottom of VSCode.


3. In VSCode Terminal: npm run startDebug

This should run your script in debugger mode, with working breakpoints.

Most simple and straightforward solution for me. This will compile .ts files into .js and then run the node app in debug mode

.vscode/launch.json


{
"version": "0.2.0",
"configurations": [
{
"name": "Launch via NPM",
"request": "launch",
"runtimeArgs": [
"run",
"debug_my_app"
],
"runtimeExecutable": "npm",
"skipFiles": [
"<node_internals>/**"
],
"type": "pwa-node"
}
]
}

package.json

{
"dependencies": {
"axios": "^0.24.0"
},
"scripts": {
"debug_my_app": "tsc && node index.js"
}
}

start the debugger

enter image description here

I just noticed "JavaScript Debug Terminal" in the "New Terminal" dropdown. VSCode automatically attaches to anything you run in that terminal window.

enter image description here

No more complicated debug configs! 🎉🎉🎉