每次调用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)
答案 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
,您应该实现类似的方法,我留给您;)