我们有一个代码库(React.js和Hapi.js)。基于该代码库,我们有两个版本的应用程序。 一个是普通的Web应用程序,另一个是Nodewebkit(桌面)版本:
基本上应用程序是相同的,略有不同。例如,Web版本具有用户(登录)管理,而桌面没有。 Web verison使用MySQL,而桌面版使用Sqlite。存在更多差异,但与问题无关:)
我们面临的问题是如何为Nodewebkit版本制作合适的记录器。在Web版本中,我们为Hapi.js实现了Good-console。它是这样的:
var options = {
ops: {
interval: 1000
},
reporters: config.loggers
};
models.sequelize.sync(/*{force: true}*/).then(function(){
server.register({
register: require('good'),
options: options
}, (err) =>{
if(err) {
console.error(err);
} else {
server.start(() =>{
console.info('Server started at ' + server.info.uri);
});
}
});
以后在代码中用作:
}).catch(function (err) {
request.server.log(['error'], err.stack);
response({isError: true, message: 'Could not retrieve connection information'}).code(200);
});
这与预期的一样。
我们面临的问题是如何在Nodewebkit环境中包含相同的日志工具。 通常,由于我们使用相同的代码库,因此日志调用也应该相同。除index.js外,应用程序中的所有文件都是相同的。我们有两个版本,一个用于启动NW.js,另一个用于正常的Web启动。
如果我们在NW.js启动文件中使用Good-console初始化代码(在web verison中有效),则不会发生任何事情。服务器未启动,并且没有错误。 我已经将好的控制台使用的节点模块转换为ECMA5,因为NW.js引擎没有运行ECMA6,但是没有任何反应。
早些时候,我们已经为NW.js版本实现了一个简单的记录器。这只是在启动时使用的,它是这样的:
log4js = require('log4js');
log4js.configure({
appenders: [
{ type: 'console' },
{ type: 'file', filename: 'logs/project.log', category: 'projects' }
]
});
logger = log4js.getLogger('projects');
logger.setLevel('ERROR');
logger.setLevel('INFO');
server.route(require('./server/config/routes'));
models.sequelize.sync({/*force: true*/}).then(function () {
server.start(function () {
logger.info('Nodeweb kit Fun is Started :).');
});
});
Trick是如何使用相同的记录器调用,而不使用代码中的“if”或类似技巧来代替代码。澄清问题:
良好的控制台代码:
request.server.log(['error'], err.stack);
request.server.log(['error'], err.stack);
log4js代码:
logger.info('Nodeweb kit Fun is Started :).');
是否有可能附加(当NW版本启动时)log4js函数到request.server,所以代码不知道loggin工具?
或者非常感谢其他一些想法。
答案 0 :(得分:-1)
我设法使用相同的代码登录两个版本。 仅在NW版本中,我安装了hapi-logger插件。
两个插件现在都使用相同的函数签名:
request.server.log(['error'], err.stack);