我有一个简单的 test.coffee 编译为 test.js

测试.咖啡

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 通过 (!node % 和 !coffee %) 等......输出惊人地不同。

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

最佳答案

当您通过 coffee 命令运行 C​​offeeScript 代码时,代码会被编译为 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
    ...

command.coffee 中。

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

关于node.js - NodeJS 和 CoffeeScript(咖啡可执行文件)表现不一样?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6346291/

10-12 05:53