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



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

应用.js

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

待办事项路线.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 "可能不会"返回相同的对象)。

我通常的做法如下所示:

应用.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');

待办事项路线.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>或其他东西来命名它。

您还可以执行此操作以生成请求 ID,方法是引入uuid并将 ID 附加到另一个中间件中的每个 req,以便稍后在日志语句中使用,这样您就可以跟踪请求。

或者,只需将这些单例引入todoRoutes.js并直接使用它们。它们是您服务器上的单例,所以我看不出任何问题。

最新更新