1669

如何调试 Node.js 服务器应用程序?

现在我主要使用带有打印语句的警报调试,如下所示:

sys.puts(sys.inspect(someVariable));

必须有更好的调试方法。我知道Google Chrome有一个命令行调试器。这个调试器是否也可用于 Node.js?

4

41 回答 41

1298

节点检查器可以节省一天!在任何支持WebSocket的浏览器中使用它。断点、分析器、实时编码等……真是太棒了。

安装它:

npm install -g node-inspector

然后运行:

node-debug app.js
于 2010-10-15T17:17:02.343 回答
781

调试

剖析

  1. node --prof ./app.js
  2. node --prof-process ./the-generated-log-file

堆转储

火焰图

追踪

日志记录

输出调试信息的库

增强堆栈跟踪信息的库

基准测试

其他

遗产

这些用于工作,但不再维护或不再适用于现代节点版本。

于 2013-05-12T21:37:33.650 回答
265

作为 Google Chrome 开发者工具的一部分发布的V8调试器可用于调试 Node.js 脚本。可以在Node.js GitHub wiki中找到有关其工作原理的详细说明。

于 2010-03-29T08:57:06.560 回答
209

从 6.3 版开始, Node 有自己的内置GUI 调试器(使用 Chrome 的 DevTools)

节点内置 GUI 调试器

只需传递检查器标志,您将获得检查器的 URL:

node --inspect server.js

您也可以通过传递--inspect-brk来中断第一行。

于 2016-09-14T14:51:34.727 回答
96

Node.js 版本 0.3.4+ 具有内置的调试支持。

node debug script.js

手册:http ://nodejs.org/api/debugger.html

于 2011-01-16T01:20:53.573 回答
75

Visual Studio Code将是我调试的选择。没有安装任何工具或npm install东西的开销。只需在 package.json 中设置应用程序的起点,VSCode 就会自动在您的解决方案中创建一个配置文件。它建立在Electron之上,Atom 等编辑器也建立在 Electron 之上。

VS Code 提供了与其他 IDE(如 VS、Eclipse 等)类似的调试体验。

在此处输入图像描述 在此处输入图像描述

于 2016-02-19T10:21:40.970 回答
60

我个人使用JetBrains WebStorm,因为它是我发现的唯一适用于前端和后端 JavaScript 的 JavaScript IDE。

