2013-08-15 12 views
5

Ho un semplice setup "server.js" che sto provando a fare funzionare:Qual è il modo corretto di gestire le connessioni di mangusta con express.js?

var express = require('express'), 
    wines = require('./routes/testscripts'); 

var app = express(); 

app.get('/first_test', wines.popSingleData); 

app.listen(3000); 
console.log('Listening on port 3000...'); 

Questa è configurato per la connessione a localhost:3000

Se navigando nelle localhost:3000/first_test, si chiama la "popSingleData "metodo entro testscript.js:

... 
    var mongoose = require('mongoose'); 

    mongoose.connect('mongodb://localhost/test'); 

    var db = mongoose.connection; 

    console.log('include called'); 

exports.popSingleData = function(req, res) { 

// var mongoose = require('mongoose'); 

// mongoose.connect('mongodb://localhost/test'); 

// var db = mongoose.connection; 

    console.log('function called'); 

    db.on('error', console.error.bind(console, 'connection error:')); 
    console.log('error handler set'); 
    db.once('open', function callback() { 
     //yay! 
     console.log("DB Opened"); 

     var someSchema = require('../models/someSchema'); 

     someSchema.find(function (err, found){ 
      if (err) 
      { 
       console.log('err'); 
      } 

      if(found.length != 0) 
      { 
       console.log("Found Data:"); 
       console.log(found); 
       for(var i = 0; i < found.length; i++) 
       { 
        res.jsonp((found[i])); 
       } 
      } 
     }); 


    }); 

}; 
... 

le linee che causano questione sono i primi 3:

var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/test'); 
var db = mongoose.connection; 

Quando vengono dichiarati all'interno della funzione, lo script viene eseguito come previsto, stampando gli oggetti JSON trovati dal database. Quando sono definiti all'interno di testscript.js, ma non rientra nell'ambito del metodo, il programma si blocca su db.once('open', function callback() {...}); command.

Qualcuno potrebbe far luce sulla differenza che si verifica dallo spostamento di queste 3 righe di codice? Devo davvero creare una nuova connessione ogni volta che voglio una funzione diversa per accedere al database?

risposta

16

Se si è già connessi al database, l'evento once non si riavvia. Il database era già connesso per l'intero processo NodeJs quando era collegato globalmente (al di fuori della funzione).

La chiamata a mongoose.connect('mongodb://localhost/test'); effettua la connessione e la apre.

Quindi, invece di aprirlo su ogni chiamata di funzione (che sarebbe un modo inefficiente di interagire con MongoDB) connect subito dopo l'avvio dell'app NodeJs e considerare che ci sarà un periodo in cui la connessione potrebbe non essere disponibile (dato che è asincrono), o non avviare l'app (listen) fino al completamento della connessione (o con un timeout). Con Mongoose, fino a quando non viene stabilita la connessione, tutti i comandi sono memorizzati nel buffer (ma potrebbe non essere il comportamento desiderato). È possibile utilizzare l'evento open se si desidera sapere quando la connessione è completa.

La connessione è disponibile qui: mongoose.connection se si utilizza la funzione connect per creare la connessione.

Una volta aperta la connessione, è possibile utilizzarla dalla funzione popSingleData senza utilizzare l'evento once e la richiamata. C'è un pool di connessioni gestito automaticamente.

Per ulteriori informazioni sulle connessioni, leggere here.

+0

Quindi "mongoose.connect' è ciò che crea la connessione? Quindi il motivo per cui non funziona quando si trova all'esterno del metodo, è che il metodo lo sta già trovando aperto, quindi il db.once ("open") non succede mai? –

+0

Sì, ho cercato di chiarirlo nella mia risposta. – WiredPrairie

+0

Meraviglioso. Spostato il codice dal callback e sembra funzionare alla grande. Grazie mille! –

Problemi correlati