本文介绍了MongooseError:强制转换为嵌入值失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建猫鼬模式,但我正在获得MongooseError.

I'm creating a mongoose Schema but I'm getting a MongooseError.

这是我的计划:

let RestaurantSchema = new Schema({
    ratings: {
        type: [{
            id: Number,
            value: Number,
            _id: false
        }],
        default: [
            { id: 1, value: 0 },
            { id: 2, value: 0 },
            { id: 3, value: 0 },
            { id: 4, value: 0 },
            { id: 5, value: 0 }
        ]
    },
    menu: [{
        ratings: {
            type: [{
                id: Number,
                value: Number,
                _id: false
            }],
            default: [
                { id: 1, value: 0 },
                { id: 2, value: 0 },
                { id: 3, value: 0 },
                { id: 4, value: 0 },
                { id: 5, value: 0 }
            ]
        }
    }]
})

这是我得到的错误:

/var/app/node_modules/mongoose/lib/schema/documentarray.js:322
             throw new CastError('embedded', valueInErrorMessage,
             ^
 MongooseError: Cast to embedded failed for value "{ id: 5, value: 0 }" at path "rating"
     at CastError (/var/app/node_modules/mongoose/lib/error/cast.js:26:11)
     at DocumentArray.cast (/var/app/node_modules/mongoose/lib/schema/documentarray.js:322:19)
     at DocumentArray.SchemaType.getDefault (/var/app/node_modules/mongoose/lib/schematype.js:616:23)
     at EmbeddedDocument.Document.$__buildDoc (/var/app/node_modules/mongoose/lib/document.js:265:22)
     at EmbeddedDocument.Document (/var/app/node_modules/mongoose/lib/document.js:61:20)
     at EmbeddedDocument [as constructor] (/var/app/node_modules/mongoose/lib/types/embedded.js:31:12)
     at new EmbeddedDocument (/var/app/node_modules/mongoose/lib/schema/documentarray.js:70:17)
     at DocumentArray.SchemaArray [as constructor] (/var/app/node_modules/mongoose/lib/schema/array.js:67:21)
     at new DocumentArray (/var/app/node_modules/mongoose/lib/schema/documentarray.js:31:13)
     at Function.Schema.interpretAsType (/var/app/node_modules/mongoose/lib/schema.js:643:16)
     at Schema.path (/var/app/node_modules/mongoose/lib/schema.js:563:29)
     at Schema.add (/var/app/node_modules/mongoose/lib/schema.js:445:12)
     at new Schema (/var/app/node_modules/mongoose/lib/schema.js:99:10)
     at Object.<anonymous> (/var/app/models/restaurant.js:12:24)
     at Module._compile (module.js:571:32)
     at Object.Module._extensions..js (module.js:580:10)
     at Module.load (module.js:488:32)
     at tryModuleLoad (module.js:447:12)
     at Function.Module._load (module.js:439:3)
     at Module.require (module.js:498:17)
     at require (internal/module.js:20:19)
     at Object.<anonymous> (/var/app/controllers/restaurant.js:6:18)
     at Module._compile (module.js:571:32)
     at Object.Module._extensions..js (module.js:580:10)
     at Module.load (module.js:488:32)
     at tryModuleLoad (module.js:447:12)
     at Function.Module._load (module.js:439:3)
     at Module.require (module.js:498:17) 

我在做什么错了?

推荐答案

在v4.9.4中的mongoose中似乎是一个错误.实际上,还有另一个错误会生成此错误.后者在将type用作对象{id: Number,value: Number,_id: false}而不是数组时出现:

It seems to be a bug in mongoose in v4.9.4. In fact there is another bug generating this one. The latter appear when you use type as an object {id: Number,value: Number,_id: false} rather than an array :

TypeError: this.__parentArray._markModified is not a function
    at EmbeddedDocument.markModified (/home/user/Desktop/node_modules/mongoose/lib/types/embedded.js:87:24)
    at SingleNested.Subdocument.markModified (/home/user/Desktop/node_modules/mongoose/lib/types/subdocument.js:62:18)
    at SingleNested.Document.$__set (/home/user/Desktop/node_modules/mongoose/lib/document.js:874:10)

这是在此处引用的错误.它似乎已经修复了一段时间,但已经浮出水面.我已经在此处打开了一个新问题.

This is a referenced bug referenced here. It seems to have been fixed some times but has resurfaced. I've opened a new issue about this here.

解决方法与此处相同,替换为node_modules/mongoose/lib/types/embedded.js:

The workaround is the same as stated here, replacing in node_modules/mongoose/lib/types/embedded.js :

EmbeddedDocument.prototype.markModified = function(path) {
  this.$__.activePaths.modify(path);
  if (!this.__parentArray) {
    return;
  }

EmbeddedDocument.prototype.markModified = function(path) {
  this.$__.activePaths.modify(path);
  if (!this.__parentArray || !this.__parentArray._markModified) {
    return;
  }

此外,将模型重塑为不同的架构有助于调试问题:

Also, remodeling your Models into distinct Schemas helped to debug the issue :

let RatingsItemSchema = new mongoose.Schema({
    id: Number,
    value: Number,
    _id: false
});

let RatingsItem = db.model('RatingsItem', RatingsItemSchema);

let RatingsSchema = new mongoose.Schema({
    ratings: {
        type: [RatingsItemSchema],
        default: [
            { id: 1, value: 0 },
            { id: 2, value: 0 },
            { id: 3, value: 0 },
            { id: 4, value: 0 },
            { id: 5, value: 0 }
        ]
    },
    _id: false
});

let RestaurantSchema = new mongoose.Schema({
    ratings: {
        type: [RatingsItemSchema],
        default: [
            { id: 1, value: 0 },
            { id: 2, value: 0 },
            { id: 3, value: 0 },
            { id: 4, value: 0 },
            { id: 5, value: 0 }
        ]
    },
    menu: {
        type: [RatingsSchema]
    }
});

let Ratings = db.model('Ratings', RatingsSchema);
let Restaurant = db.model('Restaurant', RestaurantSchema);

let rest = new Restaurant();
rest.menu.push(new Ratings());
console.log(JSON.stringify(rest, null, 2));

这篇关于MongooseError:强制转换为嵌入值失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-12 08:43