将消息记录为快速app.listen回调

时间:2017-09-29 06:19:43

标签: javascript node.js express

我正在将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 console.log日志替换server.js中的info我尝试这样做:

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

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

不确定这是否是正确的语法,我在Parsing error: Assigned to rvalue中获得了appObj的{​​{1}}。我知道如何才能使这项工作?

2 个答案:

答案 0 :(得分:1)

你的意思不是吗?

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

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

此外,当您不需要使用它时,您正在使用co(),并且它可能会导致问题,因为它在事件循环的下一个滴答处执行services函数内的代码(即在调用app.set('logger', ...)之后它正在调用appObj.get('logger')

试试这个:

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

编辑:如果appStartup依赖于异步的东西,一种解决方案就是从中返回一个承诺,并将其处理为“上游”:

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');
  });
}();

答案 1 :(得分:0)

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

Check this thread for more info

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

希望这有帮助!