Сегодня суетятся с этим немного, все еще получая сообщение об ошибке. Документы здесь. Ближе всего я:
constructor(region, sslEnabled = true,
logger = () => {}, errorLogger = () => {}) {
if (region === undefined || !region)
throw new Error("Initialization error: region is required");
this.log = () => {}; // these two lines might be unnecessary
this.logError = () => {}; //
this.log = logger.bind(this);
this.logError = errorLogger.bind(this);
this.region = region;
this.sslEnabled = sslEnabled;
}
В другом месте класса я отправляю функции буньяна-регистратора в:
const tools = new Tools(
config.region,
config.ssl,
logger.debug,
logger.error
);
Регистратор использует только консольный вывод. Это работает, если я console.log
и console.error
но не сработает, если я передам регистраторы Bunyan:
bunyan usage error: /usr/src/app/src/healthcheck.js:47:
attempt to log with an unbound log method: 'this' is: TTools {
log: [Function: bound ],
logError: [Function: bound ],
region: 'us-west-2',
sslEnabled: false }
В этом есть проблема github, но на самом деле не ясно, как ее исправить. Как передать функцию логатора bunyan, такую как logger.error
на другой объект? Это возможно?
Если он жалуется на this
то это потому, что this
контекст теряется при отправке функции logger.debug
.
Используйте функцию увеличения жира ES6, чтобы обойти эту проблему.
const tools = new Tools(
config.region,
config.ssl,
x => logger.debug(x),
x => logger.error(x)
);
Методы не связанных объектов никогда не должны передаваться как обратные вызовы, если они должны быть привязаны к их контексту. В качестве обратных вызовов можно передавать методы console
поскольку они привязаны к console
в большинстве современных реализаций, но это никогда не должно подразумеваться в межплатформенном коде.
console
методы уже привязаны к console
в Node.js и могут быть безопасно переданы как обратные вызовы без дополнительных мер.
Для других методов это должно быть:
const tools = new Tools(
config.region,
config.ssl,
logger.debug.bind(logger),
logger.error.bind(logger)
);