sql >> Database teknologi >  >> NoSQL >> MongoDB

Express js,mongodb:ReferenceError:db er ikke defineret, når db er nævnt uden for postfunktionen

Husk MongoClient.connect() er asynkron. Databaseforbindelsen er muligvis ikke klar på det tidspunkt, du gør var user=db.collection('user'); . Databaseforbindelsen er blevet oprettet efter tilbagekaldet, ikke tidligere end det.

Når den første anmodning er udført, er databaseforbindelsen tilfældigvis oprettet. Jo længere du venter, jo mere sandsynligt er det, at det virker, men det er stadig den forkerte tilgang.

At arbejde med globale variabler er også dårlig praksis og fører til forvirring og andre problemer .

Kort sagt skal koden se ud

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

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

Bemærk, at forbindelsen er lavet på det første krav, så hvis du tilføjer require('database.js'); i App.js. Du mister ikke ved den første anmodning.

Alternativt kan du bruge løfter , som tager sig af ventelogikken for dig.



  1. hvorfor DuplicateKeyError:E11000 duplicate key error index:test.test.$notification_1 dup key:{ :null }

  2. Brug af @Resource injection til Mongo db, inde i Web Bundle inde i OSGI, under Liberty Profile

  3. Brugerdefinerede fejlmeddelelser med Mongoose

  4. Parsing af en lang forespørgselsstreng direkte til MongoDB (ligesom du kan i SQL)