当进程崩溃时,Nodemon正在丢失控制台输出

时间:2014-03-17 21:33:23

标签: javascript node.js coffeescript nodemon

我不确定这是否纯粹是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。

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

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

Windows 7 64位 节点0.10.26 Nodemon 1.0.15 Coffeescript 1.7.1

2 个答案:

答案 0 :(得分:4)

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

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

特别是pipe stderr是问题所在,因为当孩子退出时,管道已满(或似乎来自第一个console.error),因此下一条消息是&n当孩子死亡时,将管子放入管道。

我已经更新了nodemon,使其在使用pipe时更加智能,因为在大多数情况下,在process.stdout上使用stdio工作得很好,也就是说这个原始示例脚本会像你期望的那样回应错误。

issue you filed也已在nodemon@1.0.17

中关闭

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

答案 1 :(得分:1)

我有一个提示,但无法证明我的感受。

使用咖啡执行程序时,日志消息会被阻止。第4行发生错误,而4条迹线已经发给控制台。

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

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