2013-08-15 24 views
6


Unten ist ein Objektliteral, das ich versuche, in MongoDB zu speichern. Es ist in der Datei app.js definiert, die ein Express-Server ist. Da das Objekt innerhalb des Servers fest codiert ist, ging ich davon aus, dass bei jedem Serverstart eine neue Kopie in der DB gespeichert wird, oder dass das Dokument mindestens einmal gespeichert und bei der Erkennung überschrieben wird Das neue Dokument ist identisch mit dem, das beim letzten Serverlauf gespeichert wurde. Zu meinem Erstaunen werden in der MongoDB nicht nur keine Kopien erstellt, sondern das Dokument wird überhaupt nicht gespeichert. Es wurde jedoch die "Nachrichten" -Sammlung erstellt, die mit "shown collections" von mongo shell verifiziert wurde. Auch bekomme ich keinen Fehler in der Callback-Funktion. Ich habe auch versucht, die Model.create (doc, fn) innerhalb meiner Express '/ Nachrichten' Route, aber das funktioniert auch nicht (das Dokument sollte jedes Mal gespeichert werden, wenn die '/ Nachrichten' Route vom Client aufgerufen wird, aber es ist nicht). Was vermisse ich?
Bitte lesen Sie meine Anmerkungen mit "< -", um zu sehen, welche anderen Probleme oder unerwartetes Verhalten ich treffe. Ich wäre Ihnen sehr dankbar, wenn Sie diese auch in Ihrer Antwort ansprechen könnten.Mongoose speichert keine Daten in die MongoDB

var express = require('express') 
    , routes = require('./routes') 
    , user = require('./routes/user') 
    , http = require('http') 
    , path = require('path') 
    , fs = require('fs'); 

// Defining connection to the database: 
var mongoose = require('mongoose'). 
    connect("mongodb://localhost:27017/my-test-db"), 
    db = mongoose.connection; 
var Schema = mongoose.Schema; 
var ObjectID = Schema.ObjectId; 
// Setting up the debug flag: 
mongoose.set('debug, true'); 
// Logging connection: 
db 
    .on('error', console.error.bind(console, 'DB connection error.')) 
    .once('open', console.log.bind(console, 'DB Connection established.')); 

