Как я могу связать функцию регистрации Bunyan с функцией класса в ES6?

1

Сегодня суетятся с этим немного, все еще получая сообщение об ошибке. Документы здесь. Ближе всего я:

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 на другой объект? Это возможно?

Теги:
ecmascript-6
logging
bunyan

2 ответа

1
Лучший ответ

Если он жалуется на this то это потому, что this контекст теряется при отправке функции logger.debug.

Используйте функцию увеличения жира ES6, чтобы обойти эту проблему.

const tools = new Tools(
  config.region,
  config.ssl,
  x => logger.debug(x),
  x => logger.error(x)
);
0

Методы не связанных объектов никогда не должны передаваться как обратные вызовы, если они должны быть привязаны к их контексту. В качестве обратных вызовов можно передавать методы console поскольку они привязаны к console в большинстве современных реализаций, но это никогда не должно подразумеваться в межплатформенном коде.

console методы уже привязаны к console в Node.js и могут быть безопасно переданы как обратные вызовы без дополнительных мер.

Для других методов это должно быть:

const tools = new Tools(
  config.region,
  config.ssl,
  logger.debug.bind(logger),
  logger.error.bind(logger)
);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню