sql >> Base de Datos >  >> NoSQL >> MongoDB

Express js, mongodb:ReferenceError:db no está definido cuando db se menciona fuera de la función de publicación

Recuerda MongoClient.connect() es asíncrono. Es posible que la conexión a la base de datos no esté lista cuando haga var user=db.collection('user'); . La conexión de la base de datos se ha realizado una vez que se realiza la devolución de llamada, no antes de eso.

Cuando se realiza la primera solicitud, simplemente se establece la conexión con la base de datos. Cuanto más espere, más probable es que funcione, pero aún así es el enfoque incorrecto.

Además, trabajar con variables globales es una mala práctica y genera confusión y otros problemas .

En resumen, el código debería verse como

// 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 usarlo como

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

Tenga en cuenta que la conexión se realiza en el primer requerimiento, por lo que si agrega require('database.js'); en App.js. No pierdes el en la primera solicitud.

Alternativamente, puede usar promises , que se encarga de la lógica de espera por usted.