NodeJS и CoffeeScript (исполняемый файл кофе) не ведут себя одинаково? - PullRequest
3 голосов
/ 14 июня 2011

У меня есть простой test.coffee, который компилируется в test.js

The 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 через (! Node% и! Coffee%) и т. Д. Выходные данные неожиданно отличаются.

node test.js работает правильно и выводит несколько необработанных строк исключений на консоль и завершает работу.Вызов через «coffee test.coffee» возвращается к стандартному поведению печати трассировки стека и выхода.Этот пример, очевидно, не является моим полным приложением, но при создании большего приложения я не мог заставить работать необработанное исключение при запуске приложения ExpressJS через coffee boot.cofee, что я делаю не так?Это последняя версия 0.4.8 и последняя версия Cofee 1.1.1 в Mac OS X 10.6.x

.

1 Ответ

4 голосов
/ 15 июня 2011

Когда вы запускаете код CoffeeScript с помощью команды coffee, код компилируется в 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 .

CoffeeScript выполняет несколько шагов для имитации «чистого» процесса Node.js при запуске coffee foo.coffee, но всегда будут некоторые различия между прямым запуском CoffeeScript и выполнением скомпилированного JS. Для сложных приложений, таких как то, которое вы разрабатываете, я бы предложил настроить Cakefile, чтобы вы могли автоматически перекомпилировать, тестировать и запускать свое приложение при сохранении, а не использовать встроенную команду запуска вашего редактора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...