Последовательность автоматического приращения в NestJs / Mongoose - PullRequest
3 голосов
/ 10 июля 2020

Я переношу проект NodeJs на Nest Js, этот проект использует MongoDB в качестве внутренней базы данных и Mon goose как ODM. Я использовал плагин mon goose -sequence для обработки последовательностей автоинкремента, однако у меня возникли проблемы, требующие библиотеки под Nest Js.

Mon goose -sequence в документации объясняется, как импортировать библиотеку с использованием синтаксиса Common JS следующим образом:

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);

Однако, поскольку Nest Js использует Dependency Injection, доступ к собственному соединению не такой прямой. Согласно документации для интеграции MongoDB с использованием Mon goose доступ к собственному объекту Mon goose Connection можно выполнить с помощью декоратора @InjectConnection() следующим образом:

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

Но поскольку Декораторы TypeScript могут быть прикреплены только к объявлению класса, методу, инструменту доступа, свойству или параметру. Я не понимаю, как внедрить соединение, требовать плагин и инициализировать его в моих классах схемы.

1 Ответ

3 голосов
/ 10 июля 2020

Можно зарегистрировать подключаемый модуль для данной схемы, используя метод forFeatureAsync() из MongooseModule вместе с поставщиком фабрики (например, useFactory).

Следуя примеру из официальная документация :

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

Однако с плагином mongoose-sequence необходимо передать собственный объект подключения Mon goose к инициализации плагина. Этого можно достичь, вставив соединение в фабричный провайдер с помощью метода 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 {}
...