2017-01-31 2 views
0

postメソッドが呼び出されるたびに、MongoDBを使用してデータベースにレコードを挿入しています。私は毎回post関数の中のDBに接続したくないことを知っていますが、これは私にエラーを与えていますか?どうすれば修正できますか?私はこのエラーを取得しています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ではなく機能にMongoのインスタンスを指していないです!

これを試してみてください -

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; 
    }); 
} 

私はconnectDbdbから関数名を変更する我々は、DBに接続すると、その後の後に何かをしているため接続する。このようにしてコードが読みやすくなります。

がも注意してくださいここにも、あなたが同様のアプローチを実装する必要があり、この機能のresult外を必要とする場合、私はあなたにそれを残すように、非同期タスクをやって、あなたのinsertItem機能;)自分で保存

関連する問題