【问题标题】:Conditional unique validator using node, mongoose and typescript使用节点、猫鼬和打字稿的条件唯一验证器
【发布时间】:2020-05-08 22:17:56
【问题描述】:

我有这段代码,我想在角色为“公司”时将名称属性转换为唯一模型属性,但我找不到访问角色值以检查条件的方法。

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);

有什么想法吗?

谢谢!

【问题讨论】:

    标签: node.js typescript mongoose


    【解决方案1】:

    您的代码无法正常工作有几个原因。

    1. 在模态定义中不能访问字段的值,所以代码this.role === 'COMPANY' ? true : false,在 任何情况
    2. 当您在 mongoose 中定义一个唯一字段时,它将创建一个索引 在那个领域,它不是基于条件的

    您可以采取的解决方法:

    当您尝试违反唯一约束时,您使用的插件只是给您一个很好的错误,而不是来自 MongoDB 的 E11000 错误

    我建议你在 mongoose 中创建 部分唯一索引 而不使用插件

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

    如果需要,还可以处理来自 MongoDB 的 E11000 错误

    【讨论】:

      猜你喜欢
      • 2020-04-30
      • 2018-10-24
      • 2017-01-20
      • 2016-02-05
      • 2020-05-11
      • 2019-03-15
      • 2016-06-14
      • 2017-06-30
      • 2020-11-08
      相关资源
      最近更新 更多