Mongoose sub Docs CastError

时间:2016-05-03 01:05:34

标签: node.js mongoose

我是MongoDB和MongooseJS的新手。我也是nodeJs的新手。

我有一个使用Typescript的Angularjs项目。这个项目使用一个“容器”json,它本身包含一些属性和一个testList,它是一个包含一些属性的json对象和一个包含itemList的fileList。

所以就是这样:

export class Container{
   data:string="";
   testList:Test[];
}

export class Test {
   moredata:string="";
   fileList:File[];
}

export class File {...}

我将此JSON发送到我的nodejs服务器。我正在使用bodyparser从req.body对象中获取json。

服务器端,我的mongoose Schema与我的angularjs类完全一样,所以它们看起来像这样:

/*************** mongoose schemas **************/
// item.js
var mongoose = require('mongoose');
module.exports = mongoose.model('Item', {
    Content : {type : Object, default: ''}
});

 // file.js
var mongoose = require('mongoose');
var Item = require('./item');
var schema = new mongoose.Schema({
    Data : {type : String, default: ''},
    ItemList: {type: [Item], default:[]}
});

// test.js
var mongoose = require('mongoose');
var File = require('./file');

var schema = new mongoose.Schema({
    Data: {type:String},
    FileList: {type:[File], default:[]}
});

// container.js
var mongoose = require('mongoose');
var Test = require('./test');
var schema = new mongoose.Schema({
    Name : {type : String, default: '', index:true, unique:true, required: true, dropDups:true},
    Test : {type:[Test], default:[]}
});

如果我尝试创建一个新的Container对象(Mongoose对象)并从req.body中为它指定json,则会出现错误:CastError。 如果我从JSON重新创建每个子文档并保存主文档,它也会出错:CastError。

我不知道如何实现这一目标。它之前有用但我的mongoose架构使用[mongoose.Schema.Types.Mixed]类型用于子文档,而不是“真实”类型。事实是,混合我没有子文档_id,我想要。

使用真正的子文档类型,我可以在日志中看到创建了_id,但所有列表都是空的。

这是我的nodejs代码:

/*************** nodejs **************/
app.post('/api/container', bodyParser.urlencoded({extended:true}), bodyParser({limit:'50mb'}), bodyParser.json(), function(req, res) {

    var test = req.body._test;

    var testList = [];
    var fileList;
    var itemList;
    var itemObj;
    var fileObj;
    var testObj;

    for(var i in test){
        fileList = [];

        for(var j in test[i]._fileList){               
            itemList = [];

            for(var k in test[i]._fileList[j]._itemList){                  
                itemObj = new Item({
                    Content : test[i]._fileList[j]._itemList[k]._content
                });
                itemList.push(itemObj);
                console.log('item pushed : ' + itemObj + ' and length : ' + itemList.length);
                // logs gives info OK.
            }

            fileObj = new File({
                Data: locales[i]._fileList[j]._data,
                ItemList: itemList
            });
            fileList.push(fileObj);
            console.log('file pushed : ' + fileObj);
            // logs gives info NOK. The ItemList is empty : [], instead of a 70+ item list.
        }
        testObj = new Test({
            Data: locales[i]._data,
            FileList: fileList
        });
        testList.push(testObj);
        console.log('test pushed : ' + i);
        // once again, logs are NOK : the FileList is empty : []
    }

    // use mongoose to save the project in the database
    new Container({
        Name : req.body._name.toLowerCase().trim(),
        Test: testList
    }).save(function(err, container, count){
        if(err){
            console.log('erreur : ');
            console.log(err);

            // we enter here as we have this error :
            /*
            { [CastError: Cast to undefined failed for value "
                {
                  _id: 5727ebf95a76ff0011374928,
                  FileList: [],
                  Data: 'data'
                },
                {
                    _id: 5727ebf95a76ff0011374970,
                    FileList: [],
                    Data: 'other data'
                }" at path "Test"]
              message: 'Cast to undefined failed for value "
                { _id: 5727ebf95a76ff0011374928,\n  FileList: [],\n Data: \'data\' },
                { _id: 5727ebf95a76ff0011374970,\n  FileList: [],\n Data: \'other data\'}"
            at path "Test"',
              name: 'CastError',
              type: undefined,
              value: [{"_id":"5727ebf95a76ff0011374928","FileList":[],"Data":"data"},{"_id":"5727ebf95a76ff0
            011374970","FileList":[],"Data":"other data"}],
              path: 'Test' }
            */

            res.status(403).json({error: 'error'});
        } else {
            console.log('saved ! ');
            res.json(container);
        }
    });
});

我不习惯在这里发帖,我更喜欢读者:)无论如何,如果我的帖子没有被取用,请通知我,我会正确地移动/编辑它。

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

检查并正常工作!

所以我的错误是在mongoose模式中使用我的对象模型而不是他们的模式。 我现在在每个对象上导出模型和模式,并使用模式定义模式和请求模型。最后摆脱这个bug! :)

/* Mongoose object definitions */
// grab the mongoose module
var mongoose = require('mongoose');
var child = require('./child').schema; // getting the child schema

// define our parent model
var parentSchema = new mongoose.Schema({
    Name : {type : String, default: ''},
    ChildrenList: {type: [Child], default:[]}
});


var parentModel = mongoose.model('Parent', parentSchema);

// module.exports allows us to pass this to other files when it is called
module.exports = {
    model: parentModel, // exporting model for requests
    schema: parentSchema // exporting schema for others schema using "Parent"
};

用于请求的代码:

var Child   = require('./models/child').model;  // here using model
var Parent  = require('./models/parent').model; // here using model

new Parent({
    Name : req.body._name.toLowerCase().trim(),
    ChildrenList : childrenList // variable defined somewhere
}).save(function(err, parent, count){
    if(err){
        res.status(403).json({error: 'too bad'});
    } else {
        res.json(parent);
    }
});