MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Express js, mongodb:ReferenceError:db ist nicht definiert, wenn db außerhalb der Post-Funktion erwähnt wird

Denken Sie an MongoClient.connect() ist asynchron. Die Datenbankverbindung ist möglicherweise nicht bereit, wenn Sie var user=db.collection('user'); ausführen . Die Datenbankverbindung ist hergestellt, sobald der Rückruf erfolgt ist, frühestens.

Wenn die erste Anfrage erledigt ist, wird die Datenbankverbindung einfach hergestellt. Je länger Sie warten, desto wahrscheinlicher ist es, dass es funktioniert, aber es ist immer noch der falsche Ansatz.

Auch das Arbeiten mit globalen Variablen ist eine schlechte Praxis und führt zu Verwirrung und andere Probleme .

Kurz gesagt sollte der Code so aussehen

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

Dann benutze es wie

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

Beachten Sie, dass die Verbindung beim ersten Erfordernis hergestellt wird, also wenn Sie require('database.js'); hinzufügen in App.js. Sie verlieren die nicht bei der ersten Anfrage.

Alternativ können Sie Versprechen verwenden , der die Wartelogik für Sie übernimmt.