MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Express js, mongodb:ReferenceError:db não é definido quando db é mencionado fora da função post


Lembre-se de MongoClient.connect() é assíncrono. A conexão com o banco de dados pode não estar pronta no momento em que você faz var user=db.collection('user'); . A conexão com o banco de dados foi feita assim que o retorno de chamada foi concluído, não antes disso.

Quando a primeira solicitação é feita, a conexão com o banco de dados é estabelecida. Quanto mais você esperar, mais provável é que funcione, mas ainda é a abordagem errada.

Trabalhar também com variáveis ​​globais é uma prática ruim e gera confusão e outros problemas .

Em suma, o código deve se parecer com
// 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);
  }
}
}

Do que usá-lo 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
    });
  });
});

Observe que a conexão é feita no primeiro require, portanto, se você adicionar require('database.js'); em App.js. Você não perde o no primeiro pedido.

Como alternativa, você pode usar promessas , que cuida da lógica de espera para você.