Javascript 将消息记录为express app.listen回调

Javascript 将消息记录为express app.listen回调,javascript,node.js,express,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');

我将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信息日志替换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中为appObj分配了rvalue。你知道我该怎么做吗?

这是巴贝尔·埃斯林特的一个众所周知的问题。尝试将其升级到最新版本,即可解决此问题

作为一个临时解决方案,您可以考虑用es5的方式重写箭头函数

希望这有帮助

你不是这个意思吗

appObj.listen(appPort, (logger = appObj.get('logger')) => {
  logger.info('Info message here');
});
logger是参数的名称,appObj。get'logger'是其默认值

另外,您在不需要使用co的情况下使用co,这可能会导致问题,因为它在事件循环的下一个滴答声执行服务函数中的代码,即调用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');
  });
}();

记录器调用似乎有输入错误。您没有logger.info,只有logger。@Sri是的,谢谢您,这是一个输入错误,尽管这并没有解决问题。我不确定这是否是问题所在,当我在线尝试babel validator时,我在箭头函数参数中得到了无效的左侧。这很有意义,它解决了解析错误,但appbj.get'logger'返回未定义,即使我在appStartup应用程序中设置了它@user988544 appObj似乎是一个新实例。它仍然是require./src/appStartup'的一个新实例;正当那么它应该在appStartup.js中设置属性?我可能不明白这一点correctly@user988544哦,等等,问题可能是co的使用。你不需要它。它导致问题是因为它是异步的,但它里面的代码不是,所以它不需要,因为后者,这导致了问题,因为由于前者,记录器设置到应用程序实例太晚了。请参见编辑。