本記事では、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('Users is already'));
        }
        await this.repo.insert({ ...data });
        return;
    }
    /** 更新 */
    async update( data : Partial<Users> ) {
        if( ! ( await this.repo.findOne( data.id ) ) ) {
            return Promise.reject(new Error('Users Not Found' ) );
        }
        await this.repo.update( data.id, data );
        return;
    }
}
Controllerの設定
users.controller.ts
import { Body, Controller, Post, Put } from '@nestjs/common';
import { Users } from './users';
import { UsersService } from './users.service';
@Controller('users')
export class UserController {
    constructor(
        private svc : UsersService
    ) {}
    @Post( 'find' )
    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;
    }
}
 
 

コメント