我正在将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}}。我知道如何才能使这项工作?
答案 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
方式重写箭头功能。
希望这有帮助!