作为后端语言开发自然要连接数据库,对数据的增删改查,目前nest提供可以连接的数据库有mySQLmongoDB,官网地址,本文介绍使用nest连接mongoDB数据库,官网介绍也很简单,官网提供的案例

一、使用步骤

  • 1、安装依赖包

    npm install --save @nestjs/mongoose mongoose
  • 2、在项目中创建一个database作为数据库连接的文件/或者叫包

    • database.providers.ts类似angular中使用工厂的方式把数据库连接池注入到项目中

      import * as mongoose from 'mongoose';
      
      export const databaseProviders = [
        {
          provide: 'DbConnectionToken',
          useFactory: async (): Promise<mongoose.Connection> =>
            await mongoose.connect('mongodb://localhost/nest'),
        },
      ];
    • database.module.ts 就是一个导入连接池与导出的module文件

      import { Module } from '@nestjs/common';
      import { databaseProviders } from './database.providers';
      
      @Module({
        components: [...databaseProviders],
        exports: [...databaseProviders],
      })
      export class DatabaseModule {}
  • 3、根据官网的创建一个cats的文件夹存放关于cat的全部信息
  • 4、根据上文中介绍的要创建几个基础文件然后注入到cats.module.ts中,再将cats.module.ts注入到app.module.ts
  • 5、在文件夹下创建一个新的文件夹和文件(俗称App)

    • dto文件夹
    • interfaces文件夹
    • schemas文件夹,创建本Appschema
    • cats.providers.tsdatabase中的database.providers.ts与本文件夹下的schema相关联(使用useFactory依赖注入的方式)
  • 6、schemas的书写(数据建模)

    import * as mongoose from 'mongoose';
    
    export const CatSchema = new mongoose.Schema({
      name: String,
      age: Number,
      breed: String,
    });
  • 7、interfaces的书写(接口约束数据类型)

    import { Document } from 'mongoose';
    
    export interface Cat extends Document {
      readonly name: string;
      readonly age: number;
      readonly breed: string;
    }
  • 8、dto的书写(也是约束数据类型的)

    export class CreateCatDto {
      readonly name: string;
      readonly age: number;
      readonly breed: string;
    }
  • 9、cats.providers.ts的书写(关键点)

    import { Connection } from 'mongoose';
    // 引入schema
    import { CatSchema } from './schemas/cat.schema';
    
    export const catsProviders = [
      {
        // 自己定义一个到时候在service.ts中注入
        provide: 'CatModelToken', 
        // 使用CatSchema
        useFactory: (connection: Connection) => connection.model('Cat', CatSchema),
        // DbConnectionToken是database.providers.ts里面的key
        inject: ['DbConnectionToken'],
      },
    ];
  • 10、关于cats.service.ts的书写

    import { Model } from 'mongoose';
    import { Component, Inject } from '@nestjs/common';
    import { Cat } from './interfaces/cat.interface';
    import { CreateCatDto } from './dto/create-cat.dto';
    
    @Component()
    export class CatsService {
      // 注入的CatModelToken要与cats.providers.ts里面的key一致就可以
      constructor(@Inject('CatModelToken') private readonly catModel: Model<Cat>) {}
    
      // 创建数据
      async create(createCatDto: CreateCatDto): Promise<Cat> {
        const createdCat = new this.catModel(createCatDto);
        return await createdCat.save();
      }
    
      // 查询全部数据
      async findAll(): Promise<Cat[]> {
        return await this.catModel.find().exec();
      }
    
      // 根据id查询
      async findById(_id): Promise<Cat> {
        return await this.catModel.findById(_id).exec()
      }
    }
  • 11、参考代码(组件catsfood)

二、简单的写法(不写约束数据类型)

  • 1、创建一个book.providers.tsschema文件夹
  • 2、参考代码(组件book)

三、代码下载