Node.js express4重用mongodb句柄

Node.js express4重用mongodb句柄,node.js,mongodb,Node.js,Mongodb,我不熟悉javascript和nodejs编程。我试图在express框架中连接mongodb,但喜欢保持代码模块化。我写了下面的代码。我使用的是express版本4.14.0和mongodb驱动程序2.2.27版本以及nodejs v6.10.3 //app.js var express = require('express'); var app = express(); var index = require('./routes/index'); app.use('/', index); a

我不熟悉javascript和nodejs编程。我试图在express框架中连接mongodb,但喜欢保持代码模块化。我写了下面的代码。我使用的是express版本4.14.0和mongodb驱动程序2.2.27版本以及nodejs v6.10.3

//app.js
var express = require('express');
var app = express();
var index = require('./routes/index');
app.use('/', index);
app.listen(3000);

//routes/index.js
var router = require('express').Router();
var anotherfile = require('../controllers/anotherfile');

router.get('/', function(req, res) {
        res.send('Connected');
});    
module.exports = router;

//controllers/db.js
var MongoClient = require('mongodb').MongoClient;
var connectionString = 'mongodb://user:password@127.0.0.1:27017/testdb';
var _db;

MongoClient.connect(connectionString, function(err, db) {
  if (err) {
    console.log('Error: ', err);
  } else {
    console.log('Connected!');
    _db = db;
    console.log("_db",_db);
  }
});

module.exports.getDb = function() {
  return _db;
}

//controllers/anotherfile.js
var connect = require('./db.js');
var db1 = connect.getDb();
console.log("print db1",db1);

我想从上面的代码中得到的是访问anotherfile.js中的db handle。我做错了什么?

要保持代码模块化,您应该将数据库函数保存在一个单独的文件中,然后从另一个
文件.js
访问这些函数。这样,您也可以将该数据库函数文件用于其他项目

mongoConfig.js

var express = require('express');
var router = express.Router();
module.exports = router;
var mongo = require('mongodb');
var uri = '<MongoDB server path>';

module.exports.insert = function(collectionName, json, callback) {
  mongo.MongoClient.connect(uri, function(err, db) {
    if (!err) {

    } else {

    }
  });
};

module.exports.retrieve = function(collectionName, json, callback) {
  mongo.MongoClient.connect(uri, function(err, db) {
    if (!err) {

    } else {

    }
  });
};
var express = require('express');
var app = express();
var index = require('./routes/index');
app.use('/', index);
app.listen(3000);

//routes/index.js
var router = require('express').Router();
var anotherfile = require('../controllers/anotherfile');

router.get('/', function(req, res) {
    res.send('Connected');
});    
var Mongo = require('./mongoConfig');.
Mongo.insert();
Mongo.retrieve();
那么

anotherfile.js

var express = require('express');
var router = express.Router();
module.exports = router;
var mongo = require('mongodb');
var uri = '<MongoDB server path>';

module.exports.insert = function(collectionName, json, callback) {
  mongo.MongoClient.connect(uri, function(err, db) {
    if (!err) {

    } else {

    }
  });
};

module.exports.retrieve = function(collectionName, json, callback) {
  mongo.MongoClient.connect(uri, function(err, db) {
    if (!err) {

    } else {

    }
  });
};
var express = require('express');
var app = express();
var index = require('./routes/index');
app.use('/', index);
app.listen(3000);

//routes/index.js
var router = require('express').Router();
var anotherfile = require('../controllers/anotherfile');

router.get('/', function(req, res) {
    res.send('Connected');
});    
var Mongo = require('./mongoConfig');.
Mongo.insert();
Mongo.retrieve();

使用require将
mongoConfig.js
导入您的
anotherfile.js

这基本上是新js开发人员与异步代码之间的经典问题

// When you require db.js, you're kicking off `MongoClient.connect`, which is
// an async function.
var connect = require('./db.js');

// On the very next line when you `getDb`, the connect function callback has not 
// happened yet, and db1 is undefined.
var db1 = connect.getDb(); //=> undefined
如果将
getDb
的执行推迟到connect函数完成后,它应该可以工作

setTimeout(function () {
  var db1 = connect.getDb(); //=> no longer undefined
}, 5000);
在express应用程序中,您通常在异步路由中运行代码。因此,在调用
connect
很久之后,数据库就会被访问,这就不是问题了(这就是为什么如果你用谷歌搜索,你会看到人们按照你正在尝试的方式来做)


如果您想以不同的方式解决问题,您可以考虑<代码> MangoCclipse。Connect < /C> >当未通过回调时,返回承诺。这意味着您可以非常简单地重写您的示例,如:

// db.js
var MongoClient = require('mongodb').MongoClient;
var connectionString = '...';
var connectPromise = MongoClient.connect(connectionString);

exports.getDb = function () {
  return connectPromise;
}

// anotherfile.js
var db = require('./db');
db.getDb().then(function (db) {
  // This callback will never run until the connect promise has
  // resolved and the db is ready.  Calling `getDb` again will not
  // initiate another call to `MongoClient.connect`
  console.log(db);
});

我只需要在其他文件中使用db句柄。我想将连接代码保存在db.js文件和所有其他文件中,以使用该句柄并执行相应的任务。我计划在其他文件中添加更多函数。因此,我需要db句柄。