[英]structure node.js App with modules
我想用模塊構建Node.js應用程序。 例如,我使用bunyan作為記錄器。
我有一個文件main.js
//configs
var logfile = __dirname + '/log.txt';
//my own modules
var log = require("./modules/log"),
init = require("./modules/init");
因此,我將日志文件+路徑傳遞給日志模塊。
我的log.js
var bunyan = require('bunyan');
function init(logfile){
var log = bunyan.createLogger({
name: "myapp",
streams: [{
path: logfile
}]
});
return log;
};
module.exports.init = init;
而目前僅捕獲未捕獲異常的init.js:
var logging = require('./log'),
log = logging.init;
process.on('uncaughtException', function(err) {
//print to console
console.error((new Date).toUTCString() + ' uncaughtException:', err.message);
console.error(err.stack);
//print to bunyan logger
log.error((new Date).toUTCString() + ' uncaughtException:', err.message);
log.error(err.stack);
});
我現在的主要問題是我想在每個模塊中使用記錄器。 但是當我這樣做
var logging = require('./log'),
log = logging.init;
在每個文件中,那么它將每次創建記錄器。 我只想初始化一次,然后在每個模塊中使用它。
我考慮過刪除記錄器的功能:
log.js
var bunyan = require('bunyan');
var log = bunyan.createLogger({
name: "juntidos",
streams: [{
path: logfile
}]
});
當我加載模塊時,它只會被調用一次。 但是我該如何傳遞filename參數呢?
因此,我將日志文件+路徑傳遞給日志模塊。
我看到您在require
日志模塊之前先定義了logfile
,但是與瀏覽器中的JavaScript不同,Node.js變量默認情況下不是全局的。
您的任何模塊都不可見您的日志文件路徑。
如果要(1)初始化記錄器,以便可以在整個應用程序中使用它,並且(2)傳遞日志文件名,而不是將其硬編碼到log.js
模塊中,則一種方法是:
// log.js
var bunyan = require('bunyan');
module.exports = {
logger: undefined,
init: function(logfile) {
this.logger = bunyan.createLogger({
name: 'myapp',
streams: [{
path: logfile
}]
});
}
};
現在,您只需要確保init()
恰好被調用一次,並且確保在加載任何其他模塊之前發生這種情況。 那應該很容易:
// main.js
var logfile = __dirname + '/log.txt';
var log = require('./modules/log.js').init(logfile), // init() called here
anotherModule = require('./modules/anotherModule.js')
someOtherModule = require('./modules/someOtherModule.js');
在子模塊中,執行以下操作:
// someOtherModule.js
var log = require('./log.js');
log.logger.warn('someOtherModule was loaded');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.