mongodb NestJs/Mongoose中的自动递增序列

mmvthczy  于 2022-11-03  发布在  Go
关注(0)|答案(2)|浏览(244)

我正在将一个NodeJs项目迁移到NestJs,这个项目使用MongoDB作为后端数据库,Mongoose作为ODM。我使用mongoose-sequence插件来处理自动增量序列,但是我遇到了需要NestJs下的库的麻烦。
mongoose-sequence文档解释了如何使用CommonJS语法导入库,如下所示:

  1. const mongoose = require('mongoose')
  2. const AutoIncrementFactory = require('mongoose-sequence');
  3. const connection = await mongoose.createConnection('mongodb://...');
  4. const AutoIncrement = AutoIncrementFactory(connection);

使用ES6导入语法,它将类似于:

  1. import * as mongoose from 'mongoose';
  2. import * as AutoIncrementFactory from 'mongoose-sequence';
  3. const connection = ...;
  4. const AutoIncrement = AutoIncrementFactory(connection);

但是,由于NestJs使用依赖注入,访问本地连接不是那么直接。根据使用Mongoose集成MongoDB的文档,访问本地Mongoose连接对象可以使用@InjectConnection()装饰器来完成,如下所示:

  1. @Injectable()
  2. export class CatsService {
  3. constructor(@InjectConnection() private connection: Connection) {}
  4. }

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

ylamdve6

ylamdve61#

可以使用MongooseModuleforFeatureAsync()方法沿着工厂提供者(即useFactory)为给定的模式注册插件。
以下是official documentation中的示例:

  1. @Module({
  2. imports: [
  3. MongooseModule.forFeatureAsync([
  4. {
  5. name: Cat.name,
  6. useFactory: () => {
  7. const schema = CatsSchema;
  8. schema.plugin(require('mongoose-autopopulate'));
  9. return schema;
  10. },
  11. },
  12. ]),
  13. ],
  14. })
  15. export class AppModule {}

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

  1. import {getConnectionToken, MongooseModule} from '@nestjs/mongoose';
  2. import * as AutoIncrementFactory from 'mongoose-sequence';
  3. @Module({
  4. imports: [
  5. MongooseModule.forFeatureAsync([
  6. {
  7. name: Cat.name,
  8. useFactory: async (connection: Connection) => {
  9. const schema = CatsSchema;
  10. const AutoIncrement = AutoIncrementFactory(connection);
  11. schema.plugin(AutoIncrement, {inc_field: 'id'});
  12. return schema;
  13. },
  14. inject: [getConnectionToken('YOUR_CONNECTION_NAME')],
  15. },
  16. ]),
  17. ],
  18. })
  19. export class AppModule {}
展开查看全部
qq24tv8q

qq24tv8q2#

我也遇到了同样的问题,但这对我很有效

  1. MongooseModule.forFeatureAsync([
  2. {
  3. name: Cats.name,
  4. useFactory: async (connection: Connection) => {
  5. const schema = CatsSchema;
  6. const AutoIncrement = require('mongoose-sequence')(connection);
  7. schema.plugin(AutoIncrement, {inc_field: 'id'});
  8. return schema;
  9. },
  10. inject: [getConnectionToken()],
  11. },
  12. ]),

相关问题