2016-06-01 90 views
-1

在節點中,我有以下函數/類,它實例化我想用於其他函數/類的記錄器對象。module.exports對象實例的其他應用程序使用

server.js

var loggerUtil = require('./utils/logger'), 
    logger; 

module.exports = function(appInitCb, options) { 
    start: function() { 
     // Load .env 
     dotenv.config({ 
      silent: true 
     }); 

     // Merge the app configuration with default 
     options = _.merge({}, cfgDefaults, options); 

     // Create a logger 
     logger = loggerUtil.createLogger(options.logger).getLogger(); 
    }, 

    logger: logger 
}; 

main.js

var server = require('./server'); 
var logger = require(./server').logger; 

server.start({}, {}); 
logger.info('Hello World'); 

然而,它導致錯誤TypeError: logger.info is not a function。我猜我的出口方式有問題。任何幫助表示讚賞。

+0

您錯過了一個報價? – adeneo

+0

你真正想實現的是什麼,因爲需要兩次'./server'模塊沒有任何意義。 – Nivesh

+0

此外,您必須先調用start來實例化記錄器對象。如果你想簡單地要求它而不是一次又一次地實例化,那麼你必須檢查記錄器是否已經被實例化。 – Nivesh

回答

0

你需要將它導出像這樣

module.exports = function(appInitCb, options) { 
    return({ 
    start: ... 
    log: ... 
    }) 

}

在您的例子不必返回統一了這兩種功能的對象。

然後,您可以要求該模塊像這樣(感謝@Nivesh):

var server = require('./server')(); 
server.start(); 

更新

一個更好的方法是創建一個對象,並直接分配給它沒有功能的模塊:

var server = { 
    start: function(){...}, 
    log: function(){...}, 
} 

module.exports = server; 

這樣,你可以:

var server = require('./server'); 
server.start() 
server.log() 
+0

你可以看到我輸出多件東西。啓動功能和記錄器對象。 – nixgadgets

+0

是的,她出口多種東西。除此之外,建議不要這樣做。 – Nivesh

+0

是的,現在它很好,@ nixgadgets你正在導出一個函數,並寫作一個對象。這是這裏最基本的錯誤。 – Nivesh

相關問題