【Nest 极速指南】应用篇之数据库

Nest 也提供了类似于 Mybatis 的 ORM 工具,这样会简化对连接数据库的操作提高工作效率,Nest 使用的是 @nestjs/typeorm 包来完成的,因为 TypeORM 是目前 Nodejs 中最成熟的 ORM 工具。

这篇文章你会学习到:

  • 安装 & 导入模块
  • 创建实体对象
  • 查询数据
  • 多个数据库

安装 & 导入模块

我们用 Mongo 作为例子,安装老规矩:

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

创建实体对象

接下来我们需要对数据库表和对象之间做一个映射实体类:

// 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;
}

实体类需要注册到对应的模块中去,这样相关的 ControllerService 或者其它模块才能访问到。

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

〖坚持的一俢〗

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,484评论 0 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,161评论 1 32
  • 官方文档 https://docs.nestjs.com 一、概述Nest是一个用于构建高效,可扩展的Node....
    zx_lau阅读 62,448评论 0 25
  • 大萌是我养的第一只猫。她到家的那天是2015年12月20日,我记得非常清楚,因为那天晚上我和朋友还去看了周杰伦的演...
    辛夏至阅读 592评论 2 5
  • 1.Q:简单的介绍一下新闻网络部 R:新闻网络部是依附于团委的重要分支,主要负文学院校园活动的新闻采集,征文比赛...
    Ms_pingping阅读 782评论 0 0