NodeJS和CoffeeScript(咖啡可执行文件)表现不一样?

时间:2011-06-14 15:44:57

标签: node.js coffeescript

我有一个简单的test.coffee,它编译成test.js

test.coffee

process.on 'uncaughtException', (er) ->
  console.log 'Unhandled exception'
  console.log 'Unhandled exception'
  console.log 'Unhandled exception'
  console.log 'Unhandled exception'
  console.log 'Unhandled exception'
  console.log 'Unhandled exception'
  console.log 'Unhandled exception'
  console.log 'Unhandled exception'
  return

throw new Error("aAH")

制作的test.js

(function() {
  process.on('uncaughtException', function(er) {
    console.log('Unhandled exception');
    console.log('Unhandled exception');
    console.log('Unhandled exception');
    console.log('Unhandled exception');
    console.log('Unhandled exception');
    console.log('Unhandled exception');
    console.log('Unhandled exception');
    console.log('Unhandled exception');
  });
  throw new Error("aAH");
}).call(this);

从命令行或从vim via(!node%和!coffee%)等,输出出乎意料地不同。

node test.js行为正确并将几个Unhandled异常行输出到控制台并退出。通过'coffee test.coffee'调用可以回退到打印堆栈跟踪和退出的默认行为。这个示例显然不是我的完整应用程序,但做一个更大的应用程序我无法通过coffee boot.cofee启动ExpressJS应用程序时无法处理未处理的异常,我做错了什么?这是最新的Node 0.4.8和Mac OS X 10.6.x上的最新Cofee 1.1.1

1 个答案:

答案 0 :(得分:4)

当您通过coffee命令运行CoffeeScript代码时,代码将编译为JS,然后在Node进程中以编程方式运行。特别是,CoffeeScript使用命令

mainModule._compile code, mainModule.filename

(请参阅coffee-script.coffee),其中mainModule是对require.main的引用。这就是为什么在堆栈跟踪中,你应该看到

Error: aAH
    at Object. (.:12:9)
    at Object. (.:13:4)
    at Module._compile (module.js:404:26)
    ...

您遇到的一个副作用是异常永远不会一直到process级别。相反,感谢这个代码

  try
    ...
    else if o.run         then CoffeeScript.run t.input, t.options
    ...
  catch err
    ...
<{3>}中的

当您运行coffee foo.coffee时,CoffeeScript需要几个步骤来模拟“纯”Node.js进程,但是直接运行CoffeeScript和运行已编译的JS之间总会存在一些差异。对于您正在开发的复杂应用程序,我建议设置一个Cakefile,以便您可以在保存时自动重新编译,测试和运行您的应用程序,而不是使用编辑器的内置运行命令。