【プログラミング】NestJSとTypeORM(Postgres)で爆速API開発

プログラミング
スポンサーリンク

本記事では、NestJSをとTypeORMのインストール、および設定を行い
コマンドを使ったUsersAPIを作成、及び設定方法を記載する。

NestJSインストール

$ npm install -g @nestjs/cli

プロジェクトの作成

$ nest new [アプリ名]

TypeORM(Postgres)

ライブラリのインストール

$ npm install @nestjs/typeorm typeorm pg

設定

app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';  // 追加

import { User } from './user/user';
import { UserModule } from './user/user.module';
import { UserController } from './user/user.controller';
import { UserService } from './user/user.service';

@Module({
  imports: [
    /** ここから */
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: 'localhost',
      port: 5432,
      username: 'postgres',
      password: 'postgres',
      database: 'smash_report',
      entities: [ Users ],         // 追加
      synchronize: true,
    }),
    /** ここまで */
    UserModule
  ],
  controllers: [ AppController, UserController ],
  providers: [ AppService, UserService ],
})
export class AppModule {}

CORS対応

main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  /** ここから  */
  const app = await NestFactory.create(AppModule, {
    logger : [ 'error', 'warn' , 'debug', 'log' ]
  });
  app.enableCors({
    origin: "*",
    allowedHeaders: 'Origin, X-Requested-With, Content-Type, Accept'
  });
  /** ここまで  */
  await app.listen(3000);
}
bootstrap();

APIの追加

ファイルの作成

$ nest g controller users
$ nest g service users
$ nest g module users
$ nest g class users/users

Entityの作成

users.ts

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

@Entity( )
export class Users {
    @PrimaryGeneratedColumn( )
    id : string;

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

Moduleの設定

users.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Users } from './users';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';

@Module({
      'imports' : [ TypeOrmModule.forFeature( [ Users ] ) ]
    , 'exports' : [ TypeOrmModule ]
    , 'providers' : [ UsersService ]
    , 'controllers' : [ UsersController ]
})
export class UserModule {}

Serviceの設定

users.service.ts

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Users } from './users';

@Injectable()
export class UserService {

    constructor(
        @InjectRepository( Users )
        private readonly repo : Repository<User>
    ) {

    }

    /** 検索 id */
    async findById( id : string ) {
        const users : Users = await this.repo.findOne( id );
        return users;
    }

    /** 作成 */
    async create( data : Partial<Users> ) {
        if( await this.repo.findOne( data.id ) ) {
            return Promise.reject(new Error(&#039;Users is already&#039;));
        }
        await this.repo.insert({ ...data });
        return;
    }

    /** 更新 */
    async update( data : Partial<Users> ) {
        if( ! ( await this.repo.findOne( data.id ) ) ) {
            return Promise.reject(new Error(&#039;Users Not Found&#039; ) );
        }
        await this.repo.update( data.id, data );
        return;
    }
}

Controllerの設定

users.controller.ts

import { Body, Controller, Post, Put } from &#039;@nestjs/common&#039;;
import { Users } from &#039;./users&#039;;
import { UsersService } from &#039;./users.service&#039;;

@Controller(&#039;users&#039;)
export class UserController {

    constructor(
        private svc : UsersService
    ) {}

    @Post( &#039;find&#039; )
    async findById(@Body() data : Partial<Users> ) {
        let users;
        try {
            user = await this.svc.findById( data.id );

        } catch( e ) {
            throw e;
        }
        return users;
    }

    @Post( )
    async create(@Body( ) data : Partial<Users> ) {
        try {
            await this.svc.create( data );
        } catch( e ) {
            throw e;
        }
        return;
    }

    @Put( )
    async update(@Body( ) data : Partial<Users> ) {
        try {
            await this.svc.update( data );
        } catch( e ) {
            throw e;
        }
        return;
    }

}

コメント

タイトルとURLをコピーしました