2013-07-02 5 views
1

Enchaînement de mon cerveau pour créer un document incorporé avec Mongoose. Je reçois l'erreur suivante lorsque je soumets la forme:Création de documents incorporés avec Mongoose et Express

500 CastError: Moulage à undefined_method a échoué pour la valeur "commentaire va ici"

Code:

index.js

var db = require('mongoose'); 
var Todo = db.model('Todo'); 

exports.create = function(req, res, next){ 
    new Todo({ 
     title  : req.body.title, 
     content : req.body.content, 
     comments : req.body.comments, 
    }).save(function(err, todo, count){ 
    if(err) return next(err); 
    res.redirect('/'); 
    }); 
}; 

db.js

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

// recursive embedded-document schema 
var commentSchema = new Schema(); 

commentSchema.add({ 
    content : String 
    , comments : [Comment] 
}); 

var Comment = mongoose.model('Comment', commentSchema); 

var todoSchema = new Schema({ 
    title  : { type: String, required: true } 
    , content : String 
    , comments : [Comment] 
}); 

var Todo = mongoose.model('Todo', todoSchema); 

Jade forme

form(action="/create", method="post", accept-charset="utf-8") 
    input.inputs(type="text", name="title") 
    input.inputs(type="text", name="content") 
    input.inputs(type="text", name="comments") 
input(type="submit", value="save") 

Répondre

4

Pour que les documents imbriqués/incorporés fonctionnent, vous devez utiliser la méthode .push().

var Comment = new Schema({ 
    content : String 
    , comments : [Comment] 
}); 

var Todo = new Schema({ 
    user_id : String 
    , title  : { type: String, required: true } 
    , content : String 
    , comments : [Comment] 
    , updated_at : Date 
}); 

mongoose.model('Todo', Todo); 
mongoose.model('Comment', Comment); 
exports.create = function(req, res, next){ 
    var todo = new Todo(); 
     todo.user_id = req.cookies.user_id; 
     todo.title  = req.body.title; 
     todo.content = req.body.content; 
     todo.updated_at = Date.now(); 
     todo.comments.push({ content : req.body.comments }); 

    todo.save(function(err, todo, count){ 
    if(err) return next(err); 

    res.redirect('/'); 
    }); 
}; 
0

modèles mangouste ne sont jamais impliqués dans les schémas. Seuls les types de données de base et les schémas mongoose. Vous ne savez pas s'il existe des schémas avec un schéma de commentaire récursif, mais essayez quelque chose comme ça.

var commentSchema = new Schema(); 

commentSchema.add({ 
    , content : String 
    , comments : [commentSchema] 
}); 

var todoSchema = new Schema({ 
    , title  : { type: String, required: true } 
    , content : String 
    , comments : [commentSchema] 
}); 

var Todo = mongoose.model('Todo', todoSchema); 
var Comment = mongoose.model('Comment', commentSchema); 
+0

Je viens d'essayer votre code et enlevé la première des années par des virgules sur le schéma. Voici l'erreur que j'ai reçu: express 500 TypeError: ne peut pas utiliser opérateur « in » pour rechercher « _id » dans le commentaire va ici – omer3210

+0

Je pense que le problème réside dans le code Express sur index.js – omer3210

+0

Ah oui, vous pouvez Il ne suffit pas de coller un tableau d'objets javascript dans les commentaires, vous devez les convertir en instances de modèle de commentaire mongoose d'abord, puis enregistrez le Todo avec les commentaires incorporés. –

Questions connexes