据我可以从Express documentation收集,当您声明express.Router()
时,它会创建一个路由器的单个实例,然后您可以分配路由路径并执行逻辑。该文档说,想到一个路由器就像一个特定路线或路线的迷你应用程序,这是有道理的。
我正在尝试制定包装数据库连接的策略(使用mongodb,让我们说通过mongoose,但它应该没关系)。我当然不想在每个路由调用上打开一个新的数据库连接,我假设如果我将它包装在路由器周围,则只会创建一个Router()
实例。换句话说,如果我去了/routes/index.js
,定义了一个Router()
,然后打开了一个数据库连接,然后在其中router.get
(或router.post
等),我将在启动应用程序时打开一个数据库连接,而不是在该路由上每次点击一个。
然而,除index.js
之外,可能还有其他路径需要访问数据库。所以或者,我可以围绕主app.use
文件中的app.js
路由处理程序和其他中间件,然后require('../app')
/routes
文件中的module.exports
包装数据库连接,并将数据库连接添加到app.js
中的/routes/index.js
,最后在UPSERT
等其他文件中定义路由逻辑?
我对如何构建一切感到困惑。任何指导都将非常感谢。
答案 0 :(得分:1)
如果您使用的是mongoose,您可以使用以下代码连接一次:
mongoose.connect("mongodb://127.0.0.1:27017/test");
mongoose.connection.on('error', console.error.bind(console, 'Db connection error:'));
// Start the server once we have connected to the database.
mongoose.connection.once('open', () => {
console.log('Db connection open.');
app.listen(3000, function () {
console.log('Listening on port 3000');
});
});
然后,如果你有一个名为Foo
的猫鼬模型设置为
const Foo = mongoose.model('Foo', fooSchema); // fooSchema is a mongoose.Schema
然后在您的路线中,您可以像这样使用它:
const router = express.Router();
const Foo = require('./models/foo');
router
.route('/foos/:foo_id')
.get((req, res)=> {
Foo.findById(req.params.foo_id, (err, foo) => {
if (err) return res.sendStatus(500);
if (!foo) return res.status(404).send('Foo not found.');
res.status(200).json(foo);
});
});
这种设置允许mongoose处理连接池。