2013-08-15 9 views
5

Mam bardzo proste "server.js" setup że próbuję uruchomić:Jaki jest właściwy sposób radzenia sobie z połączeniami mangusty z plikiem 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...'); 

To jest skonfigurowany do łączenia się localhost:3000

Kiedy przejdź do localhost:3000/first_test, to nazywa „popSingleData "metody w 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])); 
       } 
      } 
     }); 


    }); 

}; 
... 

linie które powodują problem stanowią pierwszy 3:

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

Po zadeklarowaniu w funkcji skrypt działa zgodnie z oczekiwaniami, wypisując obiekty JSON znalezione z bazy danych. Gdy są zdefiniowane w testscript.js, ale poza zakresem metody, program zawiesza się na db.once('open', function callback() {...}); command.

Czy ktoś mógłby rzucić nieco światła na różnicę, która powstaje podczas przenoszenia tych 3 linii kodu? Czy naprawdę muszę utworzyć nowe połączenie za każdym razem, gdy chcę mieć inną funkcję dostępu do bazy danych?

Odpowiedz

16

Jeśli połączyłeś się już z bazą danych, zdarzenie once nie zostanie ponownie uruchomione. Baza danych była już podłączona do całego procesu NodeJs, gdy była połączona globalnie (poza funkcją).

Połączenie z numerem mongoose.connect('mongodb://localhost/test'); powoduje nawiązanie połączenia i otwiera je.

Zamiast otwierania go przy każdym wywołaniu funkcji (co byłoby nieefektywnym sposobem interakcji z MongoDB) connect natychmiast po uruchomieniu aplikacji NodeJs i rozważeniu okresu, w którym połączenie może nie zostać nawiązane dostępne (jak to jest asynchroniczne) lub nie uruchamiaj aplikacji (listen), dopóki połączenie nie zostanie zakończone (lub z przekroczonym limitem czasu). W przypadku Mongoose, dopóki połączenie nie zostanie nawiązane, wszystkie polecenia są buforowane (ale może nie być to zachowanie, które chcesz). Możesz użyć zdarzenia open, jeśli chcesz się dowiedzieć, kiedy połączenie zostało zakończone.

Połączenie można znaleźć tutaj: mongoose.connection, jeśli używasz funkcji connect do utworzenia połączenia.

Po nawiązaniu połączenia można go używać z poziomu funkcji popSingleData bez korzystania z zdarzenia i oddzwonienia once. Jest automatycznie utrzymywana pula połączeń.

Aby uzyskać więcej informacji na temat połączeń, przeczytaj here.

+0

Więc 'mongoose.connect' jest tym, co tworzy połączenie? Więc powodem, dla którego nie działa, gdy jest poza metodą, jest to, że metoda znajduje to już otwarte, więc db.once ("open") nigdy się nie dzieje? –

+0

Tak, próbowałem wyjaśnić to w mojej odpowiedzi. – WiredPrairie

+0

Cudownie. Usunięto kod z wywołania zwrotnego i wygląda na to, że działa świetnie. Dziękuję bardzo! –

Powiązane problemy