sql >> Databasteknik >  >> NoSQL >> MongoDB

Express js,mongodb:ReferenceError:db är inte definierat när db nämns utanför postfunktionen

Kom ihåg MongoClient.connect() är asynkron. Databasanslutningen kanske inte är klar när du gör var user=db.collection('user'); . Databasanslutningen har gjorts när återuppringningen har gjorts, inte tidigare än så.

När den första begäran är klar, råkar databasanslutningen bara upprättas. Ju längre du väntar desto mer sannolikt är det att det fungerar, men det är fortfarande fel tillvägagångssätt.

Att arbeta med globala variabler är dålig praxis och leder till förvirring och andra problem .

Kortfattat ska koden se ut

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

Använd det som

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

Observera att anslutningen görs på det första kravet, så om du lägger till require('database.js'); i App.js. Du förlorar inte på den första begäran.

Alternativt kan du använda löften , som tar hand om väntelogiken åt dig.



  1. Säkerhetskopiera en MongoDB-databas med mongodump

  2. Serverar dynamiska webbadresser med express och mongodb

  3. Mongodb windows setup admin webbkonsol väntar på anslutningar på port 28017 fel

  4. MongoDB - Uppröstning/nedröstning av kommentarer med aggregationspipeline