在Express路由器中使用mongoDB

我只是在学习如何使用node / express和mongodb,而且我对关于连接池的工作有些困惑。

我现在的策略是在路由器级别连接数据库,所以每条路由都有自己的连接。 我的代码我的一个路线如下所示:

var express = require('express'); var router = express.Router(); var config = require('../config.json'); var url = config.db.URI; var MongoClient = require('mongodb').MongoClient , assert = require('assert'); var db; // Connect to database router.all('*', function(req, res, next) { console.log('Connecting to db'); MongoClient.connect(url, function(err, database) { assert.equal(null, err); db = database; }); next(); }); // GET admin list page router.get('/', function(req, res, next) { res.render('lists/index'); var coll = db.collection('lists'); coll.find().each(function(err, obj) { console.log(obj); }); next(); }); router.get('/new', function(req, res, next) { res.render('lists/new'); next(); }); router.all('*', function(req, res, next) { console.log('Closing database'); //db.close(); }); module.exports = router; 

我正在testing这个视图如何与包含我的http请求的两个router.all函数的数据库交互。 在我看来,任何时候请求这个路由器中的一个页面,服务器应该连接到数据库,允许相应的http请求function访问数据库(在这种情况下,只是将其内容打印到控制台),然后closures它一旦http请求完成。 然而,这种情况并非如此。 正如你所看到的,我已经注意到了db.close函数,因为它会抛出一个错误,说“一旦它们被发送,就不能设置头文件”。 我认为这意味着我不太了解Express路由“pipe道”,事情并不按照我期望的顺序执行。

我应该使用不同的路由器方法吗? 也许router.use? 或者我用错误的方式来处理这个问题,我应该把数据库连接放在别的地方吗?

我把这个作为一个参考,对于什么是好的做法,尽pipe集中到了一步,但是他们似乎并没有把这个联系关在一起呢? 如果我没有closures这个连接,我只能看到我的一些mongodb连接上去了,我认为这不是一件好事。 仅仅是你必须在连接的数量和长度之间find平衡吗?

你应该build立连接一次,并在所有的处理程序中使用它。

现在你正在做的是在每个请求上重新连接到数据库,甚至在那些根本不使用数据库的请求上。 此外,你甚至在等待连接build立之前调用next()。

数据库连接的意图是持久的 – 不是一次性的事情,所以你可能会得到很差的performance,你甚至不知道为什么要这么做。 你有一个单一的连接有问题吗? 我不认为像这样锤击你的数据库会有所帮助。 如果有的话,它只会让事情变得更糟。

当你使用本地MongoDB Node.js驱动程序连接到Mongo时,可以使用一些选项,如:

  • poolSize – 为每个单独的服务器或代理连接设置最大poolSize(默认值为5
  • autoReconnect – 错误时重新连接(默认为true

其他一些有趣的选项是: reconnectTriesreconnectIntervalkeepAliveconnectTimeoutMSsocketTimeoutMS

如果您对默认值不满意,您可以更改这些选项的值。

更多信息请参阅:

  • 连接失败和重试
  • MongoClient或如何以一种新的更好的方式进行连接
  • 教程/连接到MongoDB
  • 参考/连接选项/连接设置
  • 关于node.js的问题mongo驱动程序自动重新连接 (邮件列表)