2014-07-18 15 views
6

Buduję witrynę blogu z plikami express.js i mongoosejs. Artykuł może mieć jedną lub więcej kategorii. Kiedy tworzę nowy artykuł, pojawia się błąd:Schemat modelu Mongoose z tablicą referencyjną: CastError: Przesyłanie do obiektu ObjectId nie powiodło się dla wartości "[obiekt obiektu]"

{ [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' } 

Czy ktoś może mi pomóc? kod pokrewne przedstawiono poniżej:

The Article modelu zdefiniowane tak:

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); 

a model Category zdefiniowany następująco:

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

Kiedy utworzyć nowy artykuł i zapisać go w ten sposób :

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); 
    }); 
}; 

Po wywołaniu funkcji create Z console.log() Wyjście pokazuje poniżej:

// 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' } 

Mam google dużo, ale bez powodzenia. Proszę pomóż mi!


Aktualizacja: dziękuję za odpowiedź Gergő użytkownika. Ale jeśli zaktualizuję istniejący artykuł z almoset tym samym kodem, działa poprawnie! Czemu? Kody przedstawiono poniżej:

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); 

    }); 
}; 

Wyjście tak:

// 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 (中国标准时间) 
} 

To działa OK.

Odpowiedz

10

schematu artykuł spodziewa tablicę ObjectIds:

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

Jednak req.body zawiera obiekt kategorii:

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

I Mongoose nie można przekonwertować obiekt kategorię do objectID. Właśnie dlatego pojawia się błąd. Upewnij się categories w req.body zawiera tylko identyfikatory:

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

Dziękuję. Ale jeśli zaktualizuję istniejący artykuł z prawie tym samym kodem, działa dobrze. Publikuję kod i loguję się w pytaniu, czy mógłbyś mi pomóc to sprawdzić? – Race

8

Proszę używać mongoose.Schema.Types.Mixed jako typ danych kategoriach. Miałem ten sam problem z zapisywaniem tablicy danych. mi to pasuje.

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);