2017-01-31 66 views
0

我使用MongoDB在數據庫中插入記錄,每次調用post方法。我知道我不想每次連接到post函數中的數據庫,但是這給我錯誤?我該如何解決這個問題?Mongo 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) 
+1

保存自己很多頭痛的,使用Mongoose模塊。它對連接管理和模式/驗證兩方面都有很大的幫助。 – Paul

回答

1

的問題是你的db不指向蒙戈實例,而一個功能!

試試這個 -

var mongo = require('mongodb'); 

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

你不能簡單地從異步方法返回一個值:

您應該使用回調功能:

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改變函數名connectDb,因爲我們要連接到數據庫,然後做一些事情後,連接。這樣你的代碼讀得很好。

還要注意的是,這裏也是你的insertItem功能做一個異步任務,所以如果你需要的result超出這個功能,你應該執行類似的方法,我把它留給你;)