MongoDB
MongoDB
警告
在本文中,您将学习如何使用自定义组件从头开始创建DatabaseModule
基于Mongoose
软件包。因此,此解决方案包含大量开销,您可以使用现成的和可用的开箱即用专用@nestjs/mongoose
软件包来省略。
Mongoose是最受欢迎的MongoDB对象建模工具。要使用此库启动冒险,我们必须安装所有必需的依赖项:
JS
$ npm install --save mongoose
$ npm install --save-dev @types/mongoose
我们需要做的第一步是使用connect()
函数建立与数据库的连接。该connect()
函数返回a Promise
,因此我们必须创建一个异步提供程序。
database.providers.ts
JS
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
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
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
import { Connection } from 'mongoose';
import { CatSchema } from './schemas/cat.schema';
export const catsProviders = [
{
provide: 'CatModelToken',
useFactory: (connection: Connection) => connection.model('Cat', CatSchema),
inject: ['DbConnectionToken'],
},
];
注意
在实际应用程序中,您应该避免使用魔术字符串
。双方CatModelToken
并DbConnectionToken
应保持在分开的constants.ts
文件。
现在,我们可以注入CatModelToken
的到CatsService
用的@Inject()
装饰:
cats.service.ts
JS
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
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
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
。