Meteor:在服务器端调试

Posted

技术标签:

【中文标题】Meteor:在服务器端调试【英文标题】:Meteor: Debug on server side 【发布时间】:2012-06-17 14:16:47 【问题描述】:

有人知道调试服务器端代码的好方法吗? 我尝试启用 Node.js 调试,然后使用节点检查器,但它没有显示我的任何代码。

我最终使用了 console.log,但这非常低效。

更新:我发现以下程序在我的 Linux 机器上有效:

    当你运行 Meteor 时,它会产生两个进程

    进程1:/usr/lib/meteor/bin/node /usr/lib/meteor/app/meteor/meteor.js

    process2: /usr/lib/meteor/bin/node /home/paul/codes/bbtest_code/bbtest02/.meteor/local/build/main.js --keepalive

    你需要在 process2 上发送 kill -s USR1

    运行 node-inspector 可以看到你的服务器代码

在我第一次尝试时,我将 /usr/lib/meteor/bin/meteor 中流星启动脚本的最后一行修改为

exec "$DEV_BUNDLE/bin/node" $NODE_DEBUG "$METEOR" "$@"

并在命令提示符下运行NODE_DEBUG=--debug meteor。这只会在 process1 上放置 --debug 标志,所以我只能在 node-inspector 上看到流星文件并且找不到我的代码。

有人可以在 Windows 和 Mac 机器上检查吗?

【问题讨论】:

仅供参考,使用 Meteor._debug 代替 console.log(它最终会调用 console.log,但有注释说有一天会改进。) 查看我的答案,在 MAC 上它正在工作,我能够查看和调试我的 js 文件。 我在我的 Mac 上试过这个,但是不行。 @Harmal000 你链接到这个问题 - 你的意思是链接到另一个? 这篇文章对meteor.js中的调试很有用joshowens.me/easily-debugging-meteor-js 【参考方案1】:

在 Meteor 0.5.4 中,这变得容易多了:

首先从终端运行以下命令:

npm install -g node-inspector
node-inspector &
export NODE_OPTIONS='--debug-brk'
meteor

然后在浏览器中打开http://localhost:8080 以查看节点检查器控制台。

更新

从 Meteor 1.0 开始,您只需键入

meteor debug

这实际上是上述命令的快捷方式,然后如上所述在浏览器中启动节点检查器。

更新

在 Meteor 1.0.2 中添加了控制台或外壳。在服务器上输出变量和运行命令可能会派上用场:

meteor shell

【讨论】:

感谢您发布您的答案!请务必仔细阅读FAQ on Self-Promotion。另请注意,每次链接到自己的网站/产品时,都要求发布免责声明。 如何禁用这个调试器?每次我运行 meteor 时,这个调试器都会运行并锁定我的流星应用程序,使其无法在客户端运行任何东西。 控制台输出总是[object Object],例如:console.log('asd') [object Object] 是否可以打印值?怎么样? meteor debug 上有没有官方文档。我找不到设置断点的代码。【参考方案2】:

Meteor 应用是 Node.js 应用。使用meteor [run] 命令运行 Meteor 应用时,您可以configure the NODE_OPTIONS environment variable to start node in debug mode。

NODE_OPTIONS 环境变量值示例:

--debug --debug=47977 - 指定端口 --debug-brk - 在第一条语句上中断 --debug-brk=5858 - 指定端口并在第一条语句中中断

如果你export NODE_OPTIONS=--debug,所有从同一个shell运行的meteor命令都将继承环境变量。或者,您可以使用NODE_OPTIONS="--debug=47977" meteor 仅启用一次调试。

要进行调试,请在不同的 shell 中运行 node-inspector,然后转到 http://localhost:8080/debug?port=<the port you specified in NODE_OPTIONS>,无论 node-inspector 告诉您运行什么。

【讨论】:

【参考方案3】:

要在调试模式下启动 node.js,我是这样做的:

    打开 /usr/lib/meteor/app/meteor/run.js

    之前

    nodeOptions.push(path.join(options.bundlePath, 'main.js')); 
    

    添加

    nodeOptions.push('--debug');
    

以下是附加调试器 Eclipse 的其他实用步骤:

    在此处使用“--debug-brk”而不是“--debug”,因为我更容易使用 eclipse 作为调试器附加 node.js。 添加“调试器;”在要调试的代码中。(我个人更喜欢这种方式) 在控制台中运行流星 在eclipse中附加到node.js(V8工具,附加到localhost:5858) 运行,等待调试器被命中

当您在流星应用文件夹中启动流星时,您会在控制台中看到“调试器正在侦听端口 5858”。

【讨论】:

如果你使用mrt,当然run.js的路径不一样。 ... 如 ~/.meteorite/meteors/meteor/meteor/0a148c69d6af9832006a6f6d27cc112ed90cb3e4/app/meteor/ 我的文件因未知原因在/usr/lib/usr/local/ 中重复。如果对您不起作用,请尝试编辑 /usr/local/meteor/app/meteor/run.js 而不是 /usr/lib/meteor/app/meteor/run.js 谢谢,您的解决方案是我找到的最简单的解决方案。它不需要杀死进程,也不需要通过命令行设置变量。【参考方案4】:

