2017-12-11 12 views
0

私はエクスプレスアプリを開発しようとしています。シングルトン(Sequelizerのdbオブジェクトなど)を作成する必要があります。node.jsでシングルトンを構築するためのベストプラクティス

app.js

app.use(...); 
app.use(...); 
var serviceLocator = { 
    foo: require('foo'), 
    bar: require('bar') 
}; //object holding singletons. 
app.use('/api/todo', new todoRoutes(serviceLocator)); 

todoRoutes.js

module.exports = (serviceLocator) => { 
    var router = express.Router(); 

    router.get('/', (req,res,next) => { 
     //use serviceLocator.foo 
    }); 

    router.get('/:id',(req,res,next) => { 
     //use serviceLocator.bar 
    }); 
}; 

これは良い習慣ですか?

(必要キャッシュを使用してシングルトンを構築する方法についても読んだことがありますが、公式ドキュメントでは同じオブジェクトを返す必要があると言っているので心配しています)全体的にはいくつかのミドルウェアを追加することです

app.js

const db = require('./path/to/db/singleton'); 
const sql = require('./path/to/Sequelizer/singleton'); 

app.use(...); 
app.use((req, res, next) => { 
    req.db = db; 
    next(); 
}); 
app.use((req, res, next) => { 
    req.sql = sql; 
    next(); 
}); 
app.use('/api/todo', require('./todoRoutes'); 

todoRoutes.js

const express = require('express'); 
const router = express.Router(); 

router.get('/', (req,res,next) => { 
console.log(req.db); 
}); 

router.get('/:id',(req,res,next) => { 
    console.log(req.sql); 
}); 

module.exports = router; 

:私は通常、それは次のようになりますどうすればよい

+0

ここにはシングルトンはありません。あなたはあなたがその関数を呼び出すたびに新しい 'router'を生成しています。クロージャー内で 'serviceLocator'をキャプチャしている場合は、それがシングルトンであるかどうかは関係ありません。 – tadman

+0

'todoRoutes()'がモジュールとしてキャッシュされますが、返すRouterインスタンスは 'new todoRoutes()'を呼び出すたびに新しい 'Router'を返すので、シングルトンではありません。したがって、この場合、 'module.exports'に返される無名関数はモジュールとしてキャッシュされますが、' Router'はキャッシュされず、シングルトンではありません。 – peteb

+0

確かに、私が使いたいシングルトンはfooとbarです。これはserviceLocatorに登録されています。私はtodoRoutesをシングルトンにしたくありません。私がserviceLocator.fooを内部で呼び出すと、exportReset =(serviceLocator)=> {}のproductRoutesのような別のルートを作成した場合、todoRoutes内でserviceLocator.fooを呼び出すと同じオブジェクトを取得します。 –

答えて

-1

reqにパイプラインを追加してパイプラインを通過させます。あなたはそれをreq.server.<thing>か何かに追加することでそれを名前空間することもできます。

また、uuidを持って来て、後でログステートメントで使用できる別のミドルウェアのすべてのreqにIDを付けることで、リクエストIDを生成することもできます。

また、これらのシングルトンをtodoRoutes.jsに入力して直接使用するだけで済みます。彼らはあなたのサーバー上のシングルトンなので、私はそれに何の問題も見ません。

+0

あなたの答えをありがとう、しかし、私は何のための解明を探している場合は、シングルトンのためのNode.jsモジュールのキャッシュに頼っても大丈夫ですか?キャッシュがクリアされ、新しいオブジェクトで終わることができる状況があるでしょうか? –

+0

これは私の「代替」回答でしたが、残念ながら、私は元の投稿から質問をクリアしませんでした。はい、ノードが最初に起動すると、モジュールオブジェクトの作成が必要になり、モジュールオブジェクトがキャッシュされたままになります。私は彼らが誤って行った時を聞いたことがないし、他の誰かがそれを報告したかどうかを知りたいと思っていた。あなたがそれをクリアしない限り、それはそこにとどまり、依頼されることができます。 –

+0

よろしくお願いします。 –

関連する問題