2013-11-11 3 views
5

Я пытаюсь изменить require как этотNode.js настройки требуют функции глобально

require = function (path) { 
    try { 
     return module.require(path); 
    } catch (err) { 
     console.log(path) 
    } 
} 

Однако объем этой модификации только в текущем модуле. Я хочу изменить его по всему миру, поэтому каждый модуль, который является require d этим модулем, также получит ту же копию функции require.

В принципе, я хочу поймать SyntaxError, чтобы узнать, какой файл имеет проблемы. Кажется, я не вижу другой альтернативы. Если я положил module.require в блок try/catch, я смогу получить имя файла, вызвавшее SyntaxError.

ответ

4

мне удалось решить путем изменения функции прототипа require из Module класса. Я помещал это в основной скрипт и его доступный для всех модулей require d.

var pathModule = require('path'); 
var assert = require('assert').ok; 

module.constructor.prototype.require = function (path) { 
    var self = this; 
    assert(typeof path === 'string', 'path must be a string'); 
    assert(path, 'missing path'); 

    try { 
     return self.constructor._load(path, self); 
    } catch (err) { 
     // if module not found, we have nothing to do, simply throw it back. 
     if (err.code === 'MODULE_NOT_FOUND') { 
      throw err; 
     } 
     // resolve the path to get absolute path 
     path = pathModule.resolve(__dirname, path) 

     // Write to log or whatever 
     console.log('Error in file: ' + path); 
    } 
} 
+0

это казалось многообещающим, но это не сработало для меня на узле 8. Я поместил модификацию в mod.js и использовал параметр -require Mocha для загрузки его перед всеми тестовыми файлами, но, увы ... – oligofren

0

Почему бы вам не использовать блок try-catch внутри вашего кода и как только возникнет ошибка, чтобы проверить трассировку стека. Проверьте эти ссылки

+0

Я не могу использовать попытку поймать везде, где мне нужен модуль. и сообщать пользователям о том же. Вот почему я хочу сделать его прозрачным для пользователей. –

+0

Как насчет http://nodejs.org/api/process.html#process_event_uncaughtexception. Вы можете поместить это в свой основной модуль и уловить все эти ошибки, которые обычно отправляются на консоль. – Krasimir

+2

'uncaughtException' не очень полезно, если вы хотите поймать' SyntaxError', поскольку он не даст вам имя файла, у которого есть ошибка. Узел просто печатает имя файла с фрагментом ошибочного файла. Он не дает этот файл в стеке. –

Смежные вопросы