iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 17
0
Modern Web

Nest.js framework 30天初探系列 第 17

Nestjs framework 30天初探:Day17 SQL (Sequelize) PART 2

  • 分享至 

  • xImage
  •  

SQL (Sequelize) SELECT 部分

  1. 先附上SQL script,準備一下資料表和資料。
USE [IronManNest]
GO
/****** Object:  Table [dbo].[Users]    Script Date: 2017/12/20 下午 10:49:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Users](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Name] [nvarchar](50) NULL,
	[Age] [int] NULL,
 CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Users] ON 

INSERT [dbo].[Users] ([ID], [Name], [Age]) VALUES (1, N'Michael', 26)
INSERT [dbo].[Users] ([ID], [Name], [Age]) VALUES (2, N'Mary', 16)
INSERT [dbo].[Users] ([ID], [Name], [Age]) VALUES (3, N'Mary', 30)
SET IDENTITY_INSERT [dbo].[Users] OFF

  1. 請先註解掉IUsersService裡的create()、update()、delete()。
'use strict';

import { Users } from '../users.entity';
import { IUsers } from './IUsers';

export interface IUsersService {
    findAll(): Promise<Array<Users>>;
    findById(ID: number): Promise<Users | null>;
    findOne(options: Object): Promise<Users | null>;
    //今天先完成Select部分,所以註解以下方法。
    /*create(users: IUsers): Promise<Users>;
    update(ID: number, newValue: IUsers): Promise<Users | null>;
    delete(ID: number): Promise<number>;*/
}
  1. 在Users資料夾底下新增users.service.ts。
    src/app/Users/users.service.ts


import { Component, Inject } from '@nestjs/common';
import { Users } from './users.entity';
import { Model } from 'sequelize-typescript';
import { IUsers, IUsersService } from './interfaces/index';

@Component()
export class UsersServices implements IUsersService {
    constructor(
        @Inject('UsersRepository') private readonly usersRepository: typeof Users) { }

    public async findAll():Promise<Array<Users>>{
        return await this.usersRepository.findAll<Users>();
    }

    //findOne()可以加入各種option,以下示範常見的where
    //注意findOne() 找到一筆就會立即return data,不會繼續往下找。
    public async findOne(options: Object): Promise<Users | null> {
        return await this.usersRepository.findOne<Users>(options);
    }

    //restful API很常用。
    public async findById(id: number): Promise<Users | null> {
        return await this.usersRepository.findById<Users>(id);
    }
}
  1. 在modules資料夾底下新增users.controller.ts
    src/app/Users/modules/users.controller.ts
'use strict';

import { Controller, Get, Response, HttpStatus, Param, Body } from '@nestjs/common';
import { UsersServices } from '../users.service';

@Controller()
export class UsersController {

    constructor(private readonly usersServices: UsersServices) { }

    @Get('users')
    public async getUsers( @Response() res) {
        const users = await this.usersServices.findAll();
        return res.status(HttpStatus.OK).json(users);
    }

    @Get('users/find')
    public async findUser( @Response() res) {
        //給定where條件
        let queryCondition = { where: { Name: 'Mary' } };
        const users = await this.usersServices.findOne(queryCondition);
        return res.status(HttpStatus.OK).json(users);
    }

    @Get('users/:id')
    public async getUser( @Response() res, @Param() param) {
        
        const users = await this.usersServices.findById(param.id);
        return res.status(HttpStatus.OK).json(users);
    }
}
  1. UsersModule import 一下UsersController、UsersServices。
    src/app/Users/modules/users.module.ts
'use strict';

import { Module } from '@nestjs/common';
import { UsersServices } from '../users.service';
import { UsersProvider } from '../users.providers';
import { DatabaseModule } from '../../database.module';
import { UsersController } from './users.controller';

@Module({
    modules: [DatabaseModule],
    controllers: [UsersController],
    components: [
        UsersServices,
        UsersProvider
    ]
})
export class UsersModule { }
  1. 打開Postman,對http://localhost:3000/users 做Get請求。
    https://ithelp.ithome.com.tw/upload/images/20171220/20107195oqb81wDr4Y.png
  2. 打開Postman,對http://localhost:3000/users/find 做Get請求。
    https://ithelp.ithome.com.tw/upload/images/20171220/20107195Z0emda7GFs.png
    https://ithelp.ithome.com.tw/upload/images/20171220/20107195gOy2GSwRBe.png

要注意一下findOne()這方法,只要找到一筆資料就會立即回傳,不會繼續往下找,所以我where Name = Mary 是不會傳兩筆資料的。

  1. 打開Postman,對http://localhost:3000/users/3 做Get請求。
    https://ithelp.ithome.com.tw/upload/images/20171220/20107195RtJrkN1z0Y.png

以上簡單的SELECT 情境已經實現,明天再完成create、update、delete。

程式碼都在github


上一篇
Nestjs framework 30天初探:Day16 SQL (Sequelize) PART 1
下一篇
Nestjs framework 30天初探:Day18 SQL (Sequelize) 完結
系列文
Nest.js framework 30天初探30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言