Условный уникальный валидатор с использованием node, mon goose и машинописного текста - PullRequest
0 голосов
/ 08 мая 2020

У меня есть этот код, и я хочу преобразовать свойство name в уникальное свойство модели, когда роль - «КОМПАНИЯ», но я не могу найти способ доступа к значению роли, чтобы проверить условие.

import mongoose, { Schema } from 'mongoose';
import uniqueValidator from 'mongoose-unique-validator';
import { IUser } from '../interfaces/user';

const validRoles = {
    values: ['HUMAN', 'COMPANY', 'RRHH'],
    message: '{VALUE} is not a valid role'
}

const UserSchema: Schema = new Schema({

    role: { type: String, required: [true, 'Role is required'], enum: validRoles },

    name: {
        type: String,
        required: [true, 'Name is required'],
        unique: this.role === 'COMPANY' ? true : false,
    },

    email: { type: String, required: [true, 'Email is required'], unique: true, uniqueCaseInsensitive: true },
    password: { type: String, required: [true, 'Password is required'] }

});

UserSchema.plugin( uniqueValidator, {message: '{PATH} must be unique'});

export default mongoose.model<IUser>('User', UserSchema);

Есть идеи?

Спасибо!

1 Ответ

0 голосов
/ 08 мая 2020

Ваш код не работает по нескольким причинам.

  1. Вы не можете получить доступ к значению поля в модальном определении, поэтому код this.role === 'COMPANY' ? true : false не будет работать в в любом случае
  2. Когда вы определяете поле, уникальное в mon goose, оно создает индекс для этого поля, и он не основан на условиях

Возможные обходные пути:

Плагин, который вы используете, просто выдает вам приятную ошибку, а не ошибку E11000 от MongoDB, когда вы пытаетесь нарушить уникальное ограничение

Я предлагаю вам создать частичный уникальный индекс в mon goose без плагина

UserSchema.index({ name: 1 }, {
    unique: true,
    partialFilterExpression: {
      role: { $eq: 'COMPANY' }
    }
  });

И при необходимости обработать ошибку E11000 из MongoDB

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...