2016-09-15 7 views
0

Ich bin ziemlich neu in der MEAN-Stack, also vielleicht mache ich etwas unglaublich dumm.Mongoose Nested Schema Validierungsfehler

Ich habe mehrere definierte Schemas (BlogEntry, ForumPost), die beide das gleiche geschachtelte Schema (in diesem Fall Kommentar) benötigen, also habe ich das Kommentar-Schema in eine eigene Datei verschoben, um jegliche Code-Duplizierung zu vermeiden. den folgend in meinem blog.js Modell

Blick gerade am Beispiel Blogeintrag geschrieben, ich habe:

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

var BlogEntry = new Schema({ 
    title: String, 
    thumbnailUrl: String, 
    content: String, 
    comments: [ 
     { 
      type: Schema.Types.ObjectId, 
      ref: 'Comment' 
     } 
    ] 
}, { 
    timestamps: true 
}); 


var Blog = new Schema({ 
    createdBy: { 
     type: Schema.Types.ObjectId, 
     ref: 'User' 
    }, 
    name: { 
     type: String, 
     required: true 
    }, 
    headerImageUrl: String, 
    description: String, 
    blogEntries: [BlogEntry] 
}, { 
    timestamps: true 
}); 

module.exports = mongoose.model('Blog', Blog); 

und das Kommentar-Schema ist in comment.js enthalten:

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

var Comment = new Schema({ 
    commentText: { 
     type: String, 
     required: true 
    }, 
    postedBy: { 
     type: Schema.Types.ObjectId, 
     ref: 'User' 
    }, 
    parentComment: { 
     type: Schema.Types.ObjectId, 
     ref: 'Comment' 
    } 
}, { 
    timestamps: true 
}); 

module.exports = mongoose.model('Comment', Comment); 

Mein Router Blog-Informationen enthält die folgende für die Handhabung:

var express = require('express'); 
var bodyParser = require('body-parser'); 
var mongoose = require('mongoose'); 
var Blog = require('../models/blog'); 
var Verify = require('./verify'); 
var blogRouter = express.Router(); 
blogRouter.use(bodyParser.json()); 

blogRouter.route('/') 
.get(function(req, res, next) { 
    Blog.find(req.query) 
     .populate('createdBy') 
     .exec(function(err, blog) { 
      if(err) return next(err); 
      res.json(blog); 
     }); 
}) 

.post(Verify.verifyOrdinaryUser, function(req, res, next) { 
    req.body.createdBy = req.decoded._id; 
    Blog.create(req.body, function(err, blog) { 
     if(err) return next(err); 
     console.log("Blog created"); 
     var id = blog._id; 
     res.writeHead(200, { 'Content-Type': 'text/plain'}); 
     res.end('Added the blog with id: ' + id); 
    }); 
}); 

module.exports = blogRouter; 

Wenn die Kommentare Schema in einer separat ist e-Datei, und ich die folgende Anfrage Post, erhalte ich einen Validierungsfehler:

{ 
    "name": "A Cheesemaker's Adventure", 
    "headerImageUrl": "images/cheeseAdven.png", 
    "description": "The story of a man's transformation from a miserable, downtrodden software engineer to a bouyant, joy-filled cheesemaker.", 
    "blogEntries" : [ 
     { 
      "title": "I like cheese", 
      "content": "Here is my story...blah blah blah...", 
      "comments": [ 
       { 
       "commentText": "Who's is this guy kidding!" 
       } 
      ] 
     } 
    ] 
} 


