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); // 18
set 和 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。
- 在创建文章时,自动为文章的创建时间和更新时间赋值。
- 在创建商品时,自动为商品的库存和销量赋值。
验证方法
- 在创建或更新用户时,验证用户名和密码是否符合规范。
- 在创建或更新文章时,验证标题和内容是否符合规范。
- 在创建或更新商品时,验证价格和描述是否符合规范。
示例代码
下面是一个完整的示例代码,包含了自动填充和验证方法的使用:
-- -------------------- ---- ------- ----- -------- - -------------------- --------------------------------------------- ----- -- - -------------------- -------------- --------------------------- ---------- --------------- ---------- - --------------------- --- ----- ---------- - --- ----------------- ----- ------- ---- - ----- ------- -------- -- -- --------- - ----- ------- --------- ---- -- ------ - ----- ------- --------- ---- - --- ----- ---- - ---------------------- ------------ ----- ---- - --- ------ ----- ----- --------- --------- ------ ---------------------- --- ------------- -- - ----------------- -- ---- ---------------------- -- -- --- ----- ------------- - --- ----------------- ------ - ----- ------- --------- ---- -- -------- ------- ------- ------ --- ----- ------- - ------------------------- --------------- ----- ------- - --- --------- ------ -------- ------ -------- --------- ------- ---- --- ---------------- -- - ----------------- -- ---- --- ----- ------------- - --- ----------------- ----- ------- ------ - ----- ------- ---- - -- ------------ ------ --- ----- ------- - ------------------------- --------------- ----- ------- - --- --------- ----- ------ ------ ----- ------------ --------- --- ---------------- -- - ----------------- -- ---- --- ----- ----------- - --- ----------------- -------- ------- ------- - ----- ------- ----- ----------- ------------- ------------ -- ----------- ------ --- ----- ----- - ----------------------- ------------- ----- ----- - --- ------- -------- --------------- ------- ---------- ----------- ---- --- -------------- -- - ----------------- -- ---- ---
以上代码演示了自动填充和验证方法的基本用法,读者可以根据自己的需要进行扩展。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67da4026a941bf7134218bd1