Nest.js基础知识MongoDB

作者: 茶艺瑶 | 来源:发表于2018-08-08 23:05 被阅读19次

    請先安裝本次需要的模組。
    cmd指令

    yarn add mongoose 
    yarn add @types/mongoose --dev
    

    我们在 src/app/database.provider.ts实例化一个Mongoose

    'use strict';
    
    import * as mongoose from 'mongoose';
    
    export const databaseProviders = [
        {
            provide: 'MongoDBConnection',
            useFactory: async (): Promise<mongoose.Connection> => {
                (mongoose as any).Promise = global.Promise;
                return await mongoose.connect('mongodb://localhost:27017/IronManNest', {
                    useMongoClient: true
                })
            }
        }
    ]
    

    先使用mongoose.connect()建立一下與MongoDB的連線,這會回傳MongooseThenable,再透過global.Promise 覆寫它,避免程式發出警告,實際上這也是一個非同步的Component。

    使用Mongoose的人都知道我们要实例化一个schema对象
    所以接下来我们必须定义一个schema对象src/app/User/schemas/user.schema.ts

    import * as mongoose from 'mongoose';
    
    export const UsersSchema = new mongoose.Schema(
        {
            Name: String,
            Age: Number
        },
        { collection: 'Users', versionKey: false }, 
    )
    

    接下来是usersProviders
    src/app/Users/users.providers.ts

    'use strict';
    
    import { Connection, connection } from 'mongoose';
    import { UsersSchema } from './schemas/users.schema';
    
    export const UsersProvider = [
        {
            provide: 'UsersRepository',
            useFactory: (connection: Connection) => connection.model('Users', UsersSchema),
            inject: ['MongoDBConnection']
        }
    ]
    

    然后定义一下 Users的数据类型接口
    src/app/Users/interfaces/IUsers.ts

    'use strict';
    import { Document } from 'mongoose';
    
    export interface IUsers extends Document {
        readonly _id: number;
        readonly Name: string;
        readonly Age: number;
    }
    

    再来是定义@Body()的数据接口,让dot接口和interfaces中的字段进行映射
    src/app/Users/DTO/createUses.dto.ts

    import { ApiModelProperty } from '@nestjs/swagger';
    
    export class CreateUsersDTO {
    
        @ApiModelProperty()
        readonly _id: number;
    
        @ApiModelProperty()
        readonly Name: string;
    
        @ApiModelProperty()
        readonly Age: number;
    }
    

    接下来是要在UsersServices中依赖注入一下

    'use strict';
    
    import { Component, Inject } from '@nestjs/common';
    import { IUsers, IUsersService } from './interfaces/index';
    import { Model } from 'mongoose';
    import { InjectRepository } from '@nestjs/typeorm';
    import { CreateUsersDTO } from './DTO/createUsers.dto';
    
    @Component()
    export class UsersServices implements IUsersService{
        constructor( @Inject('UsersRepository') private readonly usersRepository: Model<IUsers>) { }
    }
    

    @Inject('UsersRepository') 对应是是export const UsersProvider = [
    {
    provide: 'UsersRepository',
    useFactory: (connection: Connection) => connection.model('Users', UsersSchema),
    inject: ['MongoDBConnection']
    }
    ]中的 UsersRepository

    最后别忘了
    在模块中已用一下 UsersServices ...UsersProvider

    'use strict';
    
    import { Module } from '@nestjs/common';
    import { UsersServices } from '../users.service';
    import { UsersProvider } from '../users.providers';
    import { DatabaseModule } from '../../database.module';
    import { UsersController } from './users.controller';
    
    @Module({
        modules: [DatabaseModule],
        controllers: [UsersController],
        provides: [
            UsersServices,
            ...UsersProvider
        ]
    })
    export class UsersModule { }
    

    如果你觉得上面的方法比较复杂的话,还有第二中配置,这种配置是全局的。
    app.moudule.ts 使用 @nestjs/mongoose

    @Module({
      imports: [
        MongooseModule.forRoot('127.0.0.1:27017/nest'),
        MongooseModule.forFeature([
                { name: "User", schema: UserSchema },
        ])
        UploadModule,
        CmsModule
      ],
      controllers: [AppController],
      providers: [AppService],
    })
    

    对应的Server层

    export class UsersServices implements IUsersService{
        constructor( @Inject('UsersRepository') private readonly usersRepository: Model<IUsers>) { }
    }
    
    @Inject('User') 便可
    

    相关文章

      网友评论

        本文标题:Nest.js基础知识MongoDB

        本文链接:https://www.haomeiwen.com/subject/yiefbftx.html