2017-12-31 51 views
0

Ich versuche, MongoDB einige Daten mit Mongoose hinzuzufügen, aber ich habe Probleme, diese Daten in meiner Datenbank zu speichern. Ich folge this Tutorial auf YouTube (~ 11 min), aber ich denke, das Video verwendet möglicherweise eine andere Version von Mungo.Mit Mongoose gesetzte Daten werden nicht in MongoDB gespeichert.

Grundsätzlich habe ich ein Produktschema in einer separaten JS-Datei definiert, und ich führe eine Datei mit dem Namen productSeeder.js durch Ausführen von node productSeeder.js im Terminal mit dem Mongo-Daemon läuft. Wenn ich auf die richtige Datenbank umschalte und db.products.find() in die Mongo-Shell eintippe, wird mir nichts zurückgegeben.

Meine productSeeder.js Datei:

var Product = require('../models/product'); 
var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost:27017/shopping'); 

var products = [ 
    new Product({ 
     imagePath: 'images/dummy.png', 
     price: 9, 
     title: 'a title', 
     desc: 'some text' 
    }), 
    new Product({ 
     imagePath: 'images/dummy.png', 
     price: 5, 
     title: 'a title', 
     desc: 'some text' 
    }) 
]; 

var done = 0; 
for (var i = 0; i < products.length; i++) { 
    products[i].save(function(err, result) { 
     if (err) { 
      console.log(err); 
      return; 
     }; 

     done++; 
     if (done == products.length) { 
      mongoose.disconnect(); 
     }; 
    }); 
}; 

Meine product.js Datei:

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

var schema = new Schema({ 
    imagePath: {type: String, required: true}, 
    price: {type: Number, required: true}, 
    title: {type: String, required: true}, 
    desc: {type: String, required: true} 
}); 

module.exports = mongoose.model('Product', schema); 

Vielen Dank und einen schönen Urlaub!

+0

keine Fehler in der Konsole? haben Sie versucht, console.log zu verwenden oder den vom save Callback zurückgegebenen Ergebniswert zu debuggen, was enthält er? – SunriseM

+0

Keine Fehler; Ich habe versucht, das Ergebnis zu drucken, es druckt die richtigen Produkte. – gridproquo

+0

Nur hinzugefügt Product.find ({}, Funktion (Fehler, Produkte) {console.log (products.length)}) zu meinem Code, innerhalb der 'if done'; Aus irgendeinem Grund erhöht sich die Länge jedes Mal, wenn ich die gesamte Datei laufe, was bedeutet, dass die Daten tatsächlich gespeichert werden? Gibt es einen Grund, warum die Daten nicht in der MongoDB-Shell an mich zurückgegeben werden? – gridproquo

Antwort

-1

Ein kurzer Blick

Zuerst sollten Sie Ihren Befehl in einer IFFE speichern wickeln. So etwas wie dieses

for (var i = 0; i < products.length; i++) { 
    (function (result) { 
     products[i].save(function(err, result) { 
      if (err) { 
       console.log(err); 
       return; 
      }; 

      done++; 
      if (done == products.length) { 
       mongoose.disconnect(); 
      }; 
     });  
    })(result);  
}; 
+0

Dies wird "Ergebnis ist nicht definiert" werfen, vielleicht meinen Sie, "ich" zu übergeben, aber er verwendet es nicht innerhalb des Rückrufs, so dass ich seine Verwendung nicht sehe. – SunriseM

+0

yup du bist richtig, ich meinte ich, aber keine Verwendung – pkpk

0

Wissen Sie, ob Mongoose erfolgreich angeschlossen wurde, bevor Sie versuchen, die Produkte zu retten?

Ein Gedanke könnte sein, dass Sie versuchen, Elemente zu speichern, bevor die Verbindung besteht, da der Db-Zugriff asynchron ist.

Sie könnten einen Rückruf an Ihre Verbindung übergeben oder einen Ereignis-Listener verwenden und Ihre Sicherungsfunktionen in den Verbindungsrückruf einbinden.

mongoose.connection.on('connected', function(){ 
    //save products here 
}); 

Ich habe von einigen Fällen von Mungo gelesen, die nicht ohne Fehler speichern können.

Edit: könnte besser sein für .on('open') statt (mongoose docs) zu hören.

+0

Nur ausprobiert, leider nicht funktioniert :( – gridproquo

+0

Wenn Sie in der 'Mongo' Shell und geben Sie' shopping' und 'show collections' verwenden, sehen Sie die "Produkte" Sammlung? Konnten Sie den Mongoose Modellcode, den Sie verwenden? Ich konnte es nicht im Repo finden, der mit dem YouTube vid verbunden wird. – thmsdnnr

+0

Just den ursprünglichen Pfosten mit dem Modellcode. Wenn ich 'show Sammlungen' tue , Ich sehe 'Produkt'. – gridproquo

Verwandte Themen