Мангуст Плагины nestjs

Как я могу реализовать плагин mongoose, используя nestjs?

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, 'El nombre de usuario es requerido']
    },
    password: {
        type: String,
        required: [true, 'La clave es requerida'],
        select: false
    }
});

UsuarioSchema.plugin(uniqueValidator, { message: '{PATH} debe ser único' });
UsuarioSchema.plugin(mongoosePaginate);
UsuarioSchema.plugin(mongoose_delete, { deletedAt : true, deletedBy : true, overrideMethods: true });

Ошибка: первый параметр schema.plugin() должен быть функцией, получил "undefined"

6 ответов

Это фрагмент кода для тех, кто использует плагин mongoose- paginate с nestjs. Вы также можете установить https://www.npmjs.com/package/@types/mongoose-paginate для получения поддержки набора текста

  1. Код для добавления плагина paginate в схему:
import { Schema } from 'mongoose';
import * as mongoosePaginate from 'mongoose-paginate';

export const MessageSchema = new Schema({
// Your schema definitions here
});

// Register plugin with the schema
MessageSchema.plugin(mongoosePaginate);
  1. Теперь в документе интерфейса сообщения
export interface Message extends Document {
// Your schema fields here
}

  1. Теперь вы можете легко получить метод paginate внутри класса обслуживания следующим образом
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { PaginateModel } from 'mongoose';
import { Message } from './interfaces/message.interface';

@Injectable()
export class MessagesService {
    constructor(
        // The 'PaginateModel' will provide the necessary pagination methods
        @InjectModel('Message') private readonly messageModel: PaginateModel<Message>,
    ) {}

    /**
     * Find all messages in a channel
     *
     * @param {string} channelId
     * @param {number} [page=1]
     * @param {number} [limit=10]
     * @returns
     * @memberof MessagesService
     */
    async findAllByChannelIdPaginated(channelId: string, page: number = 1, limit: number = 10) {
        const options = {
            populate: [
                // Your foreign key fields to populate
            ],
            page: Number(page),
            limit: Number(limit),
        };
        // Get the data from database
        return await this.messageModel.paginate({ channel: channelId }, options);
    }
}

В документации NestJS есть лучший способ добавить плагины к любой отдельной схеме.

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

Или на глобальном уровне.

      import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';

@Module({
  imports: [
    MongooseModule.forRoot('mongodb://localhost/test', {
      connectionFactory: (connection) => {
        connection.plugin(require('mongoose-autopopulate'));
        return connection;
      }
    }),
  ],
})
export class AppModule {}

Если вы используете forRootAsync, у меня это сработало, как показано ниже.

      MongooseModule.forRootAsync({
  useFactory: async (ConfigService: ConfigService) => {
    const connectionName: string =
      process.env.NODE_ENV === 'production'
        ? 'DATABASE_URL'
        : 'LOCAL_DATABASE_URL';

    mongoose.plugin(require('mongoose-unique-validator')); // import mongoose the normal way and you can import your plugin as desired
    return {
      uri: ConfigService.get<string>(connectionName),
    };
  },
  inject: [ConfigService],
}),

Попробуй это:

import * as mongoose from 'mongoose';
import * as uniqueValidator from 'mongoose-unique-validator';
import * as mongoosePaginate from 'mongoose-paginate';
import * as mongoose_delete from 'mongoose-delete';

const UsuarioSchema = new mongoose.Schema({
   username: {
    type: String,
    unique: true,
    required: [true, 'El nombre de usuario es requerido']
   },
   password: {
       type: String,
       required: [true, 'La clave es requerida'],
       select: false
   }
});

UsuarioSchema.plugin(uniqueValidator, { message: '{PATH} debe ser único' });
UsuarioSchema.plugin(mongoosePaginate);
UsuarioSchema.plugin(mongoose_delete, { deletedAt : true, deletedBy : true, overrideMethods: true });

export default UsuarioSchema;

Тогда вы можете использовать это так:

import UsuarioSchema from './UsuarioSchema'

Вот пример использования timestamp плагин

import { Schema } from 'mongoose';
import * as timestamp from 'mongoose-timestamp';
export const ConversationSchema = new Schema({
  users: [String],
}).plugin(timestamp);

попробуй заменить

import uniqueValidator from 'mongoose-unique-validator';
import mongoosePaginate from 'mongoose-paginate';
import mongoose_delete from 'mongoose-delete';

от

import * as uniqueValidator from 'mongoose-unique-validator';
import * as mongoosePaginate from 'mongoose-paginate';
import * as mongoose_delete from 'mongoose-delete';

Если вы следовали официальному документу, вы можете добавить плагины в этот файл:

`export const databaseProviders = [
  {
    provide: 'DbConnectionToken',
    useFactory: async () => {
      (mongoose as any).Promise = global.Promise;

      mongoose
        .plugin('pluginOne')
        .plugin('pluginTwo')

      return await mongoose.connect('mongodb://localhost/nest', {
        useMongoClient: true,
      });
    },
  },
];`

Напомним, если вы устанавливаете плагины в файле схемы, вы устанавливаете одни и те же плагины столько раз. Лучший способ установить плагины только один раз.

Другие вопросы по тегам