在 Meteor 1.0.3.1 上(更新到 Sergey.Simonchik 答案)

meteor run --debug-port=<port-number>启动你的服务器

将浏览器指向http://localhost:6222/debug?port=<port-number>

<port-number> 是您指定的端口。

在您的代码中添加一个debugger;,您要在其中设置断点。

根据调用 debugger; 的位置,它会在您的客户端或服务器浏览器窗口中中断并打开检查器。

【讨论】:

【参考方案5】:

我喜欢通过 GUI 设置断点。这样我就不必记住从我的应用程序中删除任何调试代码。

这就是我设法为我的本地流星应用程序在服务器端做到这一点的方式:

meteor debug

以这种方式启动您的应用程序。

打开 Chrome 到它给你的地址。你可能需要安装 https://github.com/node-inspector/node-inspector(它现在可能与 Meteor 捆绑在一起?不确定)

您会看到一些奇怪的内部流星代码(不是您编写的应用程序代码)。 按播放 运行代码。此代码只是启动您的服务器以侦听连接。

只有在您按下播放后,您才会在调试器文件夹结构中看到一个名为 "app" 的新目录。里面有你的流星项目文件。在你想要的那一行设置一个断点。

打开应用的本地地址。这将运行您的服务器端代码,您应该能够命中断点!

注意:每次重新启动应用时,您都必须重新打开检查器并再次执行此过程!

【讨论】:

【参考方案6】:

从 Meteor 1.0.2 开始,服务器端调试的最佳方式可能是直接通过新的内置 shell:运行服务器运行 meteor shell。更多信息在这里:https://www.meteor.com/blog/2014/12/19/meteor-102-meteor-shell

【讨论】:

【参考方案7】:

我不确定为什么它不适合你。 我可以按照控制台(Mac)上的步骤使用它。

$ ps  
$ kill -s USR1 *meteor_node_process_id*  
$ node-inspector &

https://github.com/dannycoates/node-inspector 中提到了上述步骤。它用于将节点检查器附加到正在运行的节点进程。

【讨论】:

我只在Mac上测试过,你用的是Mac吗? 是的,我有一台 Mac。如何在代码中添加断点?您对整个事情使用的确切步骤是什么? 在上述(这个答案的)步骤之后,我启动了检查器。 $ node-inspector & 在 chrome 中打开127.0.0.1:8080/debug?port=5858。我能够在 webkit-inspector 的源选项卡中看到我的文件 我已经尝试过了,在检查器中添加了debugger 和断点,但它们都不起作用。知道为什么吗? 当查看ps | grep node(或类似的)时,请确保您选择 main.js pid 来发出信号,而不是它的父节点进程。这就是我让它工作的方式。【参考方案8】:

我写了一个名为 meteor-inspector 的小流星包,它简化了使用 node-inspector 来调试流星应用程序。它在内部管理节点检查器的生命周期,因此用户无需在某些文件更改后手动重新启动调试器。

更多详情和具体使用说明请查看https://github.com/broth-eu/meteor-inspector。

【讨论】:

【参考方案9】:

对于流星 1.3.5.2,运行

流星调试 --debug-port 5858+n n 是一个非零数字,这将导致 node-inspector 使用 8080+n 作为 web 端口。

【讨论】:

【参考方案10】:

WebStorm,为开源开发人员免费提供的强大 IDE,让调试服务器端变得更加容易。

我已经在 Windows 上进行了测试,配置很轻松 - 请参阅 my answer。

【讨论】:

【参考方案11】:

解决我的问题的检查员是流星服务器控制台。这是我安装它的过程:

    在你的项目文件夹中,添加智能包server-eval

    mrt add server-eval
    

    对于流星 1.0:

    meteor add gandev:server-eval
    

    重启流星。

    从here下载crx Chrome 扩展文件。 在 Chrome 中打开扩展页面并将 crx 文件拖到扩展页面。 重新启动 Chrome。

    检查网络检查器以评估服务器端代码:

与node-inspector相比,我的输出更清晰。

【讨论】:

据我所知,它适用于断点,但我不确定。 你还记得你是如何设置它们的吗?通过开发工具还是 incode?​​span> 开发工具,但不记得具体如何【参考方案12】:

如果您更喜欢使用nodeJS' official debugger,您可以调用NODE_OPTIONS='--debug' meteor,然后(在不同的shell 上)node debug localhost:5858

【讨论】:

以上是关于Meteor:在服务器端调试的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Meteor 的服务器端调试和记录自己的代码?

流星服务器端断点从未在 cloud9 中命中

Meteor + React:服务器端路由?

您如何在 Meteor 中存储特定于客户端的数据服务器端?

Meteor - 成功登录服务器端后返回客户端

无法在服务器端使用 fs 和 webshot 与 Meteor(galxy 托管)