如何在NestJS中实现Mongoose Plugin?
嘿,我来帮你梳理下在NestJS里实现Mongoose插件的具体步骤,结合你给出的代码片段,我整理了完整可运行的方案:
在NestJS中实现Mongoose插件的完整指南
1. 先安装所需的插件依赖
首先得把要用的Mongoose插件包安装好,TypeScript项目记得还要装对应的类型定义:
npm install mongoose-unique-validator mongoose-paginate mongoose-delete npm install @types/mongoose-unique-validator @types/mongoose-paginate @types/mongoose-delete --save-dev
2. 在Schema中注册插件
接下来在用户Schema中引入并注册这些插件,每个插件的作用我都标注在代码里了:
import * as mongoose from 'mongoose'; import uniqueValidator from 'mongoose-unique-validator'; import mongoosePaginate from 'mongoose-paginate'; import mongoose_delete from 'mongoose-delete'; const UsuarioSchema = new mongoose.Schema({ username: { type: String, unique: true, required: [true, '用户名是必填项'] }, password: { type: String, required: [true, '密码是必填项'], select: false } }, { timestamps: true }); // 可选:自动添加createdAt和updatedAt字段 // 注册唯一验证插件,自定义错误提示 UsuarioSchema.plugin(uniqueValidator, { message: '{PATH} 必须是唯一的' }); // 注册分页插件 UsuarioSchema.plugin(mongoosePaginate); // 注册软删除插件,开启删除时间记录并覆盖所有默认CRUD方法 UsuarioSchema.plugin(mongoose_delete, { deletedAt: true, overrideMethods: 'all' }); export const UsuarioModel = mongoose.model('Usuario', UsuarioSchema);
3. 在NestJS模块中集成Mongoose
把刚才定义的Schema注册到Nest的Mongoose模块里,这样Service层就能注入使用了:
import { Module } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; import { UsuarioSchema } from './usuario.schema'; import { UsuarioService } from './usuario.service'; import { UsuarioController } from './usuario.controller'; @Module({ imports: [ MongooseModule.forFeature([{ name: 'Usuario', schema: UsuarioSchema }]) ], providers: [UsuarioService], controllers: [UsuarioController] }) export class UsuarioModule {}
4. 在Service中使用插件提供的功能
现在你就能在Service里调用插件带来的便捷方法了,比如分页查询、软删除等:
import { Injectable } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; import { PaginateModel } from 'mongoose'; import { Usuario } from './interfaces/usuario.interface'; @Injectable() export class UsuarioService { // 注意这里要用PaginateModel类型来支持分页方法 constructor( @InjectModel('Usuario') private readonly usuarioModel: PaginateModel<Usuario> ) {} // 分页查询用户列表 async findAllPaginated(page: number = 1, limit: number = 10) { const paginationOptions = { page, limit, sort: { createdAt: -1 } // 按创建时间倒序排列 }; return await this.usuarioModel.paginate({}, paginationOptions); } // 软删除指定用户 async softDeleteUsuario(id: string) { return await this.usuarioModel.findByIdAndDelete(id); } // 查询所有已软删除的用户 async findDeletedUsuarios() { return await this.usuarioModel.findDeleted().exec(); } }
小提示
mongoose-unique-validator会帮你自动校验unique字段的唯一性,不用自己写重复逻辑mongoose-paginate返回的结果包含docs(当前页数据)、total(总条数)、page(当前页码)等分页信息mongoose_delete的overrideMethods: 'all'会把默认的find、findOne等方法改成只查询未删除的数据,如果你要查已删除的,就用findDeleted()方法
内容的提问来源于stack exchange,提问作者Walter Armando Cruz
相关产品推荐
相关产品推荐