<!DOCTYPE html><html><head><title></title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>Blog validation failed</h1><h2></h2><pre>ValidationError: Blog validation failed 
    at MongooseError.ValidationError (C:\Development\hcj-express\node_modules\mongoose\lib\error\validation.js:22:11) 
    at model.Document.invalidate (C:\Development\hcj-express\node_modules\mongoose\lib\document.js:1410:32) 
    at EmbeddedDocument.invalidate (C:\Development\hcj-express\node_modules\mongoose\lib\types\embedded.js:190:19) 
    at EmbeddedDocument.Document.set (C:\Development\hcj-express\node_modules\mongoose\lib\document.js:703:10) 
    at EmbeddedDocument.Document.set (C:\Development\hcj-express\node_modules\mongoose\lib\document.js:548:18) 
    at EmbeddedDocument.Document (C:\Development\hcj-express\node_modules\mongoose\lib\document.js:67:10) 
    at new EmbeddedDocument (C:\Development\hcj-express\node_modules\mongoose\lib\types\embedded.js:30:12) 
    at EmbeddedDocument (C:\Development\hcj-express\node_modules\mongoose\lib\schema\documentarray.js:27:17) 
    at DocumentArray.cast (C:\Development\hcj-express\node_modules\mongoose\lib\schema\documentarray.js:254:22) 
    at DocumentArray.SchemaType.applySetters (C:\Development\hcj-express\node_modules\mongoose\lib\schematype.js:628:12) 
    at model.Document.set (C:\Development\hcj-express\node_modules\mongoose\lib\document.js:695:18) 
    at model.Document.set (C:\Development\hcj-express\node_modules\mongoose\lib\document.js:548:18) 
    at model.Document (C:\Development\hcj-express\node_modules\mongoose\lib\document.js:67:10) 
    at model.Model (C:\Development\hcj-express\node_modules\mongoose\lib\model.js:41:12) 
    at new model (C:\Development\hcj-express\node_modules\mongoose\lib\model.js:3175:11) 
    at C:\Development\hcj-express\node_modules\mongoose\lib\model.js:1847:51</pre></body></html> 

Wenn ich jedoch die comment.js Datei loszuwerden, und das Kommentar-Schema in die blog.js Datei verschieben, wie so , Ich kann genau die gleiche Nachricht wie oben aufgeführt posten, der Validierungsfehler verschwindet und ich poste erfolgreich die Daten.

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

var Comment = new Schema({ 
    commentText: { 
     type: String, 
     required: true 
    }, 
    postedBy: { 
     type: Schema.Types.ObjectId, 
     ref: 'User' 
    }, 
    parentComment: { 
     type: Schema.Types.ObjectId, 
     ref: 'Comment' 
    } 
}, { 
    timestamps: true 
}); 

var BlogEntry = new Schema({ 
    title: String, 
    thumbnailUrl: String, 
    content: String, 
    comments: [Comment] 
}, { 
    timestamps: true 
}); 

var Blog = new Schema({ 
    createdBy: { 
     type: Schema.Types.ObjectId, 
     ref: 'User' 
    }, 
    name: { 
     type: String, 
     required: true 
    }, 
    headerImageUrl: String, 
    description: String, 
    blogEntries: [BlogEntry] 
}, { 
    timestamps: true 
}); 

module.exports = mongoose.model('Blog', Blog); 

Sooo ... Was mache ich hier falsch?

Antwort

0

Wenn Sie mit einer separaten Datei arbeiten, müssen Sie sicherstellen, dass das Schema "Kommentare" vor dem BlogEntry-Schema geladen wird.

Sie können es nur hinzufügen require('./comment.js') oben in BlogEntry.js. Beispiel:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var Comment = require('./comment.js'); 

var BlogEntry = new Schema({ 
    title: String, 
    thumbnailUrl: String, 
    content: String, 
    comments: [Comment] 
}, { 
    timestamps: true 
}); 
+0

Die von Ihnen erwähnte Änderung wurde auf dem Server implementiert und wird immer noch mit dem gleichen Fehler angezeigt. Interessanterweise funktioniert der verschachtelte Verweis auf User problemlos, obwohl er sich in einer anderen Datei befindet und in dieser Schemadatei nicht explizit erforderlich ist. –

+0

Wenn Sie Benutzer in einem anderen Punkt in Ihrem Code (möglicherweise in verifyOrdinaryUser-Funktion) verwendet werden. Dann hat das vorherige "require" es dem Mungo-Cache hinzugefügt. Behalten Sie '' 'require ('./ comment.js')' '' und versuchen Sie '' 'Kommentare zu ändern: [Comment]' '' zu '' Kommentare: [{ Typ: Schema.Types. ObjectId, Ref: 'Kommentar' }] '' ' –

+0

Ich würde dem @Rafael zustimmen, dies ist die erste Verwendung von comment.js, so sollte es in einer Anweisung erforderlich sein. Ich habe versucht, beide 'Kommentare: [Kommentar]' und 'Kommentare: [{type: Schema.Types.ObjectId, ref: 'Kommentar'}]', aber erhalten Sie den gleichen Fehler in beiden Fällen. –