Frage

Ich kann nicht für das Leben von mir, wie ich Mongoose in meiner Express -App zum Arbeiten bringen kann. Ich habe Mongoose und auch MongoDB über NPM installiert (in der Mongoose -Dokumentation wurde nicht angegeben, ob MongoDB separat erforderlich war oder wie sie in Betrieb genommen werden soll).

Hier ist der Code, den ich verwende.

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

Hat jemand eine Idee, was ich falsch mache? Ich verstehe nicht, ob ich mit MongoDB separat oder nicht starten muss (es sieht aus wie die Mongoose.Connect -Funktion startet den MongoDB -Server, oder?)

Aber ya, nichts passiert jemals, wenn ich meine App starte (und es sollte entweder den Fehler oder die gespeicherte Ausgabe in meine Konsole ausgeben, wenn ich den Testbeitrag speichere, richtig?

Jedenfalls wäre jede Hilfe sehr geschätzt!

Vielen Dank

War es hilfreich?

Lösung

MongoDB ist ein völlig separater Dienst und muss daher bereits für NodeJs ausgeführt werden, um darauf zuzugreifen.

Der Grund, warum Sie keine Ausgabe sehen, liegt darin, dass Ihr Programm endet, bevor Ihr Beitrag abgeschlossen ist, oder in diesem Fall zeitweise, weil es MongoDB nicht erreichen kann.

BEARBEITEN

Wenn Sie immer noch neugierig sind, warum Sie keine Ausgabe gesehen haben, als MongoDB nicht ausgeführt wurde, stoppen Sie MongoDB und ändern Sie Ihre App so, dass sie enthalten sind:

// 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

und lauf es noch einmal.

Es ist wichtig zu erkennen, dass NodeJS nicht wie die meisten Programmierumgebungen ist, da es Ihr Programm in einer Ereignisschleife ausführt, die nur so lange ausgeführt wird, wie es etwas zu tun hat. Wenn nichts zu tun gibt, wird NodeJs beenden.

Und da Ihr Beitrag.save () einen neuen asynchronen Anruf nach MongoDB und startet kehrt sofort zurück, Die App wird sofort beendet, da es nichts anderes gibt. (Unter den Covers fügt Post.save () einfach einen neuen Ereignishandler der Event -Schleife hinzu, die nach dem Anruf beobachtet wird.)

Um sicherzustellen, dass Ihr Programm nicht sofort beendet wird, fügen wir hinzu process.stdin.resume() Dies weist die Ereignisschleife an, nach neuen Eingaben (aus Standardeingaben) für jeden Pass zu überprüfen, wodurch Ihr Programm effektiv für immer ausgeführt wird.

NodeJS-basierte Netzwerkserver sind auf denselben Mechanismus angewiesen, um kontinuierlich auszuführen und nach Eingaben aus einer Netzwerkbuchse anstelle von Standardeingaben zu suchen.

Ich kann nicht genug betonen, wie wichtig das Event-Loop-Konzept für die Programmierung in NodeJs ist. Ich würde schätzen, dass 75% oder mehr der Probleme, die Menschen angeben, dass NodeJs das tun, was sie benötigen, nicht zugeordnet werden kann, dass sie die Ereignisschleife nicht verstehen und wie sich das NodeJS -Programmiermodell auswirkt!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top