Rappelez-vous MongoClient.connect()
est asynchrone. La connexion à la base de données n'est peut-être pas prête au moment où vous faites var user=db.collection('user');
. La connexion à la base de données a été établie une fois le rappel effectué, pas avant.
Lorsque la première requête est effectuée, la connexion à la base de données est juste établie. Plus vous attendez, plus il est probable que cela fonctionne, mais c'est toujours la mauvaise approche.
Travailler également avec des variables globales est une mauvaise pratique et conduit à la confusion et autres problèmes .
En bref, le code devrait ressembler à
// module database.js
var mongodb= require('mongodb');
var MongoClient= mongodb.MongoClient;
var URL = 'mongodb://127.0.0.1:27017/mainDB';
var db;
var error;
var waiting = []; // Callbacks waiting for the connection to be made
MongoClient.connect(URL,function(err,database){
error = err;
db = database;
waiting.forEach(function(callback) {
callback(err, database);
});
});
module.exports = function(callback) {
if (db || error) {
callback(error, db);
} else {
waiting.push(callback);
}
}
}
Que de l'utiliser comme
var db = require('database.js');
router.post('/',function(req,res,next){
username=req.body.username;
password=req.body.password;
db.conn(function(err, database) {
if (err) {
res.sendStatus(500);
console.log(err);
return;
}
database.collection('users').findOne({'username':username, 'password':password}, function(err, docs){
//do something
});
});
});
Notez que la connexion est établie sur le premier require, donc si vous ajoutez require('database.js');
dans App.js. Vous ne perdez pas le à la première demande.
Vous pouvez également utiliser des promesses , qui s'occupe de la logique d'attente pour vous.