在 express 中间件中使用 monk / mongo 的有效、正确的方法是什么?

Whats an efficient, correct way of using monk / mongo in express middleware?

我有一个正在开发的网络应用程序。我发现 CW Buechler's tutorial 如何使一个简单的非常有用,但有一些琐碎的担忧,我想知道它们是真正的问题,还是我可以忽略的事情。

我将路由连接到数据库的方式直接来自教程。

在 app.js 中,此代码实例化数据库,并将对它的引用附加到流经中间件的每个请求对象。

// wire up the database
var mongo = require('mongodb');
var db = require('monk')('localhost:27017/StarChamber');

----------8<-------

// Make our db accessible to our router
app.use(function(req,res,next){
    req.db = db;
    next();
});

在中间件中它是这样使用的:

app.get('/', function (req, res) {
    var db = req.db;
    var collection = db.get('myCollection');
    // do stuff to produce results
    res.json (results);
});

所以,对于我琐碎的担忧:

  1. 通过将数据库附加到请求将数据库传递给路由非常方便,但这会影响性能吗?在我可以使用的路由器文件中引用它会更好吗?执行此操作的代码是什么?
  2. 在使用后删除集合是一种好习惯吗?本教程没有这样做,但是在退出路由处理程序之前进行 collection.drop() 调用看起来很有用,否则我认为我只会与数据库建立大量打开的连接。

一如既往的感谢!

  1. 不,它不会影响性能。传递对 db 的引用是一种方便的方法,但对于 Monk 来说,这似乎并不是特别必要。请参阅下面的替代设置。
  2. 您混淆了 collectionsconnections。前者是 SQL 中 "tables" 的 MongoDB 等价物,因此删除它们似乎没有意义,因为这基本上会丢弃数据库中的所有数据 table.至于连接:通过各种间接层,Monk 似乎正在使用官方 MongoDB 节点驱动程序,它自己处理连接(通过连接池)。所以没必要自己处理。

另一种传递 Monk 数据库句柄的方法:您可以将它放在一个单独的模块中:

// database.js
module.exports = require('monk')('localhost:27017/StarChamber');

并且在需要句柄的每个模块中,您可以导入它:

var db = require('./database');