Как вызвать метод класса с переменными аргументами
Я создаю несколько модулей NPM, которые будут использоваться в других модулях моего большого проекта. Мой основной проект настраивает и использует log4js NPM для ведения журнала. Мне также нужно написать несколько журналов в модулях NPM для отладки / информационных целей.
Однако я хочу использовать регистратор, инициализированный основным модулем. Таким образом, основной модуль передает экземпляр регистратора либо путем создания глобальной переменной, такой как "global.logger", либо путем явной передачи во время вызова require().
Я хочу встроить немного интеллекта в модули NPM, чтобы они могли писать логи, если инициализирован global.logger или если var 'logger' был инициализирован вызовом require(). Если модуль NPM используется без определения регистратора, он все равно будет работать, но только в том случае, если журналы не будут напечатаны.
Чтобы добиться этого, я получил пару таких подходов.
Подход I: записывать журналы, проверяя, был ли определен регистратор.
if (logger) logger.info('Initializing npm module...');
...
if (logger) logger.info('Connecting to db...');
...
if (logger) logger.info('Fetching records...');
Подход II - функция обертки
так как подход я выглядит неуклюжим, с проверкой if каждый раз, я заканчивал тем, что писал обертку fn, которая проверяет и записывает журнал, например так:
function log(level, msg) {
if (!global.logger) return;
level = level.toLowerCase();
var args = Array.prototype.splice.call(arguments, 2);
switch(level) {
case 'info': global.logger.info.apply(global.logger, args);break;
case 'trace': global.logger.trace.apply(global.logger, msg, args);break;
case 'debug': global.logger.debug.apply(global.logger, msg, args);break;
case 'warning': global.logger.warning(global.logger, msg, args);break;
case 'error': global.logger.error(global.logger, msg, args);break;
case 'fatal': global.logger.fatal(global.logger, msg, args);break;
default: throw "Stupid error!";
}
}
И эта обертка будет называться так...
log("info", "Initializing Authorizer module...");
Даже при том, что этот подход работает, но в функции-обертке все еще много кода. Я уверен, что мог бы быть лучший путь, но я не получаю это. Любая помощь в этом отношении высоко ценится.
1 ответ
Если я понимаю ваш вопрос, вы пытаетесь избежать условной проверки logger
, Если вы хотите расширить / переписать функциональность регистрации, я бы перезаписал console.log
,
var logHandle = console.log;
console.log = function(msg) {
// do something with msg.
logHandle(msg);
}
Два преимущества для этого. 1. console.log знаком с разработчиками node/js. 2. Если console.log вызывается до того, как ваш регистратор перезаписывает его, резервный режим используется по умолчанию.