2014-07-18 9 views
6

Costruisco un sito Web blog con express.js e mongoosejs. Un articolo può avere una o più categorie. Quando creo un nuovo articolo, ottengo l'errore:Modello di Mongoose Schema con matrice di riferimento: CastError: Cast to ObjectId non riuscito per il valore "[oggetto oggetto]"

{ [CastError: Cast to ObjectId failed for value "[object Object]" at path "categories"] 
    message: 'Cast to ObjectId failed for value "[object Object]" at path "categories"', 
    name: 'CastError', 
    type: 'ObjectId', 
    value: [ [object Object] ], 
    path: 'categories' } 

Qualcuno potrebbe darmi una mano? codice relativo mostra sotto:

Il modello Article definita in questo modo:

var mongoose = require('mongoose'), 
Schema = mongoose.Schema; 
var ArticleSchema = new Schema({ 
created: { type: Date, default: Date.now}, 
title: String, 
content: String, 
summary: String, 
categories: [{ 
    type: Schema.ObjectId, 
    ref: 'Category' }] 
}); 
mongoose.model('Article', ArticleSchema); 

E il modello Category definita in questo modo:

var mongoose = require('mongoose'), 
Schema = mongoose.Schema; 
var CategorySchema = new Schema({ 
    parent: { 
    type: Schema.ObjectId, 
    }, 
    name: String, 
    subs: [CategorySchema] 
}); 
mongoose.model('Category', CategorySchema); 

Quando creo un nuovo articolo e salvarlo come questo :

exports.create = function(req, res) { 
    console.log(req.body); 
    var article = new Article(req.body); 
    article.user = req.user; 
    console.log(article); 
    article.save(function(err) { 
    if (err) { 
     console.log(err); 
     return res.jsonp(500, { 
      error: 'Cannot save the article' 
     }); 
    } 
    res.jsonp(article); 
    }); 
}; 

Quando viene chiamato la funzione create, il console.log() output mostra sotto:

// console.log(req.body); 
{ title: 'This is title', 
    content: '<p>content here</p>', 
    categories: 
    [ { _id: '53c934bbf299ab241a6e0524', 
    name: '1111', 
    parent: '53c934b5f299ab241a6e0523', 
    __v: 0, 
    subs: [], 
    sort: 1 } ], 
    updated: [ 1405697477413 ] } 

// console.log(article); 
{ 
    title: 'This is title', 
    content: '<p>content here</p>', 
    _id: 53c93dc5b1c3b8e80cb4936b, 
    categories: [], 
    created: Fri Jul 18 2014 23:31:17 GMT+0800 (中国标准时间) } 

// console.log(err); 
{ [CastError: Cast to ObjectId failed for value "[object Object]" at path "categories"] 
    message: 'Cast to ObjectId failed for value "[object Object]" at path "categories"', 
    name: 'CastError', 
    type: 'ObjectId', 
    value: [ [object Object] ], 
    path: 'categories' } 

Googled un sacco, ma senza fortuna. Mi aiuti per favore!


Aggiornamento: Grazie per la risposta di Gergo. Ma se aggiorno l'articolo esistente con almoset lo stesso codice, funziona OK! Perché? Codici mostra sotto:

var mongoose = require('mongoose'), 
    Category = mongoose.model('Category'), 
    _ = require('lodash'); 

exports.update = function(req, res) { 
console.log(req.body); 
var article = req.article; 
article = _.extend(article, req.body); 
console.log(article); 
article.save(function(err) { 
    if (err) { 
     return res.jsonp(500, { 
      error: 'Cannot update the article' 
     }); 
    } 
    res.jsonp(article); 

    }); 
}; 

L'output come questo:

// console.log(req.body); 
{ _id: '53ca42f418bfb23c1e04df02', 
    summary: 'tttt', 
    title: 'tt', 
    content: '<p>tttt</p>', 
    __v: 2, 
    categories: [ { _id: '53c934bbf299ab241a6e0524', name: '1111' } ], 
    created: '2014-07-19T10:05:40.183Z' 
} 

// console.log(article); 
{ _id: 53ca42f418bfb23c1e04df02, 
    title: 'tt', 
    content: '<p>tttt</p>', 
    __v: 2, 
    categories: [ { _id: 53c934bbf299ab241a6e0524, name: '1111', subs: [], sort: 0 
    } ], 
    created: Sat Jul 19 2014 18:05:40 GMT+0800 (中国标准时间) 
} 

Questo funziona bene.

risposta

10

lo schema articolo si aspetta un array di objectIds:

var ArticleSchema = new Schema({ 
    ... 
    categories: [{ 
    type: Schema.ObjectId, 
    ref: 'Category' }] 
}); 

Tuttavia req.body contiene un oggetto categoria:

categories: 
    [ { _id: '53c934bbf299ab241a6e0524', 
    name: '1111', 
    parent: '53c934b5f299ab241a6e0523', 
    __v: 0, 
    subs: [], 
    sort: 1 } ] 

e Mongoose non può convertire l'oggetto categoria a un ObjectId. Questo è il motivo per cui ottieni l'errore. Assicurarsi categories in req.body contiene solo gli ID:

{ title: 'This is title', 
    content: '<p>content here</p>', 
    categories: [ '53c934bbf299ab241a6e0524' ], 
    updated: [ 1405697477413 ] } 
+0

Grazie. Ma se aggiorno un articolo esistente con quasi lo stesso codice, funziona bene. Inserisco il codice e accedo alla domanda, per favore aiutami a controllarlo? – Race

8

Si prega di utilizzare mongoose.Schema.Types.Mixed come tipo di dati di categorie. Ho avuto lo stesso problema con il salvataggio della matrice di dati. per me funziona.

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema; 
    var ArticleSchema = new Schema({ 
    created: { type: Date, default: Date.now}, 
    title: String, 
    content: String, 
    summary: String, 
    categories: [{type: Schema.Types.Mixed }] 
}); 
mongoose.model('Article', ArticleSchema); 
Problemi correlati