用 Nest.js 開發 API 吧 (七) — Entity

Alan Syue
6 min readJan 16, 2021

Nest.js 官方網站

上回有分享到用 TypeORM 連線到 Postgresql,因為 TypeORM 支援 Repository Design Pattern,每張 table 都會對應到一個 interface。

而在使用 TypeORM 連線資料庫,基本上會有三個步驟:

一、建立 Entity 檔案

首先第一步是為要新建的資料庫 table,新增一個 Entity 的檔案,像是上篇,我要建立跟使用者相關的 table,就建了 users.entity.ts 的檔案。檔案裡面會是所需資料的 interface。

我們需要先引入 typeorm:

import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";

定義 Entity 及 interface:

@Entity('users')
export class Users {
}

接下來要定義欄位型態、資料型態,以下介紹五個目前我有使用到的:

  1. 主鍵(primary key)
@PrimaryGeneratedColumn()  id: number;

2. varchart 欄位

@Column({ 
type: 'varchar',
length: 255,
})
email: string;

3. boolean

@Column({
default: false,
})
is_verify: boolean;

4. timestamp (create, update)

@Column({ 
type: 'timestamp',
default: () => 'CURRENT_TIMESTAMP(6)'
})
created_at: Date;
@Column({
type: 'timestamp',
default: () => 'CURRENT_TIMESTAMP(6)',
onUpdate: 'CURRENT_TIMESTAMP(6)'
})
updated_at: Date;

5. enum

import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";export enum gender {
male = "male",
female = "female",
other = "other"
}
@Entity('profiles')
export class Profiles {
@PrimaryGeneratedColumn()
id: number;
@Column({
type: "enum",
enum: education,
default: education.bachelor
})
}

二、在 Module 註冊 Entity

上篇提到在 src/app.module.ts 去引入 TypeOrmModule,並使用 TypeOrmModule.forRoot() 去抓取 ormconfig.json 設定,由於 ormconfig.json 中會去讀取所有 Entity 資料夾,就會同時註冊所有 Entity。

另外也可以在 Module 中單獨註冊某個 Entity,舉例來說,我可以在 auth.module.ts 單獨註冊 users.entity,如以下範例:

路徑: src/module/auth.module.ts

import { Users } from '../entity/users.entity';@Module({
imports: [
TypeOrmModule.forFeature([Users])
],
})

三、在 Service 使用 Repository

接著就是在 Service 去使用 Repository,我們用上篇的 users.entity.ts 當例子:

import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";@Entity('users')
export class Users {
@PrimaryGeneratedColumn()
id: number;
@Column({
type: 'varchar',
length: 255,
})
email: string;
@Column({
type: 'varchar',
length: 255,
})
password: string;
@Column({
type: 'varchar',
length: 255,
default: null
})
token: string;
@Column({
default: false,
})
is_verify: boolean;
@Column({
type: 'timestamp',
default: () => 'CURRENT_TIMESTAMP(6)'
})
created_at: Date;
@Column({
type: 'timestamp',
default: () => 'CURRENT_TIMESTAMP(6)',
onUpdate: 'CURRENT_TIMESTAMP(6)'
})
updated_at: Date;
}

以下範例程式碼會在 users.service.ts 去注入 usersRepository,並從中去取得 email 欄位相等於 XXX@alansyue.com 的資料:

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Users } from '../entity/users.entity';
import { UserDTO } from '../DTO/users/user.dto';
@Injectable()
export class UserService {
constructor(
// 注入 Users Entity
@InjectRepository(Users)
private readonly usersRepository: Repository<Users>,
) {}
async getUserByEmail(email: string): Promise<UserDTO> {
// 取出一筆 email 為 XXX@alansyue.com 的資料
return await this.usersRepository.findOne({
where: {
email: "XXX@alansyue.com"
}
})
}
}

小結

今天將上次較少著墨 Entity 的細節再補上,這次有提到在 Service 使用 Repository,會在下篇做 CRUD 時再多做說明,如果文章有任何錯誤或建議,歡迎告知!

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Alan Syue
Alan Syue

Written by Alan Syue

Backend Engineer at UPN | Love to share everything

No responses yet

Write a response