使用node、mongoose和typescript的条件唯一验证器



我有这个代码,我想在角色为"COMPANY"时将名称道具转换为唯一的模型道具,但我找不到访问角色值以检查条件的方法。

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. 您无法访问模态定义中字段的值,因此代码this.role === 'COMPANY' ? true : false在无论如何
  2. 当你在mongoose中定义一个唯一的字段时,它将创建一个索引在该领域,而不是基于条件

您可以做的解决方案:

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

我建议您在不使用插件的情况下,在猫鼬中创建部分唯一索引

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

如果需要,处理MongoDB的E11000错误

最新更新