Node.js中的路由器实例与数据库一起表达

时间:2017-11-04 17:14:38

标签: javascript node.js mongodb express

据我可以从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等其他文件中定义路由逻辑?

我对如何构建一切感到困惑。任何指导都将非常感谢。

1 个答案:

答案 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处理连接池。