在winston中将对象作为元数据传递时超出堆栈大小

时间:2016-08-21 18:47:56

标签: node.js mongodb mongoose winston

在winston中,当我通过传递mongoose查询结果作为元数据参数来尝试日志记录时,winston在任务退出之前就像吐出一千行日志一样吐出来。

所以对于这样的日志:

tSchool.findById(bus.schoolid,function(err,school){
   winston.info('loaded school',school);
});

这是一小部分输出:

return _next.apply(this, arguments);
}, remove=function wrappedPointCut() {
  var args = [].slice.call(arguments);
  var lastArg = args.pop();
  var fn;
  var originalStack = new Error().stack;
  var $results;
  if (lastArg && typeof lastArg !== 'function') {
    args.push(lastArg);
  } else {
    fn = lastArg;
  }
  var promise = new Promise.ES6(function(resolve, reject) {
    args.push(function(error) {
      if (error) {
        // gh-2633: since VersionError is very generic, take the
        // stack trace of the original save() function call rather
        // than the async trace
        if (error instanceof VersionError) {
          error.stack = originalStack;
        }
        _this.$__handleReject(error);
        reject(error);
        return;
      }

      // There may be multiple results and promise libs other than
      // mpromise don't support passing multiple values to `resolve()`
      $results = Array.prototype.slice.call(arguments, 1);
      resolve.apply(promise, $results);
    });

    _this[newName].apply(_this, args);
  });
  if (fn) {
    if (_this.constructor.$wrapCallback) {
      fn = _this.constructor.$wrapCallback(fn);
    }
    return promise.then(
      function() {
        process.nextTick(function() {
          fn.apply(null, [null].concat($results));
        });
      },
      function(error) {
        process.nextTick(function() {
          fn(error);
        });
      });
  }
  return promise;
}

所以我想知道一些事情:

  1. 为什么传递一个mongoose查询结果,应该只是一个小的json对象,打印出这样的乱码?

  2. 对于其他对象是否也会发生这种情况 - 比如回调中的err个对象.etc?

  3. 如何防止这种情况?检查每个日志语句以确保没有传递查询结果是不太实际的。

  4. 提前致谢。

    更新:

    问题#862#474#914正在跟踪/与此问题相关,但进展不大。

1 个答案:

答案 0 :(得分:0)

此问题已在Winston的拉取请求#977中修复。您可以在PR页面上查看详细信息。