代码之家  ›  专栏  ›  技术社区  ›  akpp

Mongoose模式中Enum字段的问题

  •  -1
  • akpp  · 技术社区  · 1 年前

    Mongoose枚举字段不强制值

    const userSchema = new mongoose.Schema({
        name: {
        type: String,
        required: [true, 'Please tell us your name!']
    },
    email: {
        type: String,
        required: [true, 'Please provide your email'],
        unique: true,
        lowercase: true,
       validate: [validator.isEmail, 'Please provide a valid email']
    },
    photo: String,
    role: {
        type: String,
        enum: ['user', 'guide', 'lead-guide', 'admin'],
        default: 'user'
    },
    password: {
        type: String,
        required: [true, 'Please provide a password'],
        minlength: 8,
       select: false
    },
    passwordConfirm: {
        type: String,
        required: [true, 'Please confirm your password'],
        validate: {
          // This only works on CREATE and SAVE!!!
         validator: function(el) {
           return el === this.password;
         },
        message: 'Passwords are not the same!'
        }
      },
    passwordChangedAt: Date,
    passwordResetToken: String,
    passwordResetExpires: Date,
    active: {
        type: Boolean,
        default: true,
       select: false
    }
    });    
    

    这是我的用户Shema。当我尝试在不提供角色的情况下保存新用户时,它将作为默认值“用户”。但当我用“admin”角色保存用户时,它不起作用,并且总是以“用户”的身份返回一个角色。 api call

    exports.signup = catchAsync(async(req, res, next) => {
    const newUser = await User.create({
        name: req.body.name,
        email: req.body.email,
        password: req.body.password,
        passwordConfirm: req.body.passwordConfirm
    });
    
    const token = signToken(newUser._id);
    
    res.status(201).json({
        status: 'success',
        token,
        data: {
            user: newUser
        }
    })});
    

    这是我的注册功能

    1 回复  |  直到 1 年前
        1
  •  0
  •   jQueeny    1 年前

    你没有申报 role 在您的 Model.create() 函数,因此它将始终默认为的无效值 user .

    你可以尝试只使用可选的链接,所以如果 角色 是post请求的一部分,它将使用它,否则它将使用默认值,如下所示:

    const newUser = await User.create({
        role: req.body?.role || 'user'
        name: req.body.name,
        email: req.body.email,
        password: req.body.password,
        passwordConfirm: req.body.passwordConfirm
    });
    

    或者,您也可以使用 req.body.admin 将要执行的任务 undefined 如果不是发布请求的一部分。因此,mongoose将使用您的默认值,如下所示:

    const newUser = await User.create({
        role: req.body.role //< will be undefined if not there
        name: req.body.name,
        email: req.body.email,
        password: req.body.password,
        passwordConfirm: req.body.passwordConfirm
    });
    

    您仍然会得到验证,因为如果 req.body.admin 值不是的一部分 enum 数组mongoose将抛出一个验证错误。

    推荐文章