如何在 NestJs 和 typescript 中使用 `mongoose-delete` 插件?

Posted

技术标签:

【中文标题】如何在 NestJs 和 typescript 中使用 `mongoose-delete` 插件?【英文标题】:How to use `mongoose-delete` plugin with NestJs and typescript? 【发布时间】:2021-08-08 17:15:26 【问题描述】:

我在 NestJs 库中使用 Mongoose,并希望为我的所有模式使用 mongoose-delete 插件。

但我不知道如何将它与nestJS和Typescript一起使用。

首先我安装了mongoose-delete@Types/mongoose-delete 库,但是这个插件没有打字稿纪录片。 这是嵌套添加插件的推荐方法:

    MongooseModule.forRoot(MONGO_URI, 
      connectionFactory: connection => 
        connection.plugin(require('mongoose-delete'));
        return connection;
      ,
    ),

这绝对会产生 esLint 错误:

require 语句不是 import statement.eslint 的一部分

而且我不能使用delete 函数。它没有在 mongoose.Dcoument 中定义

  export type ChannelDocument = Channel & Document;

  constructor(
    @InjectModel(Channel.name) private _channelModel: Model<ChannelDocument>,
  ) 

  async delete(id: string) 
    this._channelModel.delete( id );
    // This is undefined -^
  

【问题讨论】:

【参考方案1】:

安装这个包后尝试重启你的IDE(如果你使用vscode):@types/mongoose-delete

【讨论】:

【参考方案2】:

请看mongoose-softdelete-typescript。

import  Schema, model  from 'mongoose';
import  softDeletePlugin, ISoftDeletedModel, ISoftDeletedDocument  from 'mongoose-softdelete-typescript';

const TestSchema = new Schema(
  name:  type: String, default: '' ,
  description:  type: String, default: 'description' ,
);

TestSchema.plugin(softDeletePlugin);

const Test = model<ISoftDeletedDocument, ISoftDeletedModel<ISoftDeletedDocument>>('Test', TestSchema);
const test1 = new Test();
// delete single document
const newTest = await test1.softDelete();
// restore single document
const restoredTest = await test1.restore();
// find many deleted documents
const deletedTests = await Test.findDeleted(true);
// soft delete many documents with conditions
await Test.softDelete( name: 'test' );

// support mongo transaction
const session = await Test.db.startSession();
session.startTransaction();
try 
  const newTest = await test1.softDelete(session);

  await session.commitTransaction();
 catch (e) 
  console.log('e', e);
  await session.abortTransaction();
 finally 
  await session.endSession();

【讨论】:

这段代码是关于将插件添加到一个单一的模式而不是全局的所有模式。我需要将它添加到所有模式中。 (谢谢你的包裹。事实上我现在正在使用你的包裹:-))

以上是关于如何在 NestJs 和 typescript 中使用 `mongoose-delete` 插件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在nestjs mongoose typescript中引用嵌套文档

在 NestJS 中使用依赖注入导入 TypeScript 模块

如何使用 Sequelize-Typescript 模型定义指定 NestJs 控制器的返回类型?

从使用 nestjs API 应用程序调试 npm 库(使用 noidejs、nestjs 和 typescript 构建)

带有 NestJS + Typescript + Webpack + node_modules 的单个文件包

使用 TypeORM 和 NestJs 和 Typescript 创建新迁移时出错 [关闭]