在node.js中构建单例的最佳实践

时间:2017-12-11 21:19:04

标签: node.js express

我正在尝试构建一个快速应用程序,我需要创建一些单例(如Sequelizer中的db对象)。

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
   });
};

这是一个好习惯吗?

(我也读到了使用require缓存建立单身人士的问题,但我担心,因为在官方文档中他们说需要“可能不会”返回相同的对象)。

1 个答案:

答案 0 :(得分:-1)

我通常如何做到这一点:

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;

整体只是添加一些中间件,将其添加到req,它将通过管道为您完成。您可以通过将其添加到req.server.<thing>或其他内容来命名它。

您也可以通过引入uuid并将ID附加到您可以在日志语句中使用的另一个中间件中的每个req来生成请求ID,这样您就可以跟踪请求。< / p>

或者,只需要将这些单身人士放入todoRoutes.js并直接使用它们。他们是你服务器上的单身人士,所以我没有看到任何问题。