本記事では、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;
}
}
コメント