Mongoose 中的数据校验及其它优雅解决方案

Mongoose 是一个 Node.js 的 MongoDB 对象模型工具,它提供了一种直接在 Node.js 中定义数据模型的方式,同时也可以对数据进行校验和转换。在实际开发中,数据校验是非常重要的一环,它可以有效地帮助我们避免数据不一致和错误,提高数据的质量和可靠性。

数据校验

Mongoose 中的数据校验是通过 Schema 来实现的,可以在定义 Schema 时设置校验规则。常见的校验规则有以下几种:

必填项

const UserSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true
  },
  age: Number
});

上述代码中,name 和 email 是必填项,如果没有提供这两个字段的值,将会抛出 ValidationError 异常。

数据类型

const UserSchema = new mongoose.Schema({
  name: String,
  email: String,
  age: {
    type: Number,
    min: 0,
    max: 120
  }
});

上述代码中,age 是一个 Number 类型,并且限制了取值范围在 0 到 120 之间。

枚举

const UserSchema = new mongoose.Schema({
  gender: {
    type: String,
    enum: ['male', 'female']
  }
});

上述代码中,gender 只能取值为 male 或 female。

正则表达式

const UserSchema = new mongoose.Schema({
  email: {
    type: String,
    match: /^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$/
  }
});

上述代码中,email 字段的值必须符合正则表达式 /^\w+@[a-zA-Z_]+?.[a-zA-Z]{2,3}$/。

自定义校验器

const UserSchema = new mongoose.Schema({
  password: {
    type: String,
    validate: {
      validator: function(v) {
        return v && v.length >= 6;
      },
      message: '密码长度至少为 6 位'
    }
  }
});

上述代码中,password 字段的值必须长度至少为 6 位。

错误处理

当数据校验失败时,Mongoose 会抛出 ValidationError 异常,我们可以通过 try-catch 块来捕获异常,并处理错误信息。

try {
  const user = new User({
    name: 'Alice',
    email: 'alice@example.com',
    age: -10
  });
  await user.save();
} catch (err) {
  console.log(err.message);
  // 输出:'User validation failed: age: Path `age` (-10) is less than minimum allowed value (0).'
}

上述代码中,当 age 的值小于 0 时,Mongoose 会抛出异常并输出错误信息。

其它优雅解决方案

除了使用 Mongoose 的数据校验功能,我们还可以使用一些其它的优雅解决方案来保证数据的正确性和可靠性。

Joi

Joi 是一个 Node.js 的数据校验库,它可以用来校验和转换 JavaScript 对象。我们可以使用 Joi 来对前端传来的数据进行校验,然后再将校验通过的数据传递给 Mongoose 进行保存。

const Joi = require('joi');

const userSchema = Joi.object({
  name: Joi.string().required(),
  email: Joi.string().email().required(),
  age: Joi.number().integer().min(0).max(120)
});

const user = {
  name: 'Alice',
  email: 'alice@example.com',
  age: -10
};

const { error, value } = userSchema.validate(user);

if (error) {
  console.log(error.message);
} else {
  const newUser = new User(value);
  await newUser.save();
}

上述代码中,我们定义了一个 userSchema 对象来描述校验规则,并使用 validate 方法对 user 对象进行校验。如果校验失败,将会输出错误信息;如果校验通过,将会创建一个新的 User 对象并保存到数据库中。

Express Validator

Express Validator 是一个 Express 中间件,它可以用来校验请求参数。我们可以使用 Express Validator 来对前端传来的数据进行校验,然后再将校验通过的数据传递给 Mongoose 进行保存。

const { body, validationResult } = require('express-validator');

app.post('/users', [
  body('name').notEmpty(),
  body('email').isEmail(),
  body('age').isInt({ min: 0, max: 120 })
], async (req, res) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(400).json({ errors: errors.array() });
  }

  const newUser = new User(req.body);
  await newUser.save();
  res.json(newUser);
});

上述代码中,我们使用 body 函数来定义校验规则,并使用 validationResult 函数来获取校验结果。如果校验失败,将会返回一个 400 错误和错误信息;如果校验通过,将会创建一个新的 User 对象并保存到数据库中。

总结

在本文中,我们介绍了 Mongoose 中的数据校验功能,并提供了常见的校验规则和错误处理方式。同时,我们也介绍了其它优雅解决方案,如 Joi 和 Express Validator,它们可以帮助我们更加方便地进行数据校验和转换。在实际开发中,我们应该根据具体的需求来选择合适的解决方案,以提高数据的质量和可靠性。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/658aa469eb4cecbf2dfe1632


纠错
反馈