// Defining MongoDB schemas: 
var usr = new Schema({ 
    first: String, 
    last: String 
}); 
var newsSchema = new Schema({ 
    headline: String, 
    bd: String, 
    imgURI: String, 
    imgThumbURI: String, 
    imgCaption: String, 
    addedOn: Date, 
    addedBy: { 
     type: ObjectID, 
     ref: 'usr' 
    } 
// On user action 'save' populate the addedOn and addedBy fields before the news article is actually saved to the DB: 
newsSchema.pre('save', function(next){ 
    if(!this.addedOn) this.addedOn = new Date(); 
    if(!this.addedBy) this.addedBy = {first: "admin", last: "admin"}; 
}); 
// Indexing important fields: 
usr.index({last: 1}); 
newsSchema.index({headline: 1}); 
//Adding the News model: 
var News = mongoose.model('news', newsSchema); 

var nws1 = new News({ 
    headline: "Test news Headline", 
    bd: "Test news body. Test news body. Test news body. Test news body. Test news body. ", 
    imgURI: encodeURI("images/news/img.jpg"), 
    imgThumbURI: encodeURI("images/news/thumbs/img.jpg"), 
    imgCaption: "Test news image caption.", 
    addedOn: new Date(), 
    addedBy: {first: "Admin", last: "Admin"} 
}); 
nws1.save(function(err, news){ 
     if(err) return console.error("Error while saving data to MongoDB: " + err); // <- this gets executed when there's an error 
     console.error(news); // <- this never gets logged, even if there's no error. 
    }); 

var app = express(); 

// all environments 
app.set('port', process.env.PORT || 3000); 
app.set('views', path.resolve(__dirname + '/public')); 
app.set('view engine', 'html') 
    .engine('html', function(path, options, fn){ 
     if('finction' == typeof options){ 
      fn = options, options = {}; 
     } 
     fs.readFile(path, 'utf8', fn); 
    }); 
app.use(express.favicon()); 
app.use(express.logger('dev')); 
app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(express.session()); 

app.use(express.static(path.join(__dirname, 'public'))); 
http.createServer(app).listen(app.get('port'), function(){ 
console.log('Express server listening on port ' + app.get('port')); 
}); 

Vielen Dank für Ihre Zeit
Mit freundlichen Grüßen
Jared

+1

Rufst du 'mongoose.connect' in der Datenbank zu verbinden irgendwo außerhalb dieses Codes? – JohnnyHK

+0

@JohnnyHK Ja, bin ich. Bitte, sehen Sie sich die aktualisierte Frage an. Ich habe den entsprechenden Code eingefügt. –

Antwort

24

Es sieht aus wie das Problem ist Middleware speichert in Ihrer News Schema.

newsSchema.pre('save', function(next){ 
    if(!this.addedOn) this.addedOn = new Date(); 
    if(!this.addedBy) this.addedBy = {first: "admin", last: "admin"}; 
}); 

Ihre Funktion ein „next“ Rückruf, die ausgeführt werden müssen, Mungo wissen zu lassen, dass Sie fertig sind und bereit, das Dokument zu speichern. Da du es nicht anrufst, könnte es erklären, warum du nichts gespeichert hast und auch keine Fehler.

nur versuchen, nächste wie folgt aufrufen:

newsSchema.pre('save', function(next){ 
    if(!this.addedOn) this.addedOn = new Date(); 
    if(!this.addedBy) this.addedBy = {first: "admin", last: "admin"}; 
    next(); 
}); 
+0

Vielen Dank Supershabam. Das habe ich vermisst. So ein kleines Ding, aber so sehr verletzt (viel Zeit vergeudete den Versuch, es herauszufinden, allein). Viel von meinem Ruf - Liebe für dich, Kumpel. –

+0

Ah für *** && !!! Sake! Ich war für 4 Stunden auf dem gleichen Fehler !!! Vielen Dank!!!! –

+0

Oh mein Gott, ich kann dir nicht genug danken. Ich hatte etwas Code verschoben und mein "next()" Call war nur "next", was natürlich nie den Callback ausgeführt hat. Ich blieb auch noch stundenlang dran. DANKE –

4

ich ein paar Probleme gefunden, wenn diese lokal zu reproduzieren versuchen.

Sie sind nicht next() in newsSchema.pre Aufruf ('speichern')

Sollte

newsSchema.pre('save', function(next){ 
    if(!this.addedOn) this.addedOn = new Date(); 
    if(!this.addedBy) this.addedBy = adminUser; 
    next(); 
}); 

Sie müssen auch sicherstellen, dass Sie an die DB angeschlossen sind, bevor jeder tun von diesem Zeug, nicht sicher, ob du es bist oder nicht, da ich diesen Teil des Codes nicht gesehen habe.

+3

Fantastisch. Genau das habe ich vermisst. +1 für Sie, aber meine "akzeptierte Antwort" geht an SuperShabam, da er mehr Details über das Problem enthielt. Er braucht auch mehr Reputationspunkte :). Irgendwie, vielen Dank. –

0

Mein Code war anders, aber mein Ergebnis war anscheinend das gleiche: Anscheinend habe ich Mongo trotz des .save-Aufrufs nicht gespeichert. JEDOCH fand die Speicherung tatsächlich statt, ich wusste einfach nicht, was einige der Mongoose-Parameter bedeuten, und dass es einige Freiheiten braucht, die den Namen Ihrer Sammlung bilden.

Genauer gesagt, wenn Sie verwenden:

mongoose.model('MyModelName', invitationSchema); 

Ihre Kollektionsnamen zu bilden, wird für den Modellnamen in Kleinbuchstaben umgewandelt und ein „s“ wird (falls nicht vorhanden) angehängt. Siehe auch http://samwize.com/2014/03/07/what-mongoose-never-explain-to-you-on-case-sentivity/

Sie können diese Sammlungsbenennungskonventionen in gewissem Umfang umgehen, indem Sie bei der Erstellung des Schemas einen Auflistungsnamenparameter verwenden.Siehe http://mongoosejs.com/docs/guide.html#collection

Hier meins:

const modelName = "SharingInvitation"; 
const collectionName = modelName + "s"; 

const numberOfHoursBeforeExpiry = 24; 

var expiryDate = new Date(); 
expiryDate.setHours(expiryDate.getHours() + numberOfHoursBeforeExpiry); 

var invitationSchema = new Schema({ 
    // _id: (ObjectId), // Uniquely identifies the invitation (autocreated by Mongo) 

    // gives time/day that the invitation will expire 
    expiry: { type: Date, default: expiryDate }, 

    // The user is being invited to share the following: 
    owningUser: ObjectId, // The _id of a PSUserCredentials object. 
    capabilities: [String] // capability names 
}, { collection: collectionName }); 
Verwandte Themen