Мангуста расширенная схема / динамическое поле «настройки» на основе других полей - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь создать динамическую схему мангуста.Родительская схема - это «интерфейс».Это имеет два поля: «тип» и «настройки».

На основе поданного «типа» мне нужно создать / назначить / проверить поле «настройки».

const ENUM_SETTINGS = {
    "RS232": new mongoose.Schema({
        baudRate: {
            type: Number,
            required: true
        },
        dataBits: {
            type: Number,
            default: 8
        },
        stopBits: {
            type: Number,
            default: 1
        },
        parity: {
            type: String,
            enum: ['none', 'even', 'mark', 'odd', 'space'],
            default: "none"
        },
        rtscts: {
            type: Boolean,
            default: false
        },
        xon: {
            type: Boolean,
            default: false
        },
        xoff: {
            type: Boolean,
            default: false
        },
        xany: {
            type: Boolean,
            default: false
        }
    }),
    "ETHERNET": new mongoose.Schema({
        host: {
            type: String,
            required: true
        },
        port: {
            type: Number,
            required: true
        },
        path: {
            type: String,
            default: "/"
        },
        protocol: {
            type: String,
            required: true,
            enum: ["ws", "http", "tcp", "udp"]
        }
    })
};

const interfaceSchema = new mongoose.Schema({
    type: {
        type: String,
        required: true,
        enum: Object.keys(ENUM_SETTINGS)
    },
    description: {
        type: String
    },
    adapter: {
        type: ObjectId,
        ref: "Adapters",
        //required: true
    },
    settings: {
        type: mongoose.Schema.Types.Mixed,
        required: true,
        // ... ENUM_SETTINGS based on type value
    }
}, {
    strict: false
});

Если «тип», введенный в «interfaceSchema», равен «ETHERNET», то ENUM_SETTINGS["ETHERNET"] следует использовать в качестве поля «настройки».

То же самое относится и к «RS232», тогда следует использовать ENUM_SETTINGS["RS232"]

Причина, по которой я хочу использовать схему, заключается в том, что она имеет встроенные валидаторы, и мне не нужно проверять ее в пользовательских валидаторах или моемБизнес-логика.

Что я читаю в документации mongoose, когда создается моя схема, уже слишком поздно делать что-то подобное ...

Есть ли обходной путь или элегантный способ проверки моегоENUM_SETTINGS[<type>] схема с данными в «interface.settings?»

...