如何在Express 4.0路由器中间件中重用MongoClient对象?

时间:2014-05-01 13:43:44

标签: node.js express

在Express 3.x中,我能够为整个应用程序重用一个MongoClient对象。

app.js

var routes = require('./routes'); // Routes for our application
MongoClient.connect('mongodb://localhost:27017/blog', function(err, db) {
  "use strict";
  if(err) throw err;    
  app.engine('html', cons.swig);
  app.set('view engine', 'html');
  app.set('views', __dirname + '/views');
  app.use(express.cookieParser());
  app.use(express.bodyParser());
  // Application routes
  routes(app, db);
  app.listen(8082);
  console.log('Express server listening on port 8082');
});

路由/ index.js

module.exports = exports = function(app, db) {
 //do something
}

在express 4.0中,他们介绍了路由器中间件。像这样的东西

var routes = require('./routes/index');
app.use('/', routes);

如何将MOngoClient对象传递给路由器中间件?

3 个答案:

答案 0 :(得分:1)

您可以使用'Mongo.js'之类的单独模块来定义连接并存储MongoClient instance(_db)

然后在指定(eg bin/www by default)的启动脚本中包含该模块并创建连接。 这样连接只会打开一次,但您也可以通过包含object (_db)

重复路由中的数据库'Mongo.js'

答案 1 :(得分:1)

您仍然可以通过修改routes/index.js

来使用相同的模式
var express = require('express');
var router = express.Router();

module.exports = function(db) {
    /* GET home page. */ 
    router.get('/', function(req, res, next) {
        res.render('index', { title: 'Express' });
    });
    return router;
}

请注意最后的return router

在您的app.js

MongoClient.connect('mongodb://localhost:27017/blog', function(err, db) {
    ...
    app.use('/', routes(db))
    ...
}

答案 2 :(得分:0)

基本上,通过创建一个处理所有数据库操作的类,可以减少应用程序代码中的混乱。此外,回调的使用使您可以有效地处理通常在mongodb操作中通常获得的输出。

下面的示例代码清除名为"记录"的示例集合中的所有记录,有效地向回调(如果有)抛出错误,并将结果抛出到回调供您使用。

根据需要使用mongodb网站上常用的CRUD方法

@ http://mongodb.github.io/node-mongodb-native/2.2/tutorials/crud/

检查以下代码。



class SimpleMongoManager {
  constructor(dbURL) {
    if (!dbURL) {
      console.error(`dbURL required!`);
      throw (`@ constructor`);
    }
    this.mongoClient = require('mongodb').MongoClient;
    this.assert = require('assert');
    this.dbURL = dbURL;
    this.collectionName = collectionName;
  }
  initialize(callback) {
    var self = this;
    this.mongoClient.connect(this.dbURL, function(err, db) {
      if (err) {
        console.error(err);
        throw (`@ initialize @ connect`);
      } else {
        self.db = db;
        if (callback) {
          callback(db);
        }
      }
    });
  }
  gracefulExit() {
    var self = this;
    if (self.db) {
      self.db.close();
    }
  }
    debugClearRecords(callback){
    	var self = this;
	    self.db.collection("records").deleteMany({}, function(err, result) {
			if(err){
				console.error(err);
				throw("@ debugClearRecords @ deleteMany");
			}else{
				if(callback){
					callback(null, result.deletedCount);
				}
			}
		});
	}
}

/* Sample Usage */


var smInstance = new SimpleMongoManager("mongodb://localhost:27017/anterior");

smInstance.initialize(function(db){
    console.log("DB Connection OK!");
});


smInstance.debugClearRecords(function(err, result){
	console.log(err);
	console.log(result);
});

/* Sample Route */
 
app.get('/clear_records', function(req, res){
    
    /* Any checks here, if user is admin, whatever. */

    smInstance.debugClearRecords(function(err, result){
	     console.log(err);
	     console.log(result);
         res.redirect('/');
    });

});