Nest 也提供了類似于 Mybatis 的 ORM 工具,這樣會簡化對連接數據庫的操作提高工作效率,Nest 使用的是 @nestjs/typeorm 包來完成的,因為 TypeORM 是目前 Nodejs 中最成熟的 ORM 工具。
這篇文章你會學習到:
- 安裝 & 導入模塊
- 創(chuàng)建實體對象
- 查詢數據
- 多個數據庫
安裝 & 導入模塊
我們用 Mongo 作為例子,安裝老規(guī)矩:
npm install --save @nestjs/typeorm typeorm mongodb
Or
yarn add @nestjs/typeorm mongodb
安裝完成后,我們需要將 TypeOrmModule 導入到 AppModule:
// app.module.ts
import { Module, MiddlewareConsumer } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mongodb',
host: 'localhost',
port: 27017,
username: 'username',
password: 'password',
database: 'test',
entities: [join(__dirname, '**/**.entity{.ts,.js}')],
synchronize: true,
}),
],
})
export class AppModule { }
創(chuàng)建實體對象
接下來我們需要對數據庫表和對象之間做一個映射實體類:
// product.entity.ts
import { Entity, Column, ObjectIdColumn } from 'typeorm';
@Entity({
name: 'product',
})
export class Product {
@ObjectIdColumn()
public id: number;
@Column()
public name: string;
@Column()
public description: string;
}
實體類需要注冊到對應的模塊中去,這樣相關的 Controller、Service 或者其它模塊才能訪問到。
// product.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ProductsService } from './products.service';
import { ProductsController } from './products.controller';
import { Product } from './product.entity';
@Module({
imports: [
TypeOrmModule.forFeature([Product]),
],
controllers: [ProductsController],
providers: [ProductsService],
})
export class ProductsModule { }
查詢數據
然后,我們需要使用 @InjectRepository() 修飾器向 ProductsService 注入 ProductsRepository,這樣我就可以操作數據庫中的數據了:
// products.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Product } from './product.entity';
@Injectable()
export class ProductsService {
constructor(
@InjectRepository(Product) private readonly hotelRepository: Repository<Product>,
) { }
async findOne(): Promise<Product> {
return await this.hotelRepository.findOne();
}
async findAll(): Promise<Product[]> {
return await this.hotelRepository.find({
take: 10,
});
}
}
最后,我將這個服務通過 ProductsController 暴露成 RESTful 接口:
// products.controller.ts
import { Controller, Get } from '@nestjs/common';
import { ProductsService } from './products.service';
import { Product } from './product.entity';
@Controller('products')
export class ProductsController {
constructor(
private readonly productsService: ProductsService,
) { }
@Get()
findAll(): Promise<Product[]> {
return this.productsService.findAll();
}
@Get(':id')
findOne(): Promise<Product> {
return this.productsService.findOne();
}
}
多個數據庫
當然某些項目需要連接多個庫 ,我們可以這樣做:
const defaultOptions = {
type: 'mongodb',
port: 27017,
username: 'username',
password: 'password',
database: 'database',
synchronize: true,
};
@Module({
imports: [
TypeOrmModule.forRoot({
...defaultOptions,
host: 'product_db_host',
entities: [Product],
}),
TypeOrmModule.forRoot({
...defaultOptions,
name: 'orderConnection',
host: 'order_db_host',
entities: [Order],
}),
TypeOrmModule.forRoot({
...defaultOptions,
name: 'userConnection',
host: 'userdb_host',
entities: [User],
}),
],
})
export class AppModule {}
〖堅持的一俢〗