VSCode调试NodeJs应用程序无法正常工作

5

我已经在launch.json文件中添加了以下配置:

{
    "name": "Attach"
    "type": "node",
    // TCP/IP address. Default is "localhost".
    "address": "localhost",
    // Port to attach to.
    "port": 5858
}

现在我使用以下命令启动我的应用程序:node --debug-brk ./bin/www

当我在 VSCode 中选择顶部调试菜单中的 Attach 并点击播放按钮时,它会附加,但当我转到浏览器并打开一个页面时,它没有触发断点或我的 index.js 文件中的处理程序函数。请问您能帮助我找出问题所在吗?


请查看此教程:http://wiki.workassis.com/nodejs-express-debugging-using-visual-studio-code/ - Bikesh M
3个回答

6
在node中存在两个问题与断点相关(这些问题不仅仅在VSCode中出现,您在node-inspector中也可以看到它们):
  1. 如果您在应用程序的启动代码中设置断点并使用--debug(而非--debug-brk)启动node,则node会立即启动,并在VSCode有机会注册断点之前执行了启动代码。因此,如果需要调试启动代码,请使用--debug-brk标志,因为它允许VSCode在node启动应用程序之前设置断点。

  2. Node在加载时没有完全解析源文件,但是将闭包(回调等)的解析推迟到首次命中它们的代码时。因此,由于node尚未解析代码,设置在回调上的断点不一定始终正确地被node注册。通过使用--nolazy标志,可以禁用这种“惰性”行为。

在下一个版本的VSCode(0.4.0)中,我们将采取以下措施解决这些问题:

  1. VSCode将始终使用--debug-brk标志启动node,但如果用户没有指定“stopOnEntry:true”,则会隐藏第一个停止和继续。这将避免启动代码中错过断点的问题。

  2. 如果在还没有被node解析的代码中设置断点,则node会在解析代码的下一个可能位置中注册它们。由于这些“实际”位置是由node返回给客户端的,因此VSCode能够显示这些位置。因此,用户将看到设置在未解析回调中的断点“跳转”到更远的位置,并且他将更好地理解为什么调试器不会在请求的位置停止。此外,我们还向断点视图添加了一个“重新应用”按钮,使清除和设置所有断点变得非常容易。


4

你的断点可能设置得太早,无法被节点注册。如果你在连接后设置断点应该会有所帮助。

我们已经在VSCode中改善了这个体验,它应该在0.4.0版本中可用。


这次工作了。非常感谢!! - sumit agarwal
我有0.3.0版本,0.4.0版本在哪里可以获取?我遇到了类似的调试附加问题。 - John Papa
@Isidor,请查看我的回答中的详细信息,了解哪些是可行的,哪些是不可行的。 - John Papa

3
始终清除您的断点并在附加后设置它们。我吃过亏。这肯定是一个错误。
我一直在研究0.3.0版本,目前发现以下情况。
这样不起作用!
1.在Code中添加到app.js或路由的断点 2.在终端中运行node --debug src/server/app.js 3.在Code中附加调试器
这样可以工作!
1.在终端中运行node --debug src/server/app.js 2.在Code中删除所有断点 3.在Code中添加到app.js或路由的断点 4.在Code中附加调试器
这样不起作用,因为--debug除了文件之外还必须是节点后面的参数
1.在终端中运行node src/server/app.js --debug 2.在Code中删除所有断点 3.在Code中添加到app.js或路由的断点 4.在Code中附加调试器
这样可以工作,假设您有一个gulp进程
1.在终端中运行gulp serve-dev --debug 2.在Code中删除所有断点 3.在Code中添加到app.js或路由的断点 4.在Code中附加调试器
这有时不起作用
1.在终端中运行gulp serve-dev --debug 2.在Code中添加到app.js或路由的断点 3.在Code中附加调试器
为什么有时会出现问题?我最好的猜测是断点有时会出现问题。有时它们可以正常工作,而其他时候我必须在附加调试器之前删除它们并重新添加它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接