私はエクスプレスアプリを開発しようとしています。シングルトン(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;
:私は通常、それは次のようになりますどうすればよい
ここにはシングルトンはありません。あなたはあなたがその関数を呼び出すたびに新しい 'router'を生成しています。クロージャー内で 'serviceLocator'をキャプチャしている場合は、それがシングルトンであるかどうかは関係ありません。 – tadman
'todoRoutes()'がモジュールとしてキャッシュされますが、返すRouterインスタンスは 'new todoRoutes()'を呼び出すたびに新しい 'Router'を返すので、シングルトンではありません。したがって、この場合、 'module.exports'に返される無名関数はモジュールとしてキャッシュされますが、' Router'はキャッシュされず、シングルトンではありません。 – peteb
確かに、私が使いたいシングルトンはfooとbarです。これはserviceLocatorに登録されています。私はtodoRoutesをシングルトンにしたくありません。私がserviceLocator.fooを内部で呼び出すと、exportReset =(serviceLocator)=> {}のproductRoutesのような別のルートを作成した場合、todoRoutes内でserviceLocator.fooを呼び出すと同じオブジェクトを取得します。 –