首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MongoDB

警告在本文中,您将学习如何使用自定义组件从头开始创建DatabaseModule基于Mongoose软件包。因此,此解决方案包含大量开销,您可以使用现成的和可用的开箱即用专用@nestjs/mongoose软件包来省略。

Mongoose是最受欢迎的MongoDB对象建模工具。要使用此库启动冒险,我们必须安装所有必需的依赖项:

JS

代码语言:javascript
复制
$ npm install --save mongoose
$ npm install --save-dev @types/mongoose

我们需要做的第一步是使用connect()函数建立与数据库的连接。该connect()函数返回a Promise,因此我们必须创建一个异步提供程序。

database.providers.ts

JS

代码语言:javascript
复制
import * as mongoose from 'mongoose';

export const databaseProviders = [
  {
    provide: 'DbConnectionToken',
    useFactory: async (): Promise<typeof mongoose> =>
      await mongoose.connect('mongodb://localhost/nest'),
  },
];

提示遵循最佳实践,我们在具有*.providers.ts后缀的分隔文件中声明了自定义提供程序。

然后,我们需要导出这些提供程序,以使其可供应用程序的其余部分访问

database.module.ts

JS

代码语言:javascript
复制
import { Module } from '@nestjs/common';
import { databaseProviders } from './database.providers';

@Module({
  providers: [...databaseProviders],
  exports: [...databaseProviders],
})
export class DatabaseModule {}

现在我们可以Connection使用@Inject()装饰器注入对象。依赖于Connection异步提供程序的每个类都将等到a Promise被解析。

模型注射

使用Mongoose,一切都来自 Schema 。让我们来定义CatSchema

猫/模式/ cat.schema.ts

JS

代码语言:javascript
复制
import * as mongoose from 'mongoose';

export const CatSchema = new mongoose.Schema({
  name: String,
  age: Number,
  breed: String,
});

CatsSchema属于cats目录。这个目录代表了CatsModule

现在是时候创建一个Model提供者了:

cats.providers.ts

JS

代码语言:javascript
复制
import { Connection } from 'mongoose';
import { CatSchema } from './schemas/cat.schema';

export const catsProviders = [
  {
    provide: 'CatModelToken',
    useFactory: (connection: Connection) => connection.model('Cat', CatSchema),
    inject: ['DbConnectionToken'],
  },
];

注意在实际应用程序中,您应该避免使用魔术字符串。双方CatModelTokenDbConnectionToken应保持在分开的constants.ts文件。

现在,我们可以注入CatModelToken的到CatsService用的@Inject()装饰:

cats.service.ts

JS

代码语言:javascript
复制
import { Model } from 'mongoose';
import { Injectable, Inject } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';
import { CreateCatDto } from './dto/create-cat.dto';

@Injectable()
export class CatsService {
  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();
  }
}

在上面的例子中,我们使用了Cat接口。此接口扩展Document了mongoose包:

cat.interface.ts

代码语言:javascript
复制
import { Document } from 'mongoose';

export interface Cat extends Document {
  readonly name: string;
  readonly age: number;
  readonly breed: string;
}

数据库连接是异步的,但是Nest使这个过程对最终用户完全不可见。该CatModel班正在等待数据库连接,并且CatsService被延迟,直到模型就可以使用了。整个应用程序可以在每个类实例化时启动。

这是一个决赛CatsModule

cats.module.ts

JS

代码语言:javascript
复制
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
import { catsProviders } from './cats.providers';
import { DatabaseModule } from '../database/database.module';

@Module({
  imports: [DatabaseModule],
  controllers: [CatsController],
  providers: [
    CatsService,
    ...catsProviders,
  ],
})
export class CatsModule {}

提示不要忘记将其导入CatsModule根目录ApplicationModule

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com