2017-10-12 7 views
0

モジュールの読み込みがであるとわかっていますが、はnode.jsで動作すると思われますが、正しく動作しているとは思いません(実際に見ると、要求を呼び出すと同じオブジェクトが返されない

nodejs 8.2.1を使用してthis answerのコメント)、I以下の構造を持っている:私require('winston') server.jsで

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

、私はrequire('./log')を呼び出し、/log/index.jsにし、設定そうですね:

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も踏んだ。他のモジュールはキャッシュに追加されないので、キャッシュが正常に動作している場合は、同じ設定済みのインスタンスに返す必要があります。 db/index.jsのモジュールも読み込まれる前にlog/index.jsのコードが呼び出されていることを確認しました。

アイデア?私はrequire私の./logモジュールを私のすべての依存モジュールに入れるべきですか?

+1

設定したロガーは必要ありませんか? – Icepickle

答えて

1

どのようなアイデアですか?私の./logモジュールを私のすべての依存モジュールで要求するだけでいいですか?

はい。あなたが言ったように、親モジュールがすでに必要とするモジュールが必要なときは、同じオブジェクトにアクセスしています。しかし、実際にはwinstonを使ってコンストラクタをインポートしています(実際には設定するには、loggerという変数を定義し、新しいwinson loggerを作成します)。

あなたが

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

ロガーは常に同じオブジェクトになります行うことができます(代わりにletのと使用CONST)ログ/ index.jsからあなたがすべき唯一の輸出ロガー別のモジュールで

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

:)

1

はい、Winstonの新しいインスタンスを作成するため、./logファイルをrequireにする必要があります。することができますあなたの他のコードに続いて

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をインポートするだけで、あなたが作成して設定したものではなく、デフォルトが得られます。 –

関連する問題