4日目js-データモデルとPost,Body(John Ahn)の学習


Nestjs


この授業は「johnahn」の授業内容を整理する
https://www.youtube.com/watch?v=3JminDpCJNE
では、投稿の作成、削除、変更のCRUD作業を開始します.
DBに直接バインドするよりも、ローカルメモリに入れて処理します.

1.すべてのBoards情報を読み込む


クライアントからリクエストを送信すると、コントローラに移動し、適切なリクエストパスにルーティングし、対応するプロセッサに送信します.その後、サービスにアクセスして要求を処理し、サービスは要求に合致する論理を処理し、戻り値をControllに送信し、結果値をコントロールからクライアントに送信します.
したがって、コントローラは、要求を処理し、結果値を返す役割を果たす.
今からサービスを作りましょう.
import { Injectable } from '@nestjs/common';

@Injectable()
export class BoardsService {
    private boards = [];

    getAllBoards() {
        return this.boards;
    }
}
以前に作成したBoardServiceに作成するBoardsを含むリストを用意し、すべてのBoards情報をロードする方法をgetAllBoards()として定義し、Boardsリスト全体を返す値を与えます.
コントローラの処理部に入りましょう.
@Controller('boards')
export class BoardsController {

    constructor(private boardService : BoardsService){}

    @Get()
    getAllBoard(){
        return this.boardService.getAllBoards();
    }
}
コントローラは、@Get()デコーダを介して/boards urlのパスにすべてのボードリスト情報を返す.boardServiceBoardControllerクラスとして登録されているので、this.boardServiceを介してアクセスし、上記で定義したすべてのボードを呼び出して返す方法getAllBoards()を使用することができる.
サーバーを起動し、nestjs appがあるフォルダに次のコマンドを入力します.
nest run start:dev
サーバーが起動します.
http://localhost:3000/boards
urlに入ると、次の画面が表示されます.

私たちが望むように、論理が処理されたことを確認することができます.

2.Boardモデルの定義


投稿にはid、description、number、dayなどのステータス値が含まれます.これには、これらのものを保存し、簡単に処理するためのモデルが必要です.つまり、モデルファイルが必要です.
src/boardモジュール内にboard.model.tsを作成
モデルはcliを使用せずに直接作成できます.
作成した場合は、インタフェースまたはclassのいずれかでモデルを定義します.
両者の違いは以下の通りです.
interface : 변수의 타입만을 체크한다.  
class : 변수의 타입도 체크하고, 인스턴스 또한 생성이 가능하다.  
boardの構造のみを定義するために,インタフェースを使用することにした.
export interface Board {
    id: string;
    title: string;
    description: string;
    status: ;
}
statusは、投稿が公開されているか非公開のかを配布するために使用されます.そのため、PUBLICPRIVATEかを配布する必要があります.可読性のためにenumを使いましょう.
export interface Board {
    id: string;
    title: string;
    description: string;
    status: BoardStatus;
}

export enum BoardStatus {
    PUBLIC = "PUBLIC",
    PRIVATE = "PRIVATE"
}
次のように変更します.
参照として、インタフェースは;で終わる特徴を有し、enumは,で終わる特徴を有する.cまたはjavaを用いてenumを学習した場合、,に類似した特徴を用いることが考えられる.
では、作成したモデルを使用しましょう.
BoardServiceに行きましょう
@Injectable()
export class BoardsService {
    private boards : Board[] = [];

    getAllBoards() : Board[] {
        return this.boards;
    }
}
以前はBoardタイプはありませんでしたが、今はBoardインタフェースタイプがあるので使えばいいです.
コントローラもそうです.
@Get()
getAllBoard() : Board[] {
    return this.boardService.getAllBoards();
}
以前に作成したコントローラのgetalBoard()関数にも書くことができます.
このようにタイプを決定すると、必要なタイプと異なるタイプのコードを使用するとエラーが発生し、読み取りが改善されます.また、開発の過程でタイプを知ることができるので、システムが複雑であればあるほど、開発効率が高くなります.

3.ボードの作成


上からすべてのboardをインポートするように、boardを作成してサービスでソフトウェアロジックを処理し、controllerがurlに送信されたときにサービスを呼び出すこともできます.
サービス->組織者になる.
boardのデータを入れる前にidはどのように処理しますか?
データベースを使用すると自動的にデータベースがインストールされ、メモリデータの処理時にidを入れる必要がある場合はuuidパッケージが使用されます.
npm install uuid --save
適切なコマンドを入力すると、パッケージがインストールされます.
次に、サービスセクションに移動し、uuidを使用して投稿を生成するcreateBoardメソッドを作成します.
import { Injectable } from '@nestjs/common';
import { Board, BoardStatus } from './boards.model';
import {v1 as uuid } from 'uuid'

@Injectable()
export class BoardsService {
    private boards : Board[] = [];

    getAllBoards() : Board[] {
        return this.boards;
    }

    createBoard(title: string, description: string ){
        const board : Board = {
            title,
            description,
            id : uuid(),
            status : BoardStatus.PUBLIC,
        }
        this.boards.push(board);
        return board;
    }
}
createBoardメソッドを作成し、boardの内容を入力します.
コントロールからサービスをロードできるようになりました.サーバのステータス(データの変更または削除または作成)の場合は、Postを使用します.
このため、コントローラでメソッドを定義するには、次のようにします.
js構文の1つを使用してオブジェクトを作成する場合、キーを付けずにvalueのみを追加すると、value名に基づいてkeyが自動的に生成されることに注意してください.したがって,titleとdescriptionを加えるだけでよい.
@Post()
createBoard(){
    
}

Nestjsからユーザーからの情報を取得する方法


ただし,ユーザから情報を取得する必要がある.
すなわち、expressは、bodyParserモジュールを使用し、req.bodyの方法で使用される投稿の説明などを得る必要がある.
Nestjsでは、処理方法のパラメータの前に@Body()データレコーダを使用すればよい.これにより、すべてのrequestからの値を取得することができ、1つずつ取得するには、@Body('title')または@Body('description')のような特定の値しか得られない.
@Post()
createBoard(@Body() body){
    console.log(body)
}
すべてのBodyをインポートできますが、titleとdescriptionをインポートするだけです.
@Post()
    createBoard(@Body('title') title : string, @Body('description') description : string) : Board {
        return this.boardService.createBoard(title, description);  
    }
今サーバーを開けてpostmanでテストします.

urlを設定して、リクエストを送信するときにrawに設定してjson形式で送信することもできます.
これにより、正常な応答が確認されます.