【问题标题】:Mongoose Plugins nestjs猫鼬插件nestjs
【发布时间】:2018-08-29 11:00:23
【问题描述】:

如何使用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() 的第一个参数必须是函数,得到“未定义”

【问题讨论】:

    标签: node.js mongoose mongoose-plugins nestjs


    【解决方案1】:

    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 {}
    

    【讨论】:

      【解决方案2】:

      试试这个:

      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'
      

      【讨论】:

        【解决方案3】:

        对于那些使用带有nestjs 的mongoose-paginate 插件的人来说,这是一个sn-p。您还可以安装 @types/mongoose-paginate 以获得打字支持

        1. 将分页插件添加到架构的代码:
        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. 现在您可以像这样轻松获取服务类中的分页方法
        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);
            }
        }
        

        【讨论】:

        • 虽然我有这个错误,但工作正常=>属性'分页'不存在类型'模型'.ts(2339)
        • 那是因为我在构造函数中使用了 Model 而不是 PaginateModel。谢谢!
        • 嗨,我也需要同样的东西,但是对于 mongoose-aggregate-paginate-v2,这个例子不起作用并且不存在 @types。你能帮帮我吗?
        • 嗨@Hector 对不起,我不熟悉那个插件。可能您可以查看相同的源代码并创建自己的类型文件并在内部项目中使用它。不必总是依赖外部类型。
        • @SandeepKNair 你能显示你的message.provider.ts吗?我不确定您对@Inject('Message') 的满意度如何,谢谢!
        【解决方案4】:

        如果你遵循官方文档,你可以在这个文件中添加插件:

        `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,
              });
            },
          },
        ];`
        

        提醒,如果您在 Schema 文件中设置插件,则您设置了相同的插件多次。设置插件的最佳方式只有一次。

        【讨论】:

        • 你能解释一下你是如何使用这个databaseProviders的吗?
        【解决方案5】:

        这里是一个使用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';
        

        【讨论】:

          猜你喜欢
          • 2022-06-11
          • 2019-02-13
          • 2019-01-17
          • 2019-12-20
          • 2019-08-04
          • 2021-09-18
          • 1970-01-01
          • 2014-07-15
          • 2019-12-22
          相关资源
          最近更新 更多