我正在尝试构建一个快速应用程序,我需要创建一些单例(如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缓存建立单身人士的问题,但我担心,因为在官方文档中他们说需要“可能不会”返回相同的对象)。
答案 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并直接使用它们。他们是你服务器上的单身人士,所以我没有看到任何问题。