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

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

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给另一个对象?这可能吗?

4

2 回答 2

1

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

使用 ES6 粗箭头函数来解决这个问题。

const tools = new Tools(
  config.region,
  config.ssl,
  x => logger.debug(x),
  x => logger.error(x)
);
于 2017-12-02T12:05:06.530 回答
0

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

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

对于其他方法,应该是:

const tools = new Tools(
  config.region,
  config.ssl,
  logger.debug.bind(logger),
  logger.error.bind(logger)
);
于 2017-12-02T00:46:57.293 回答