【问题标题】:Log message as express app.listen callback将消息记录为 express app.listen 回调
【发布时间】:2018-03-11 00:06:40
【问题描述】:

我在我的应用程序中引入了winston 日志,我想用winston 的.info 和.error 替换所有信息或错误级别日志。到目前为止,一切正常,除非我尝试从 app.listen 回调中记录信息消息。

appStartup.js 定义记录器的文件

const app = require('express')();
const co = require('co');
const cors = require('cors');
const winston = require('winston');

const loggerTimeFormat = () => (new Date()).toLocaleTimeString();

const winstonLogger = new winston.Logger({
  transports: [
    new winston.transports.Console({
      timestamp: loggerTimeFormat,
    }),
  ],
});

module.exports = function appStartup() {
  co(function* services() {
    app.db = mongo.connect();
    app.use(cors());
    app.set('logger', winstonLogger);
  }).catch((e) => {
    console.error(e);
  });

  return app;
};

在我的server.js 文件中,我有:

const app = require('./src/appStartup');

const appPort = process.env.PORT;
app().listen(appPort, () => {
  console.log('Info message here');
});

我想用winston info 日志替换server.js 中的console.log 我尝试这样做:

const app = require('./src/appStartup');
const appPort = process.env.PORT;
const appObj = app();

appObj.listen(appPort, (appObj.get('logger')) => {
  logger.info('Info message here');
});

不确定这是否是正确的语法,我在appObj.get('logger') 中得到Parsing error: Assigned to rvalue for appObj。知道我该如何完成这项工作吗?

【问题讨论】:

  • 记录器调用似乎有错字。你没有 logger.info,只有 logger。
  • @Sri 是的,谢谢,这是一个错字,虽然这并没有解决问题。

标签: javascript node.js express


【解决方案1】:

你不是这个意思吗?

appObj.listen(appPort, (logger = appObj.get('logger')) => {
  logger.info('Info message here');
});

logger 是参数的名称,appObj.get('logger') 是它的默认值。

另外,您在不需要使用 co() 时使用它,这可能会导致问题,因为它在事件循环的下一个滴答声中执行 services 函数内的代码(即它正在调用 @ 987654326@之后调用appObj.get('logger'))。

试试这个:

module.exports = function appStartup() {
  app.use(cors());
  app.set('logger', winstonLogger);
  return app;
};

编辑:如果appStartup 依赖于异步的东西,一种解决方案是从它返回一个promise,并在“上游”处理它:

module.exports = function appStartup() {
  app.use(cors());
  app.set('logger', winstonLogger);
  return mongo.connect().then(db => {
    app.db = db;
    return app;
  });
};

// server.js
const app = require('./src/appStartup');
const appPort = process.env.PORT;

app().then(appObj => {
  appObj.listen(appPort, (logger = appObj.get('logger')) => {
    logger.info('Info message here');
  });
}).catch(e => {
  console.error('Unable to create app', e);
  process.exit(1);
});

或者使用async/await,它适用于最近的 (8.x) Node.js 版本:

module.exports = async function appStartup() {
  app.use(cors());
  app.set('logger', winstonLogger);
  app.db = await mongo.connect();
  return app;
};

// server.js
const app     = require('./src/appStartup');
const appPort = process.env.PORT;

void async function() { // async IIFE
  try {
    var appObj = await app();
  } catch(e) {
    console.error('Unable to create app', e);
    process.exit(1);
  }
  appObj.listen(appPort, (logger = appObj.get('logger')) => {
    logger.info('Info message here');
  });
}();

【讨论】:

  • 嗯,有道理,它解决了解析错误,但是 appObj.get('logger') 返回未定义,即使我确实在 appStartup app.set('logger', winstonLogger 中设置了它);
  • @user988544 appObj 似乎是一个新实例。
  • 它仍然是require('./src/appStartup'); 的新实例,对吧?所以它应该在appStartup.js 中设置属性?我可能没有正确理解这一点
  • @user988544 哦,等一下,问题很可能是使用了co()。你不需要它。
  • 导致问题是因为它是异步的,但它里面的代码不是(所以因为后者不需要它,并且它导致问题是因为记录器设置为 app 实例“为时已晚”,因为前者)。见编辑。
【解决方案2】:

这是babel-eslint 的一个已知问题。尝试将其升级到最新版本,它会解决问题。

Check this thread for more info

作为临时解决方案,您可以尝试考虑以es5 方式重写您的箭头函数。

希望这会有所帮助!

【讨论】:

  • 我不确定这是否是问题所在,当我在线尝试 babel 验证器时,我得到“箭头函数参数中的左侧无效”
猜你喜欢
  • 2020-07-21
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多