Domanda

Non posso per la vita di me far lavorare Mongoose nella mia app Express. Ive ha installato Mongoose e anche MongoDB tramite NPM (la documentazione di Mongoose non ha indicato se MongoDB fosse richiesto separatamente o come farlo funzionare).

Ecco il codice che sto usando.

    var mongoose = require('mongoose');
    mongoose.connect('mongodb://127.0.0.1/my_database');

    var Schema = mongoose.Schema, ObjectId = Schema.ObjectId;

    var Comments = new Schema({
        title     : String
      , body      : String
      , date      : Date
    });

    var BlogPost = new Schema({
        author    : ObjectId
      , title     : String
      , body      : String
      , date      : Date
      , comments  : [Comments]
      , meta      : {
            votes : Number
          , favs  : Number
        }
    });

    var BlogPost = mongoose.model('BlogPost', BlogPost);
    var post = new BlogPost();
    post.title='blahblah';
    // create a comment
    post.comments.push({ title: 'My comment' });

    post.save(function (err) {
      if(err){
          throw err;
          console.log(err);
      }else{
          console.log('saved!');
      }
    });

Qualcuno ha idea di cosa sto facendo di sbagliato? Non capisco se ho bisogno di iniziare in qualche modo MongoDB separatamente o no (sembra che la funzione Mongoose.Connect avvii il server MongoDB giusto?)

Ma ya, non succede mai nulla quando inizio la mia app (e dovrebbe essere superato l'errore o salvato! Alla mia console quando salvo il post di prova giusto?

Comunque ogni aiuto sarebbe molto apprezzato!

Grazie

È stato utile?

Soluzione

MongoDB è un servizio completamente separato e quindi deve già essere in esecuzione per Nodejs per accedervi.

Il motivo per cui non si vede alcun output è perché il programma termina prima che il tuo post sia completato o, in questo caso, scadenze perché non può raggiungere MongoDB.

MODIFICARE

Se sei ancora curioso del perché non hai visto alcun output quando MongoDB non era in esecuzione, fermati MongoDB, modifica la tua app per includere:

// exit program in one minute with an error
// cancelled if we can successfully talk to MongoDB
var sentinel = setTimeout(function(){
    throw "failed to connect to MongoDB after one minute!";
}, 60*1000); // 60 seconds

post.save(function (err) {

  clearTimeout(sentinel); // cancel the timeout sentinel

  if(err){
      throw err;
      console.log(err); // won't occur since the throw will end the program
  }else{
      console.log('saved!');
  }
});

process.stdin.resume();  // read from stdin to keep program running

e eseguilo di nuovo.

È fondamentale rendersi conto che Nodejs non è come la maggior parte degli ambienti di programmazione in quanto gestisce il tuo programma all'interno di un ciclo di eventi che funziona solo finché ha qualcosa da fare. Se non c'è nulla da fare, Nodejs uscirà.

E poiché il tuo post.save () inizia una nuova chiamata asincrona a MongoDB e ritorna immediatamente, l'app uscirà immediatamente poiché non c'è nient'altro da fare. (Sotto le copertine, post.save () aggiunge semplicemente un nuovo gestore di eventi al ciclo di eventi che osserva la chiamata da completare.)

Per garantire che il tuo programma non uscirà immediatamente, aggiungiamo process.stdin.resume() Il che indica al ciclo di eventi di verificare la presenza di nuovi input (dall'input standard) su ciascun pass, facendo funzionare efficacemente il tuo programma per sempre.

I server di rete basati su Nodejs si basano sullo stesso meccanismo per eseguire continuamente, osservando l'input da una presa di rete anziché input standard.

Non posso sottolineare abbastanza quanto sia cruciale il concetto di loop di eventi per la programmazione in Nodejs. Stimerei che il 75% o più dei problemi che le persone riferiscono di far sì che Nodejs faccia ciò di cui hanno bisogno possa essere attribuito a non capire il ciclo degli eventi e come influisce sul modello di programmazione Nodejs!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top