无法阅读财产'验证'未定义的

时间:2015-09-06 22:27:53

标签: javascript node.js mongoose

我在某种程度上错误地设置了我的模型,但我无法看到它。我看过这个问题:

Node.js - Mongoose path validation failing - TypeError: Cannot call method 'validate' of undefined

我并不认为这是我之后的解决方案。我试图设置一个包含一个嵌套对象和另一个嵌套对象数组的简单文档。我一直收到这个错误:

Cannot read property 'validate' of undefined

以下是我试图运行的代码。

var mapSchema = new Schema({
map_key : {
    i : {
        type : Number,
        required : 'Map Key i required'
    },
    j : {
        type : Number,
        required : 'Map Key j required'
    },
    k : {
        type : Number,
        required : 'Map Key k required'
    }
},
tiles : [ {
    x : {
        type : Number,
        required : 'Tile x required'
    },
    y : {
        type : Number,
        required : 'Tile y required'
    },
    tile_type : {
        type : Number,
        required : 'Tile type required'
    }
} ]
});

mapSchema.path('map_key').validate(function(value, next) {
    mapService.findMap(value, function(err, map) {
        if (err) {
            console.log(err);
            return next(false);
        }
        next(!map);
    });
}, 'Map already created');

感谢任何帮助。谢谢!

更新:无论价值如何,我都尝试将模型简化为最简单的形式而没有成功:

var mapSchema = new Schema({
map_key : {
    i :  Number,

    j : Number,

    k :  Number

},
tiles : [ {
    x :  Number,

    y :  Number,

    tile_type : Number
} ]
});

mapSchema.path('map_key').validate(function(value, next) {
    mapService.findMap(value, function(err, map) {
        if (err) {
            console.log(err);
            return next(false);
        }
        next(!map);
    });
}, 'Map already created');

再次UPDATE ..所以我这样做是为了删除map_key对象并将验证器更改为tiles对象以尝试缩小范围。删除map_key对象时,我没有收到错误:

var mapSchema = new Schema({
tiles : [ {
    x :  Number,

    y :  Number,

    tile_type : Number
} ]
});

mapSchema.path('tiles').validate(function(value, next) {
mapService.findMap(value, function(err, map) {
    if (err) {
        console.log(err);
        return next(false);
    }
    // If the map exists, return false, else it will be null.
    next(!map);
});
}, 'Map already created');

所以我的猜测是错误与map_key及其设置方式有关,但我对它的错误一无所知。

1 个答案:

答案 0 :(得分:0)

好的..所以我开始工作了。不完全确定为什么会这样,文档中的所有内容都以我最初的方式显示它。我必须将整个map_key对象放在它自己的类型中。再次不确定为什么会这样,但至少我已经重新开始运行了。以下是我对可能遇到类似问题的其他人的价值的解决方案。

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var mapService = require('../services/map-service');

var mapSchema = new Schema({
    map_key : {type:{
        i : {
            type : Number,
            required : 'Map Key i required'
        },
        j : {
            type : Number,
            required : 'Map Key j required'
        },
        k : {
            type : Number,
            required : 'Map Key k required'
        }
    }},
    tiles : [{
            x : {
                type : Number,
                required : 'Tile x required'
            },
            y : {
                type : Number,
                required : 'Tile y required'
            },
            tile_type : {
                type : Number,
                required : 'Tile type required'
            }
        }
    ]
});

mapSchema.path('map_key').validate(function(value, next) {
    mapService.findMap(value, function(err, map) {
        if (err) {
            console.log(err);
            return next(false);
        }

        next(!map);
    });
}, 'Map already created');

var Map = mongoose.model('Map', mapSchema);

module.exports = {
    Map : Map
};