NestJs/Mongoose 中的自动增量序列

Posted

技术标签:

【中文标题】NestJs/Mongoose 中的自动增量序列【英文标题】:Auto Increment Sequence in NestJs/Mongoose 【发布时间】:2020-10-30 14:30:15 【问题描述】:

我正在将一个 NodeJs 项目迁移到 NestJs,该项目使用 MongoDB 作为后端数据库,使用 Mongoose 作为 ODM。我使用 mongoose-sequence 插件来处理自动增量序列,但是我遇到了需要 NestJs 下的库的麻烦。

mongoose-sequence 文档解释了如何使用 CommonJS 语法导入库,如下所示:

const mongoose = require('mongoose')
const AutoIncrementFactory = require('mongoose-sequence');

const connection = await mongoose.createConnection('mongodb://...');

const AutoIncrement = AutoIncrementFactory(connection);

使用 ES6 导入语法会是这样的:

import * as mongoose from 'mongoose';
import * as AutoIncrementFactory from 'mongoose-sequence';

const connection = ...;

const AutoIncrement = AutoIncrementFactory(connection);

但是由于 NestJs 使用依赖注入,访问原生连接并不是那么直接。根据documentation to integrate MongoDB using Mongoose 访问本机Mongoose Connection 对象可以使用@InjectConnection() 装饰器完成,如下所示:

@Injectable()
export class CatsService 
  constructor(@InjectConnection() private connection: Connection) 

但由于 TypeScript decorators 只能附加到类声明、方法、访问器、属性或参数,我看不到如何注入连接,需要插件并在我的 Schema 类上初始化它。

【问题讨论】:

【参考方案1】:

可以使用MongooseModuleforFeatureAsync() 方法以及工厂提供程序(即useFactory)为给定架构注册插件。

按照official documentation中的示例:

@Module(
  imports: [
    MongooseModule.forFeatureAsync([
      
        name: Cat.name,
        useFactory: () => 
          const schema = CatsSchema;
          schema.plugin(require('mongoose-autopopulate'));
          return schema;
        ,
      ,
    ]),
  ],
)
export class AppModule 

但是,对于mongoose-sequence 插件,必须将本机 Mongoose 连接对象传递给插件初始化。这可以通过使用getConnectionToken 方法将连接注入工厂提供程序来实现:

import getConnectionToken, MongooseModule from '@nestjs/mongoose';
import * as AutoIncrementFactory from 'mongoose-sequence';

@Module(
  imports: [
    MongooseModule.forFeatureAsync([
      
        name: Cat.name,
        useFactory: async (connection: Connection) => 
          const schema = CatsSchema;
          const AutoIncrement = AutoIncrementFactory(connection);
          schema.plugin(AutoIncrement, inc_field: 'id');
          return schema;
        ,
        inject: [getConnectionToken('YOUR_CONNECTION_NAME')],
      ,
    ]),
  ],
)
export class AppModule 

【讨论】:

感谢您的回答。我正在尝试使用它,但我从 AutoIncrementFactory(connection) 收到打字错误。 “Connection 类型的参数不可分配给 'Schema' 类型的参数。您是否也遇到过这种情况? 嗨@Todd,不,我没有遇到这个问题,在我看来,您正在将连接分配给不是连接的东西,但如果没有更多上下文,很难说。 感谢安德烈斯。我的模块看起来就像你上面的一样。也许我们安装的底层库不同。 好的,我通过在主 AppModule 而不是 OrderModule 上执行此 forFeatureAsync 导入来修复。终于成功了。 @AndresFelipe 知道这个错误吗? Cannot read property 'modelNames' of undefined

以上是关于NestJs/Mongoose 中的自动增量序列的主要内容,如果未能解决你的问题,请参考以下文章

如何引用我试图保存在 nestjs/mongoose 中的模式?

NestJS + Mongoose + GraphQL:“填充”不起作用

无法在关系 nestjs/mongoose 上查询条件

如何在@nestjs/mongoose 模式中设置枚举

Nestjs中的MissingSchemaError

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