Javascript 将消息记录为express app.listen回调
我将winston登录引入我的应用程序,我想用winston的.info和.error替换所有信息或错误级别的日志。到目前为止,除了我尝试在app.listen回调中记录一条信息消息外,其他一切都正常 定义记录器的appStartup.js文件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');
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的使用。你不需要它。它导致问题是因为它是异步的,但它里面的代码不是,所以它不需要,因为后者,这导致了问题,因为由于前者,记录器设置到应用程序实例太晚了。请参见编辑。