2017-10-08 7 views
0

私はMEANスタックプロジェクトに取り組んでおり、1つのコントローラから別のコントローラに一連の変数を渡そうとしています。Node.JSで複数のオブジェクトをエクスポートする

module.exports = { 
    Router: router, 
    artists: distinctArtistsArray 
} 

ルータオブジェクトは、伝統的なExpressルータですが、distinctArtistsArrayは私のMongoDBデータベース内のすべてのアーティストのString配列である:私の現在のアプローチは、私の**artworks.js**コントローラファイルに対して複数のオブジェクトをエクスポートすることです。私はバックグラウンドで実行されている非同期関数を毎時入れていますdistinctArtistsArray。この配列は、シーンの背後にいくつかのNLPタスクを実行するために、他の場所に書き込まれた他の関数に渡されます。

アーティスト情報の重複した非同期クエリを作成してMongoDBに過度の負荷をかけたくないので、別のコントローラもこれらの変数にアクセスしたいと思っています。ここに私の他のコントローラ(complete.js)があります:

router.get("/", (req, res) => { 
    var ArtworkSearch = require('../controllers/artworks.js'); 
    console.log(ArtworkSearch.artists) 
}); 

私は連続した値に要求が/completeエンドポイントをヒットするたびに再インポートしたいので、私は、コールバック関数内require('../controllers/artworks/js')を配置しました。

私のコンソールでは、私は空の配列([])を受け取ります。これは、私が初期化するものですdistinctArtistsArrayになります。参考までに、同じようなトピックのこのSO postで受け入れられた回答と同じ正確な方法を実行しました。

complete.jsコントローラで私のアーティストのリストを入手するにはどうすればよいですか?

+1

'distinctArtistsArray'が最初は空の場合、どのように値を取得しますか?そのプロパティの最新の値を確認するために再インポートする必要はありません。モジュールはキャッシュされているため、再インポートではモジュールが再び実行されることはありません。キャッシュされたモジュールを最初から返します。 – jfriend00

+0

ありがとうございます。私はモジュールがノードにキャッシュされていることを知らなかった! –

答えて

1

問題はNodeJSの必須モジュールがキャッシュされることです。ノードのドキュメントから:

モジュールは、最初にロードされた後にキャッシュされます。つまり、require( 'foo')へのすべての呼び出しは、同じファイルに解決される場合、返されたオブジェクトと全く同じオブジェクトを返すことを意味します(とりわけ)。

更新された値が必要な場合は、再度ファイルをrequireにする必要はなく、要求コールバックの外に移動することもできます。

このようにあなたが代わりに、配列を返す関数をエクスポートする必要があります

module.exports = { 
    Router: router, 
    artists: function() { 
    return distinctArtistsArray 
    } 
} 

、その後

console.log(ArtworkSearch.artists()) 

あなたはまた、手動で定期的にdistinctArtistsArrayを更新し、あなたのコード内でエクスポートした値を更新でき実行することによって:

module.exports.artists = distinctArtistsArray 

これは前夜あなたはdistinctArtistsArrayを更新しています。

関連する問題