MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Express js, mongodb :ReferenceError :la base de données n'est pas définie lorsque la base de données est mentionnée en dehors de la fonction de publication

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.