猫鼬鉴别器不会保存额外的字段

时间:2020-02-13 18:22:54

标签: node.js mongodb express mongoose

我具有以下资源架构:

const mongoose = require('mongoose');
const { Url } = require('./url');
const { Img } = require('./img');

/**
 * Base learning resource model. Contains common fileds for all submodels
 */
// exported for using in other models
const discriminatorOptons = {discriminatorKey: 'kind'}

const options = {timestamps: true};
const resourceSchema = mongoose.Schema({
    title: {
        type: String,
        required: true,
        trim: true
    },
    finishBefore: {
        type: Date,
        require: false
    },
    reviewRating: {
        type: Number,
        require: false,
        min: [1, 'Rating cannot be less than 1.'],
        max: [10, 'Rating cannot be more than 10.'],
        validate: {
            validator: Number.isInteger,
            message: '{VALUE} is not an integer'
        }
    },
    review: {
        type: String,
        required: false,
    },
    additionalNotes: {
        type: String,
        required: false
    },
    authors: {
        type: String,
        required: false
    },
    isDone: {
        type: Boolean,
        default: false
    },
    urls: [Url],
    images: [Img]
}, {...discriminatorOptons, ...options});

const Resource = mongoose.model('Resource', resourceSchema);
exports.Resource = Resource;
exports.discriminatorOptons = discriminatorOptons;

这是可读性,媒体等类型的基本模式->每个类型都有自己的额外字段。例如,可读性模式(具有额外的页面和当前页面字段):

const mongoose = require('mongoose');
const {Resource, discriminatorOptons} = require('./resource');

/**
 * Readable resource such as books, articles.
 */
const readebleSchema = mongoose.Schema({
    pages: {
        type: Number,
        require: false
    },
    currentPage: {
        type: Number,
        require: false
    }
});

const Readable = Resource.discriminator('Readable', readebleSchema, discriminatorOptons);

exports.Readable = Readable;

用户模型具有资源基础类型的嵌入式数组:

const { Resource } = require('./resource');

/**
 * User model
 */
const userSchema = mongoose.Schema({
    name: {
        type: String,
        required: true,
        trim: true
    },
    email: {
        type: String,
        required: true,
        unique: true,
        lowercase: true,
        validate: value => {
            if (!validator.isEmail(value)) {
                throw new Error({ error: 'Invalid Email address' });
            }
        }
    },
    password: {
        type: String,
        required: true,
        minLength: 7,
        select: false
    },
    tokens: {
        type: [{
            token: {
                type: String,
                required: true
            },
        }],
        select: false
    },
    resources: {
        type: [Resource.schema],
        select: false
    }
});

用于创建资源的控制器:

const { User } = require('../models');
const { resourceFactoryMethod } = require('../utils');

/**
 * Create learning resource
 */
const create = async ({user, body}, res) => {
    try {
        const Model = resourceFactoryMethod(body.kind);
        const resource = Model(body);
        await User.addResourceToUser(user.id, resource);
        res.status(201).send(resource);
    } catch(error) {
        res.status(400).send({error});
    }
}

和工厂方法:

const {Base, Readable} = require('../models');

const resourceFactoryMethod = (kind) => {
    switch(kind) {
        case 'Base': return Base;
        case 'Readable': return Readable;
        default: throw Error('Kind of learning resource does not supported');
    }
};

没有错误。但是所有资源只有基本类型,没有额外的字段 enter image description here

0 个答案:

没有答案
相关问题