【Nest 極速指南】應用篇之數據庫

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 {}

〖堅持的一俢〗

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應的列上鍵入重復值時,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 6,034評論 0 9
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,694評論 1 32
  • 官方文檔 https://docs.nestjs.com 一、概述Nest是一個用于構建高效,可擴展的Node....
    zx_lau閱讀 62,576評論 0 25
  • 大萌是我養(yǎng)的第一只貓。她到家的那天是2015年12月20日,我記得非常清楚,因為那天晚上我和朋友還去看了周杰倫的演...
    辛夏至閱讀 641評論 2 5
  • 1.Q:簡單的介紹一下新聞網絡部 R:新聞網絡部是依附于團委的重要分支,主要負文學院校園活動的新聞采集,征文比賽...
    Ms_pingping閱讀 872評論 0 0

友情鏈接更多精彩內容