用 Nest.js 開發 API 吧 (八) - CRUD


Posted by AlanSyue on 2021-01-23

上篇分享到從建立 Entity、在 Module 註冊到 Service 使用 Repository,今天想分享要怎麼利用 TypeORM 做基本的 CRUD。

在 Service 建立 CRUD method

首先我們先建立 src/service/users.service.ts,並輸入以下程式碼:

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

  // 新增 User email && password
  async addUser(userData: {email: string, password: string}): Promise<Object> {
    const user = new Users();
    user.email = userData.email;
    user.password = hashSync(userData.password, 10);
    return await this.usersRepository.save(user);
  }
  // 撈出 Users 全部資料
  async getAllUser(): Promise<Object> {
    return await this.usersRepository.find();
  }
  // 透過 users.id 取得指定資料
  async getUserById(userId: number): Promise<Object> {
    return await this.usersRepository.findOne(userId);
  }
  // 更新指定 users.id 資料
  async updateUserById(userId: number, userData): Promise<Object> {
    return await this.usersRepository.update(userId, userData);
  }
  // 移除指定 users.id 資料
  async deleteUserById(userId: number): Promise<Object> {
    return await this.usersRepository.delete(userId);
  }
}

上面程式碼,我們透過 usersRepository 做 CRUD,接下來就是要從 Controller 來呼叫。

Controller 呼叫 Service

之前的文章有提到,Controller 是 request 接收與輸出的出入口,因此我們要在 Controller 新增 route 並呼叫 Service method 來做 CRUD。

我們建立 src/controller/users.controller.ts 並輸入以下程式碼:

import { 
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Param,
  Body
} from '@nestjs/common';
import { UserService } from '../service/users.service';

@Controller()
export class UserController {
  constructor(
    private readonly userService: UserService
  ) {}

  @Get('users')
  async allUsers(): Promise<Object> {
    return this.userService.getAllUser();
  }

  @Get('user/:userId')
  async user(@Param('userId') id: number): Promise<Object> {
    return this.userService.getUserById(id);
  }

  @Post('user')
  async addUser(
    @Body() userPostData,
  ): Promise<Object> {
    return this.userService.addUser(userPostData);
  }

  @Put('user/:userId')
  async updateUserById(
    @Param('userId') id: number,
    @Body() userData,
  ): Promise<Object> {
    return this.userService.updateUserById(id, userData);
  }

  @Delete('user/:userId')
  async deleteUserById(@Param('userId') id: number): Promise<Object> {
    return this.userService.deleteUserById(id);
  } 
}

我們根據 GetPostPutDelete 分別來實作 CRUD 方法,接下來我們可以打開 Postman 測試。

實際測試

首先有 2 點先說明:

  1. 範例我輸入的 url 為 http://api.dev.itseed.tw:9229/,主要是我有修改過 /etc/hostport,如果沒有做任何調整的讀者應該為 http://localhost:3000
  2. 新增 User 在存入密碼時,實際上需要加密,不能直接存入,但因為是範例,這部分就先忽略。

新增 User

我們先來測試新增 User,因為 method 需要 emailpassword,所以 post 過去也要帶這兩個值:

取得所有 User 及指定 User

接下來是取得所有 User:

取得指定 User,需要給 users.id

更新 User 資料

需要給 users.id,以及要更新欄位的值:

更新成功後,我們透過取得指定 User 確認看看:

刪除 User 資料

需要給 users.id

從取得所有 User 可以看到輸入的 users.id 資料被刪掉了。

小結

今天分享了關於如何利用 Nest.js 及 TypeORM 實作 CRUD 的 api,算是整個系列中相當重要的部分,希望對想實作的讀者有幫助,如果文章有任何錯誤或建議,歡迎告知!

NEXT:用 Nest.js 開發 API 吧 (九) - 總結

如果覺得文章對你有幫助,也可以透過贊助一杯咖啡給予我鼓勵唷


#nestjs #postgres #TypeORM #crud #API







Related Posts

[BE101] 資訊安全

[BE101] 資訊安全

運算子

運算子

巢狀救星三部曲(2) - ES6 Generator Function

巢狀救星三部曲(2) - ES6 Generator Function


Comments