Мангуст Плагины 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 для получения поддержки набора текста
- Код для добавления плагина 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);
- Теперь в документе интерфейса сообщения
export interface Message extends Document {
// Your schema fields here
}
- Теперь вы можете легко получить метод 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,
});
},
},
];`
Напомним, если вы устанавливаете плагины в файле схемы, вы устанавливаете одни и те же плагины столько раз. Лучший способ установить плагины только один раз.