Mongoose 是一个在 Node.js 环境中操作 MongoDB 数据库的优秀工具,它提供了许多方便的 API,可以帮助我们快速地构建和操作 MongoDB 数据库。其中,自动填充和验证方法是 Mongoose 中非常重要的两个功能,它们可以帮助我们自动填充数据并验证数据的合法性,极大地提高了我们的开发效率。本文将详细介绍 Mongoose 中的自动填充和验证方法,并给出一些使用场景和示例代码。
自动填充
自动填充是指在创建或更新文档时,自动填充一些字段的值,使得这些字段的值不需要手动输入,从而减少了输入的工作量和错误的可能性。在 Mongoose 中,可以通过定义 Schema 的时候,使用 default、set 和 get 等方法来实现自动填充功能。
default 方法
default 方法用于设置字段的默认值,当创建文档时,如果没有为该字段指定值,则会自动使用该默认值。例如,下面的代码中,定义了一个名为 UserSchema 的 Schema,其中 age 字段的默认值为 18:
const UserSchema = new mongoose.Schema({
name: String,
age: { type: Number, default: 18 },
email: String
});在创建文档时,如果没有为 age 指定值,则会自动使用默认值 18:
const user = new User({ name: '张三', email: 'zhangsan@example.com' });
console.log(user.age); // 18set 和 get 方法
set 和 get 方法分别用于设置和获取字段的值,在设置字段的值时,可以对该值进行一些处理,从而实现自动填充的功能。例如,下面的代码中,定义了一个名为 BookSchema 的 Schema,其中 price 字段的值为人民币,但是在存储到数据库中时,需要将其转换为美元:
const BookSchema = new mongoose.Schema({
title: String,
price: {
type: Number,
get: v => (v / 7).toFixed(2),
set: v => v * 7
}
});在获取 price 字段的值时,会自动将其转换为美元:
const book = new Book({ title: 'JavaScript 从入门到精通', price: 35 });
console.log(book.price); // 5.00在设置 price 字段的值时,会自动将其转换为人民币:
book.price = 10; console.log(book.price); // 70
验证方法
验证方法是指在创建或更新文档时,对文档的字段进行验证,确保其满足特定的要求。在 Mongoose 中,可以通过定义 Schema 的时候,使用 required、min、max、enum 等方法来实现验证功能。
required 方法
required 方法用于指定字段是否必填,如果某个字段必填,但是创建文档时没有为该字段指定值,则会抛出异常。例如,下面的代码中,定义了一个名为 ArticleSchema 的 Schema,其中 title 字段必填:
const ArticleSchema = new mongoose.Schema({
title: { type: String, required: true },
content: String,
author: String
});在创建文档时,如果没有为 title 指定值,则会抛出异常:
const article = new Article({ content: '这是一篇文章', author: '张三' });
article.save(err => {
console.log(err); // ValidationError: Article validation failed: title: Path `title` is required.
});min 和 max 方法
min 和 max 方法分别用于指定字段的最小值和最大值,如果某个字段的值小于最小值或大于最大值,则会抛出异常。例如,下面的代码中,定义了一个名为 ProductSchema 的 Schema,其中 price 字段的值必须大于等于 0:
const ProductSchema = new mongoose.Schema({
name: String,
price: { type: Number, min: 0 },
description: String
});在创建文档时,如果 price 字段的值小于 0,则会抛出异常:
const product = new Product({ name: '电视机', price: -1000, description: '这是一台电视机' });
product.save(err => {
console.log(err); // ValidationError: Product validation failed: price: Path `price` (-1000) is less than minimum allowed value (0).
});enum 方法
enum 方法用于指定字段的值必须是某个预定义的值。例如,下面的代码中,定义了一个名为 OrderSchema 的 Schema,其中 status 字段的值必须是 pending、processing 或 completed 中的一个:
const OrderSchema = new mongoose.Schema({
orderNo: String,
status: { type: String, enum: ['pending', 'processing', 'completed'] },
totalPrice: Number
});在创建文档时,如果 status 字段的值不是 pending、processing 或 completed 中的一个,则会抛出异常:
const order = new Order({ orderNo: '202201010001', status: 'cancelled', totalPrice: 1000 });
order.save(err => {
console.log(err); // ValidationError: Order validation failed: status: `cancelled` is not a valid enum value for path `status`.
});使用场景
自动填充和验证方法在实际开发中有许多应用场景,下面列举了几个常见的场景:
自动填充
- 在创建用户时,自动为用户生成一个唯一的 ID。
- 在创建文章时,自动为文章的创建时间和更新时间赋值。
- 在创建商品时,自动为商品的库存和销量赋值。
验证方法
- 在创建或更新用户时,验证用户名和密码是否符合规范。
- 在创建或更新文章时,验证标题和内容是否符合规范。
- 在创建或更新商品时,验证价格和描述是否符合规范。
示例代码
下面是一个完整的示例代码,包含了自动填充和验证方法的使用:
-- -------------------- ---- ------- ----- -------- - -------------------- --------------------------------------------- ----- -- - -------------------- -------------- --------------------------- ---------- --------------- ---------- - --------------------- --- ----- ---------- - --- ----------------- ----- ------- ---- - ----- ------- -------- -- -- --------- - ----- ------- --------- ---- -- ------ - ----- ------- --------- ---- - --- ----- ---- - ---------------------- ------------ ----- ---- - --- ------ ----- ----- --------- --------- ------ ---------------------- --- ------------- -- - ----------------- -- ---- ---------------------- -- -- --- ----- ------------- - --- ----------------- ------ - ----- ------- --------- ---- -- -------- ------- ------- ------ --- ----- ------- - ------------------------- --------------- ----- ------- - --- --------- ------ -------- ------ -------- --------- ------- ---- --- ---------------- -- - ----------------- -- ---- --- ----- ------------- - --- ----------------- ----- ------- ------ - ----- ------- ---- - -- ------------ ------ --- ----- ------- - ------------------------- --------------- ----- ------- - --- --------- ----- ------ ------ ----- ------------ --------- --- ---------------- -- - ----------------- -- ---- --- ----- ----------- - --- ----------------- -------- ------- ------- - ----- ------- ----- ----------- ------------- ------------ -- ----------- ------ --- ----- ----- - ----------------------- ------------- ----- ----- - --- ------- -------- --------------- ------- ---------- ----------- ---- --- -------------- -- - ----------------- -- ---- ---
以上代码演示了自动填充和验证方法的基本用法,读者可以根据自己的需要进行扩展。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67da4026a941bf7134218bd1