2016-07-19 10 views
1

Ich bin ein Anfänger zu node.js und Mungo und Full-Stack-Web-Entwicklung im Allgemeinen. Ich habe mir den Kopf darüber zerbrochen, eine Datenbank einzurichten und mit meinem Server zu kommunizieren, und kann es nicht richtig zum Laufen bringen. Ich habe diesem Tutorial locker gefolgt: Easily Develop Node.js and MongoDB Apps with MongooseMongoose .save-Funktion scheint nicht in node.js Skript aufgerufen werden

Wie auch immer, meine Dateien sind ziemlich einfach im Moment organisiert. Meine server.js befindet sich im selben Verzeichnis wie der Ordner "models", der meine Datei "testSchema.js" enthält.

Ich habe ein Skript, das auf Knopfdruck in meiner server.js Datei aufgerufen werden kann.

var mongoose = require('mongoose'); 
var mongoURL = "mongodb://username:[email protected]:27017/test"; 
mongoose.connect(mongoURL); 

var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function() { 
    console.log("We have connected"); 
    var Item = require("./models/testSchema"); 
    var newItem = Item({ 
     name: 'Peter', 
     score: 5 
    }); 
    newItem.save(function(err) { 
     if (err) throw err; 
     console.log("Item Created"); 
    }); 

}); 
mongoose.connection.close(); 

Dies sollte ein Beispieldokument in mein Modell hinzufügen. Und schließlich testSchema.js:

var Schema = mongoose.Schema; 
var ItemSchema = new mongoose.Schema({ 
    name: { 
     type: String, 
     index: true 
    }, 
    score : Number 
}); 

var Item = mongoose.model('Item', ItemSchema); 

module.exports = Item; 

Also, wenn ich das Skript ausführen, bekomme ich die Meldung, aber nicht die Nachricht „Item erstellt“, noch ein Fehlerprotokoll, das kommen würde, „Wir angeschlossen haben!“ nachdem die .save-Funktion aufgerufen wurde. Es scheint, dass dies nur übersprungen wird, aber ich habe keine Ahnung, wie sich mongoose und node.js in diesem Kontext verhalten. Wird .save sogar angerufen?

Zusätzlich: Meine mongoDB-Datenbank wird auf Openshift gehostet, aber ich habe Port-Weiterleitung an localhost, und es sieht aus wie es funktioniert gut. Ich erhalte die Nachricht "Handling connection for 27017", wenn ich das Skript aufruft.

Jede Hilfe würde sehr geschätzt werden!

** bearbeiten **

ich nicht so kommentieren kann ich nur meinen Beitrag bearbeiten.

Die Antworten von Zachary Jacobi und Robert Klep haben es geschafft! Vielen Dank, ich hatte keine Ahnung, dass der Knoten so asynchron war.

+1

Sie die Verbindung geschlossen wird, bevor das 'open' Ereignis ausgelöst hat. Dies hat letztendlich damit zu tun, wie asynchrone Operationen in Node funktionieren (wobei eine Operation möglicherweise noch nicht abgeschlossen ist, wenn die nächste Codezeile ausgeführt wird). – robertklep

Antwort

2

Der Knoten ist asynchron auf E/A, so dass Dinge nicht unbedingt in der Reihenfolge auftreten, in der sie in Ihrem Code erscheinen.

Hier wird die Datenbankverbindung geöffnet und der Knoten geht weiter zur nächsten Anweisung, ohne auf den Rest des Vorgangs im Callback zu warten. So wird tatsächlich vor newItem.save(function(err) {... ausgeführt.

Um dies zu beheben, versuchen Sie:

var mongoose = require('mongoose'); 
var mongoURL = "mongodb://username:[email protected]:27017/test"; 
mongoose.connect(mongoURL); 

var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function() { 
    console.log("We have connected"); 
    var Item = require("./models/testSchema"); 
    var newItem = Item({ 
     name: 'Peter', 
     score: 5 
    }); 
    newItem.save(function(err) { 
     if (err) throw err; 
     console.log("Item Created"); 
     mongoose.connection.close(); 
    }); 

}); 
Verwandte Themen