Mongo DB在post之外建立连接?

时间:2017-01-31 20:13:28

标签: node.js mongodb express database

每次调用post方法时,我都会使用MongoDB将记录插入到数据库中。我知道我不想每次都连接到post函数内部的db,但是这给了我错误?我怎么能纠正这个?

var mongo = require('mongodb');

var url = 'mongodb://localhost:27017/Wedding'
var db = function() {
  mongo.connect(url, function(err, db){
  if (!err){
  return db;
  }
 });
}

app.post('/rsvp', function (req, res) {
 var item ={
  name: req.body.name,
  attending: req.body.attending,
  };
 insertItem(item);
 res.sendFile(path.join(__dirname + '/confirm.html'));
})

function insertItem(item){
 db.collection('rsvpList').insertOne(item, function(err, result){
 assert.equal(null, err);
})
}  

我收到此错误:

TypeError: Object function () { 
mongo.connect(url, function(err, db){ 
if (!err){ 
 return db; 
 } 
}); 
} has no method 'collection'
at insertItem (C:\Users\A587092\Documents\weddingWebsite\server.js:53:8)
at app.listen.host (C:\Users\A587092\Documents\weddingWebsite\server.js:38:4)
at Layer.handle [as handle_request] (C:\Users\A587092\Documents\weddingWebsite\node_modules\express\lib\router\layer.js:95:5)

2 个答案:

答案 0 :(得分:1)

问题是你的db没有指向Mongo实例而不是函数!

试试这个 -

var mongo = require('mongodb');

var url = 'mongodb://localhost:27017/Wedding'
var db;
mongo.connect(url, function(err, connectedDB){
  if (!err){
      db = connectedDB;
  }
});

答案 1 :(得分:1)

您不能简单地从异步方法返回值:

您应该使用回调功能:

vi file <<END
iThis line started with i for the insert mode.
You will need an Escape to leave the insert mode.
Difficult to write here, it will be something like ctrl-v ESC.
It will look like ^]
:wq
END

用法:

var connectDb = function(url, cb) {
  mongo.connect(url, function(err, db){
    if ( err ) {
      cb( err );
    }
    cb(null, db);
  });
};

<小时/> 或承诺

function insertItem(item) {
  connectDb(url, function(error, db) {
    if ( error ) {
      throw error;
    }
    db.collection('rsvpList').insertOne(item, function(err, result) {
      assert.equal(null, err);
    });
  });
}

<强>用法

var connectDb = function(url) {
  return new Promise(function(resolve, reject) {
    mongo.connect(url, function(err, db){
      if ( err ) {
        reject(err);
      }
      resolve(db);
    });
  });
};

我将函数名称从function insertItem(item) { connectDb(url) .then(function(db) { db.collection('rsvpList').insertOne(item, function(err, result) { assert.equal(null, err); }); }, function(err) { throw err; }); } 更改为db因为我们要连接到db然后在连接后执行某些操作。这样你的代码读得很好。

另请注意,此处还有connectDb函数执行异步任务,因此如果您需要此函数之外的insertItem,您应该实现类似的方法,我留给您;)