4

我不确定这是否纯粹是 Windows 问题。我没有选择在其他任何地方进行测试。鉴于这个非常简单的代码(Coffeescript):

console.log('Calling console.log')
console.error('Calling console.error')
console.log('Calling console.log second time - fails')
console.error('Calling console.error second time - fails')
nonexisting.throwError()

直接用coffee app.coffee它运行它就可以了,我明白了:

Calling console.log
Calling console.error
Calling console.log second time - fails
Calling console.error second time - fails
ReferenceError: nonexisting is not defined
....

然而跑步nodemon app.coffee给了我这个:

17 Mar 20:38:56 - [nodemon] starting `coffee.cmd server.coffee`
Calling console.log
Calling console.error
17 Mar 20:38:56 - [nodemon] app crashed - waiting for file changes before starting...

不仅根本没有异常信息,而且后来的日志消息也因为某种原因被吞掉了。在更复杂的情况下,我没有办法真正找到崩溃的原因。我尝试调试,但一切似乎都很好,调用了 console.log/error,但由于某种原因它没有显示。异常被 Coffeescript 捕获并直接发送到 stderr。

我想使用调试实用程序在控制台中的开发过程中获得很好的详细输出,并更容易找到问题。但有了这个麻烦制造者,这是不可能的。一旦发生未捕获的异常,我必须停止 nodemon 并手动运行整个程序以查找错误。解决方案的所有优雅都消失了:(

任何人都知道可能导致这种情况的原因以及是否有一些可能的解决方案?

Windows 7 64 位节点 0.10.26 Nodemon 1.0.15 Coffeescript 1.7.1

4

2 回答 2

4

消息被抑制,因为该进程是使用以下方法生成的:

child_process.spawn('coffee.cmd', ['server.coffee'], { stdio: ['pipe', 'pipe', 'pipe']);

特别是pipeonstderr是问题,因为当孩子退出时,管道已满(或似乎来自第一个console.error),因此当孩子死亡时,下一条消息不会放入管道中。

我已经更新了 nodemon 以使其在使用时更加智能pipe,因为在大多数情况下,使用process.stdoutonstdio工作得很好,并且也意味着这个原始示例脚本会如您所料地回显错误。

您提交的问题也已在 nodemon@1.0.17 中关闭

我应该补充一点,这个 SO 问题的标题具有误导性(它读起来好像 nodemon 隐藏了所有控制台输出) - 它没有隐藏控制台输出 - 当进程崩溃时它正在丢失控制台输出。尽管如此,它是固定的 - 耶!

于 2014-03-20T12:23:32.493 回答
1

我有暗示,但无法证明我的感觉。

用咖啡执行程序时,日志消息被阻塞。第 5 行的错误发生在 4 个跟踪已发布到控制台时。

无论使用何种监控工具,原理几乎相同:生成一个子进程来托管您的应用程序并监控其生命周期。这意味着您的控制台输出从子进程重定向到显示它的主机之一。

我敢打赌,故障是在日志消息之前处理的,因此,主机进程在有时间显示剩余日志之前就切断了通道。

于 2014-03-18T16:56:56.293 回答