2017-10-12 105 views
0

我知道模塊加載是如何加載假設在node.js中工作,但我沒有觀察到正確的行爲(並且它看起來實際上看起來有點不一致調用require不會返回相同的對象

使用8.2.1的NodeJS上this answer的評論),我有以下結構:

app 
| 
+ server.js 
+ log 
| | 
| + index.js 
+ db 
    | 
    + index.js 

在server.js,我打電話require('./log'),並在/log/index.js,我require('winston')和配置它是這樣的:

let logger = new (winston.Logger)({ 
    transports: [ 
    new (winston.transports.Console)({ 
     name: 'console', 
     level: logLevel, 
     handleExceptions: true, 
     json: false, 
     colorize: process.env.NODE_ENV === 'dev', 
     timestamp: true 
    }) 
    ] 
}); 

根據this answer,我應該可以從任何其他模塊只require('winston'),我會得到相同的配置實例。我實際看到的是,當我require('winston')db/index.js中時,默認的winston實例在內存中,根本沒有配置。我也通過了require.cache;沒有其他模塊被添加到緩存中,所以據我所知,如果緩存工作正常,則應該返回相同的配置實例。我已驗證log/index.js中的代碼在db/index.js中的模塊正在加載之前正在調用。

任何想法?我應該在所有依賴模塊中使用require我的./log模塊嗎?

+1

不應該需要配置的記錄器嗎? – Icepickle

回答

1

任何想法?我應該只需要我的所有依賴模塊中的./log模塊?

是的,你應該。就像你說的,當你需要一個父模塊已經需要的模塊時,你正在訪問同一個對象。但實際上,在winston中,你正在導入一個構造函數(實際上,爲了配置它,你需要定義一個名爲logger的變量,並且創建一個新的winson記錄器)。

您應該只從原木/ index.js出口記錄器(和使用const反而讓)

const logger = new (winston.Logger)({ ... }) 
module.exports = logger 

在另一個模塊中,你可以做

const logger = require('./log/index.js') // './log' is the same 

記錄器將永遠是相同的對象:)

1

是的,你應該是require./log文件,因爲你正在創建一個Winston的新實例。你的日誌文件應該在你創建它的溫斯頓記錄器實例的東西,如出口:

let logger = new (winston.Logger)({ 
    transports: [ 
    new (winston.transports.Console)({ 
     name: 'console', 
     level: logLevel, 
     handleExceptions: true, 
     json: false, 
     colorize: process.env.NODE_ENV === 'dev', 
     timestamp: true 
    }) 
    ] 
}); 
module.exports = logger 

然後在你的其他代碼,您可以:

const logger = require('./log') 

,並得到相同的實例。

+0

節點8x中的模塊緩存有所改變嗎? – BrDaHa

+0

沒有模塊仍然被緩存。當你創建一個'new'實例時,你並沒有改變默認實例,你正在創建一個新實例。所以你需要導出。如果您只是導入Winston,您將獲得默認值,而不是您創建和配置的默認值。 –

相關問題