You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:05:01