我正在尝试构建一个快速应用程序,我需要创建一些单例(如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并直接使用它们。它们是您服务器上的单例,所以我看不出任何问题。