如何将bunyan日志记录功能绑定到ES6中的类函数?

时间:2017-12-01 23:12:53

标签: javascript node.js logging ecmascript-6 bunyan

今天稍微纠结这个,仍然会出错。 Docs here.我最近的是:

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;
}

在课堂的其他地方,我发送了一个bunyan记录器的功能:

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

记录器只是使用控制台输出。如果我通过console.logconsole.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问题,但它并没有真正明确如何解决它。如何将像logger.error这样的bunyan记录器函数传递给另一个对象?这可能吗?

2 个答案:

答案 0 :(得分:1)

如果它抱怨this那么那是因为this上下文在您发送logger.debug函数时丢失了。

使用ES6胖箭头功能解决此问题。

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

答案 1 :(得分:0)

如果期望将未绑定的对象方法绑定到其上下文,则永远不应将其作为回调传递。可以将console方法作为回调传递,因为它们在大多数现代实现中绑定到console,但这绝不应隐含在跨平台代码中。

console方法已绑定到Node.js中的console,并且可以安全地作为回调传递而无需其他措施。

对于其他方法,它应该是:

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