它适用于多个操作系统,并内置了 Node.js 调试(以及大量其他内容)(http://www.jetbrains.com/webstorm/features/index.html)。

我唯一的“问题”/愿望清单项目

  1. 在 Mac 上似乎比 Windows 更需要资源在版本 6 中似乎不再是问题。
  2. 如果它支持 Snippet 就好了(就像Sublime Text 2的支持一样- 即键入“fun”并点击“tab”以输入一个函数。请参阅下面的@WickyNilliams 评论 - 使用实时模板,您还可以获得片段支持。
于 2012-05-03T14:42:13.673 回答
45

这里有很多很好的答案,但我想添加我的观点(基于我的方法如何演变)

调试日志

面对现实吧,我们都喜欢好东西console.log('Uh oh, if you reached here, you better run.'),有时效果很好,所以如果你不愿离它太远,至少用Visionmedia 的 debug为你的日志添加一些金光闪闪。

交互式调试

与控制台日志一样方便,要进行专业调试,您需要卷起袖子并陷入困境。设置断点,单步执行代码,检查范围和变量以查看导致这种奇怪行为的原因。正如其他人所提到的,节点检查器确实是蜜蜂的膝盖。它可以完成您使用内置调试器所做的一切,但使用熟悉的 Chrome DevTools 界面。如果像我一样使用Webstorm,那么这里有一个方便的调试指南。

堆栈跟踪

默认情况下,我们无法跨事件循环的不同周期(滴答声)跟踪一系列操作。要解决这个问题,请查看longjohn(但不在生产中!)。

内存泄漏

使用 Node.js,我们可以让服务器进程保持相当长的时间。如果您认为它出现了一些令人讨厌的泄漏,您会怎么做?使用heapdump和 Chrome DevTools 比较一些快照,看看有什么变化。


有关一些有用的文章,请查看

如果您想观看视频,那么

无论您选择什么路径,只要确保您了解您的调试方式

在此处输入图像描述


看到自己的麻烦并知道
自己和其他人都没有做到, 这是一件痛苦的事情

索福克勒斯,阿贾克斯

于 2015-09-15T15:33:22.427 回答
43

Theseus是 Adob​​e 研究的一个项目,可让您在其开源编辑器Brackets中调试您的 Node.js 代码。它有一些有趣的特性,比如实时代码覆盖、追溯检查、异步调用树。

截屏

于 2013-05-14T22:21:22.100 回答
26

适用于 Visual Studio 2012 或 2013 的Node.js 工具包括一个调试器。此处的概述指出“Visual Studio 的 Node.js 工具包括对调试节点应用程序的完整支持。”。作为 Node.js 的新手,但有 .NET 的背景,我发现这个插件是调试 Node.js 应用程序的好方法。

于 2014-05-02T12:30:11.103 回答
24

Visual Studio Code有非常好的 Node.js 调试支持。它是免费、开源和跨平台的,可在 Linux、OS X 和 Windows 上运行。

如果需要,您甚至可以调试grunt 和 gulp 任务...

于 2015-09-09T00:08:22.513 回答
22

我编写了一种不同的方法来调试 Node.js 代码,它稳定且非常简单。它可在https://github.com/sa/iron-node获得。

在此处输入图像描述

一个开源的跨平台可视化调试器。

安装:

npm install iron-node -g;

调试:

iron-node yourscript.js;

于 2015-07-19T15:10:04.100 回答
16

我创建了一个名为pry.js的简洁小工具,可以帮助您。

在代码中的某处放置一个简单的语句,正常运行脚本,节点将暂停当前线程,让您可以访问所有变量和函数。随意查看/编辑/删除它们!

var pry = require('pryjs')

class FizzBuzz

  run: ->
    for i in [1..100]
      output = ''
      eval(pry.it) // magic
      output += "Fizz" if i % 3 is 0
      output += "Buzz" if i % 5 is 0
      console.log output || i

  bar: ->
    10

fizz = new FizzBuzz()
fizz.run()
于 2014-12-09T15:22:41.560 回答
16

如果您使用的是Atom IDE,则可以安装该node-debugger软件包。

于 2015-03-30T04:04:35.500 回答
16

使用 Chrome 版本 67.0.3396.62(+)

  1. 运行节点应用

节点 --inspect-brk=0.0.0.0:9229 server.js(服务器 js 文件名)

  1. 在 chrome 中浏览您的应用程序,例如“localhost:port”
  2. 打开开发工具。
  3. 单击响应式设备图标旁边的节点图标。

在此处输入图像描述

将弹出另一个专门用于调试节点应用程序的 DevTools 窗口。

在此处输入图像描述

于 2018-06-04T12:21:56.797 回答
12

Node.js中有内置的命令行调试器客户端。Cloud 9 IDE 也有相当不错的(可视化)调试器

于 2011-03-11T19:29:53.410 回答
11

我为那些不确定从哪里开始使用节点检查器的人整理了一个简短的Node.js 调试入门。

于 2013-11-21T18:31:17.530 回答
10

Visual Studio Code将在调试中为我们工作。

于 2017-10-15T10:02:20.653 回答
9

使用网络风暴!它非常适合调试 Node.js 应用程序。它有一个内置的调试器。在此处查看文档:https ://www.jetbrains.com/help/webstorm/2016.1/running-and-debugging-node-js.html

于 2016-07-25T19:13:43.677 回答
8

假设您的计算机上安装了 node-inspector(如果没有,只需键入“npm install -g node-inspector”),您只需运行:

node-inspector & node --debug-brk scriptFileName.js

并将命令行中的 URI 粘贴到 WebKit (Chrome / Safari) 浏览器中。

于 2013-04-29T01:20:36.680 回答
8

只是为了完整性:

PyCharm 3.0 + Node.js 插件提供了很棒的开发 + 运行 + 调试体验。

于 2014-02-05T01:27:05.643 回答
8

如果你需要一个强大的 Node.js 日志库,Tracer https://github.com/baryon/tracer是一个更好的选择。

它输出带有时间戳、文件名、方法名、行号、路径或调用堆栈的日志消息,支持彩色控制台,并轻松支持数据库、文件、流传输。我是作者。

于 2012-03-08T01:46:52.080 回答
8

使用--inspect标志启动您的节点进程。

node --inspect index.js

然后chrome://inspect在 chrome 中打开。单击“Open dedicated DevTools for Node”链接或安装chrome 扩展以轻松打开 chrome DevTools。

有关更多信息,请参阅链接

于 2018-02-09T19:05:32.830 回答
6

有新的开源Nodeclipse项目(作为 Eclipse 插件或Enide Studio):

Nodeclipse 在2013 年 Eclipse 十大新插件中排名第一。它使用经过修改的V8调试器(来自 Google Chrome Developer Tools for Java)。

Nodeclipse 是每月月初发布的免费开源软件。

于 2014-01-02T05:24:39.853 回答
6

有很多可能性...

调试支持通常使用v8 调试协议或更新的Chrome 调试协议来实现。

于 2017-01-21T06:13:29.117 回答
5

IntelliJ非常适合 Node.js。

此外,IntelliJ 很好地支持“代码辅助”。

于 2015-08-05T03:34:42.367 回答
4

ndb 是一种改进的 Node.js 调试体验,由 Chrome DevTools 启用

https://github.com/GoogleChromeLabs/ndb

于 2018-12-11T19:52:44.320 回答
4

NetBeans IDE从8.1 版开始支持 Node.js :

<...>

新功能亮点

Node.js 应用程序开发

  • 新建 Node.js 项目向导
  • 新的 Node.js Express 向导
  • 增强的 JavaScript 编辑器
  • 对运行 Node.js 应用程序的新支持
  • 对调试 Node.js 应用程序的新支持。

<...>

附加参考:

  1. NetBeans 维基/NewAndNoteworthyNB81
  2. NetBeans IDE 中的 Node.js Express 应用程序,Geertjan-Oracle
于 2015-11-24T08:26:37.743 回答
4

使用此命令

DEBUG_LEVEL=all node file.js
DEBUG=* node file.js
node file.js --inspect
于 2018-03-24T01:51:59.340 回答
3
node-debug -p 8888 scriptFileName.js
于 2014-05-07T15:53:27.580 回答
3

使用您最喜欢的浏览器调试器调试小型 Node.js 脚本的一种快速而简单的方法是使用browserify。请注意,这种方法不适用于任何需要本机 I/O 库的应用程序,但对于大多数小型脚本来说已经足够了。

$ npm install -g browserify

现在将所有var x = requires('x')调用移动到一个requires.js文件中并运行:

$ browserify requires.js -s window -o bundle.js

(这里的缺点是您必须requires在所有文件中移动或评论。)

将 包含bundle.js在 HTML 文件中,如下所示:

<script type="text/javascript" src="bundle.js"></script>

现在在浏览器中加载文件,然后按F12和 viola: debug in browser。

于 2015-05-14T18:20:39.553 回答
3

其他答案中未提及的另一个选项是使用名为Rookout的工具。它用于调试和从本地和远程应用程序获取数据。我们在生产环境中使用它来将数据聚合到其他服务 - 为我们节省了很多麻烦和硬编码日志记录

于 2020-01-22T09:20:27.353 回答
2

我最初的反应是几年前的视觉工作室。

因此,hapi 使用 GOOD 是一个很棒的日志记录包,但用于调试时使用Visual Studio

原始回复(很久以前):我会使用沃尔玛实验室的GOOD。它将完成这项工作,并且非常灵活:

var hapi = require('hapi');
var good = require('good');
var server = hapi.createServer('localhost', 5000,{});
server.route({SOME ROUTE HERE});
server.start();

var options = {
subscribers: {
    'console':               ['ops', 'request', 'log', 'error'],
    'http://localhost/logs': ['log']
    }
};
server.pack.require('good', options, function (err) {

    if (!err) {
        console.log('Plugin loaded successfully');
    }
});
于 2014-03-12T05:10:29.667 回答
2

此方法对JS也有效Node js。放上debugger你想检查的词。在浏览器中运行 JS 或 Node js 应用程序open the inspect element时。如果达到该行执行将暂停,如下图所示。

在此处输入图像描述

于 2021-05-04T07:30:53.600 回答
2

如果您愿意,您可以使用纯 Node.js 并在控制台中调试应用程序。

例如,让我们创建一个debug.js要调试的虚拟文件并在其中放置断点(debugger语句):

let a = 5;
debugger;

a *= 2;
debugger;

let b = 10;
debugger;

let c = a + b;
debugger;

console.log(c);

然后您可以使用以下命令运行此文件进行调试inspect

node inspect debug.js

这将在控制台中启动调试器,您将看到类似于以下内容的输出:

< Debugger listening on ws://127.0.0.1:9229/6da25f21-63a0-480d-b128-83a792b516fc
< For help, see: https://nodejs.org/en/docs/inspector
< Debugger attached.
Break on start in debug.js:1
> 1 (function (exports, require, module, __filename, __dirname) { let a = 5;
  2 debugger;
  3

您可能会注意到此处文件执行已在第一行停止。从这一刻起,您可以使用以下命令(热键)逐步浏览文件:

  • cont接着说,
  • next转到下一个断点,
  • in介入,
  • out走出去
  • pause暂停它

让我们输入cont几次,看看我们是如何从断点到断点的:

debug> next
break in misc/debug.js:1
> 1 (function (exports, require, module, __filename, __dirname) { let a = 5;
  2 debugger;
  3
debug> next
break in misc/debug.js:2
  1 (function (exports, require, module, __filename, __dirname) { let a = 5;
> 2 debugger;
  3
  4 a *= 2;
debug> next
break in misc/debug.js:4
  2 debugger;
  3
> 4 a *= 2;
  5 debugger;
  6

我们现在可以做的是我们可以通过编写repl命令来检查此时的变量值。这将允许您编写变量名称并查看其值:

debug> repl
Press Ctrl + C to leave debug repl
> a
5
> b
undefined
> c
undefined
>

您可能会看到我们a = 5此时有 和b并且c是未定义的。

当然,对于更复杂的调试,您可能需要使用一些外部工具(IDE、浏览器)。你可以在这里阅读更多。

于 2018-09-20T11:20:42.293 回答
2

启用 VS Code 首选项Auto Attach from File -> Preferences -> Settings -> Search for Auto Attach并将其设置为 On,打开控制台 ( ctrl+ *) 或从菜单Terminal -> New Terminal,在代码中设置断点,输入命令

node --inspect <name of your file>

这将开始调试,VS Code 将显示调试菜单。

注意:如果您使用节点集群工作线程,自动附加也非常有用。

于 2019-12-26T05:21:00.457 回答
1

使用 IDE

在 WebStorm 中,您只需打开 package.json 文件并从那里以 DEBUG 模式运行脚本。只需单击侧面的绿色播放按钮。

在此处输入图像描述

与 --inspect

如果您要直接从 CLI 调试应用程序而不使用 IDE,那么您可以运行您的脚本,例如node index.js --inspect. 默认情况下,它将侦听端口 5858,允许您连接调试器。或者,您可以使用 指定不同的端口--inspect=5858

带有环境变量

  1. 创建一个myInspector.js如下所示的脚本:
let inspector = require("inspector");

// you could explicitly specify a port.
// or alternatively set it to 0 to get any available port.
const port = 0;
inspector.open(port, undefined, true);

// print the url which also reveals the port.
const url = inspector.url()
console.log(url);
  1. 设置环境变量NODE_OPTIONS="--require myInspector.js"
  2. 启动您的脚本。

事实上,这也是 WebStorm 注入检查器的方式。美妙之处在于,无论您使用哪种启动器,它都能正常工作。所以你可以npm run ...node-ts ...甚至使用一些 .sh/.bat 文件。

于 2021-07-28T15:41:05.243 回答
1

有很多调试方法,但我更喜欢并且我使用 node js 的内置调试器。

app.js 文件

var fs = require('fs');

fs.readFile('test.txt', 'utf8', function (err, data) {

debugger;

if (err) throw err;

console.log(data); });

命令: node debug app.js

于 2019-11-14T11:55:38.003 回答
0

您可以尝试捕获错误:

function yourFunc() {
  try {
      // YOUR CODE HERE
  } catch (err) {
      console.error(err.message + ", " + err.trace);
  }
}

错误消息和错误跟踪将为您提供识别和纠正运行时错误所需的信息。

于 2020-02-27T12:13:56.130 回答
0

专为使用 node js 的 VS 代码开发人员而设计。启用内置调试

文件 > 首选项 > 设置 > 在搜索框中键入“自动附加”并设置调试器应如何附加 [preferred onlyWithFlag] 自动附加启用

说魔法,你应该看到

自动附加激活

使用 --inspect 运行节点程序,您应该与代码做她的工作:)

提示:您也可以不使用 --inspect 通过启用 always filter 运行

于 2021-08-25T14:35:42.923 回答
0

调试 Node.JS 应用程序的方法有以下几种:

1)安装devtool并使用它启动应用程序

npm install devtool -g --save
devtool server.js

这将在 chrome 开发人员模式下打开,因此您可以放置​​一个调试器点并进行测试。

2) 使用节点检查器进行调试

node-inspector

3) 使用 --debug 进行调试

node --debug app.js 
于 2018-04-05T06:28:46.583 回答