Cara membuat API dengan NestJS dan PostgreSQL
NestJS dan PostgreSQL adalah kombinasi yang bagus untuk membuat API.
Halo Guys, Kali ini kita akan belajar tentang NestJS. NestJS adalah salah satu framework javascript populer untuk backend. Kami akan fokus pada cara membuat API dengan NestJS.
NestJS adalah kerangka kerja untuk membangun aplikasi sisi server Node.js yang efisien dan dapat diskalakan. Di bawah tenda, Nest memanfaatkan kerangka kerja Server HTTP yang kuat seperti Express (default) dan secara opsional dapat dikonfigurasi untuk menggunakan Fastify juga!
Dokumentasinya sangat menyenangkan untuk dipahami dan diselesaikan. Klik tautan di bawah ini untuk membaca informasi lebih lanjut.
Jika Anda ingin membuat REST API, Graphql, Websockets, Microservice, dll. Anda dapat menggunakan NestJS karena semuanya siap digunakan dan cukup ikuti pola NestJs.
Pola NestJs terlihat seperti Angular 2+, Jadi, jika latar belakang Anda adalah Pengembang Frontend (Angular) dan kemudian Anda ingin memperluas keterampilan Anda untuk menjadi Pengembang Backend dengan pola Angular yang serupa, artikel ini cocok untuk Anda.
PostgreSQL adalah sistem database objek-relasional open-source yang kuat yang menggunakan dan memperluas bahasa SQL yang digabungkan dengan banyak fitur yang menyimpan dan menskalakan beban kerja data yang paling rumit dengan aman.
Tapi, saya tidak ingin berbicara banyak tentang PostgreSQL, hanya untuk pengenalan dan jika Anda ingin membaca informasi lebih lanjut, Anda dapat mengunjungi tautan di bawah ini.
Dalam hal ini, kami akan menggunakan database PostgreSQL gratis darihttps://elephantsql.com/. Jadi, pastikan Anda telah membuat akun.
Mari kita buat API dengan NestJS bersama. Pertama-tama, saya berasumsi bahwa Anda telah menginstal NodeJs dan NPM. Dalam hal ini, saya menggunakan nodejs versi 16.18.1 dan npm versi 8.19.2
Saya menyarankan Anda untuk menggunakan NVM untuk mengelola banyak versi nodejs dan dengan mudah mengubah versi nodejs.
Instalasi
Anda perlu menginstal NestJS CLI. Silakan gunakan NestJS versi 9.0.0 untuk memastikan bahwa kami memiliki versi yang sama untuk membuat API dengan NestJS untuk menghindari kesalahan yang tidak diharapkan.
npm i -g @nestjs/[email protected]
Setelah instalasi selesai. Mari mulai proyek untuk menjalankan perintah ini.
nest new nestjs-todolist
Kemudian, Anda perlu menginstal paket ini untuk utilitas membuat API dengan PostgreSQL.
npm i --save @nestjs/config @nestjs/typeorm typeorm pg
Selanjutnya pada app.module.ts kita perlu mengupdate seperti ini
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true }),
TypeOrmModule.forRoot({
type: 'postgres',
url: process.env.DATABASE_URL,
autoLoadEntities: true,
synchronize: true,
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
- TypeOrmModule adalah modul untuk mengkonfigurasi database seperti yang Anda tahu kami menggunakan Postgres. Tapi, kita bisa menggunakan jenis database lain, seperti mysql, mongo, postgres, dll.
Cukup klik tombol untuk membuat instance baru .
Setelah itu, silakan isi nama dan pilih paket gratis. Kemudian, klik tombolnya Pilih Wilayah .
Setelah itu, pilih pusat data. Secara default, ini akan memilih secara otomatis tergantung dari mana Anda berasal. Contoh: jika Anda berasal dari Eropa, maka akan dipilih di UE. Jadi, cukup klik tombol Tinjau ke langkah selanjutnya.
Jika semua informasi valid, cukup klik tombol untuk membuat instance . Tunggu sebentar. Setelah selesai tinggal klik detail database instance. Jadi, halaman detailnya terlihat seperti gambar di bawah ini
Setelah itu, salin tautan URL dari instance database Anda dan tempel di file .env dengan nama variabel DATABASE_URL .
Kita perlu memastikan koneksi antara PostgreSQL dan proyek tidak error. jalankan saja perintah ini
npm run start
Buat API
Semua konfigurasi selesai. Mari lompat ke tutorial utama, dan buat API. Kita perlu membuat modul, pengontrol, layanan, kelas, dan antarmuka.
Ah ya, saya lupa menyebutkan CLI NestJS yang kuat. Kami dapat membuat file dan melihat gambar di bawah ini.
Selanjutnya, jalankan perintah ini untuk menghasilkan modul, pengontrol, kelas, antarmuka, dan layanan.
npx nest generate module todolist && npx nest generate controller todolist/controllers/todolist && npx nest generate service todolist/services/todolist && npx nest generate interface todolist/interfaces/todolist
Command Generate NestJs
Buat entitas file untuk todolist dengan nama file todolist.entity.ts pada folder src/todolist/entitas dan tambahkan skrip ini
import {
Column,
CreateDateColumn,
Entity,
PrimaryGeneratedColumn,
UpdateDateColumn,
} from 'typeorm';
export enum StatusTodo {
TODO = 'todo',
PROGRESS = 'progress',
COMPLETED = 'completed',
}
@Entity()
export class TodolistEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column()
description: string;
@Column({ type: 'enum', default: StatusTodo.TODO, enum: StatusTodo })
status: string;
@Column({ nullable: true, type: 'bigint', default: new Date().getTime() })
due_date: number;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
}
- @PrimaryGeneratedColum adalah fungsi untuk menghasilkan id dengan auto increment sebagai primary key.
- @Kolom adalah fungsi untuk mendefinisikan bidang di atas meja
- Status todolist adalah enum StatusTodo dengan nilai default todo.
- Alasan mengapa pada due_date kami menggunakan nomor tersebut adalah untuk menangani zona waktu yang berbeda.
Setelah itu, kita perlu membuat DTO (Data Transfer Object) untuk memastikan permintaan properti dari klien tersedia di backend. Juga, untuk validasi, kita perlu menginstal library ini
npm i --save class-validator class-transformer
import { IsNotEmpty, IsNumber, IsString, Length } from "class-validator";
export class TodolistDto {
@IsNotEmpty()
@IsString()
@Length(10, 20)
title: string;
@IsNotEmpty()
@IsString()
@Length(0, 40)
description: string;
@IsString()
status: string;
@IsNumber()
@IsNotEmpty()
due_date: number;
}
- @IsString() adalah fungsi untuk memvalidasi nilai properti harus string
- @Length() adalah fungsi untuk memvalidasi nilai karakter minimum dan maksimum
- @IsNumber() adalah fungsi untuk memvalidasi nilai properti harus nomor
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
await app.listen(3000);
}
bootstrap();
export interface Todolist {
id: number;
title: string;
description: string;
status: string;
due_date: number;
createdAt: Date;
updatedAt: Date;
}
Setelah itu, buka file todolist.module.ts dan import typeorm dengan fitur dari entitas todolist.
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TodolistController } from './controllers/todolist/todolist.controller';
import { TodolistEntity } from './entities/todolist.entity';
import { TodolistService } from './services/todolist/todolist.service';
@Module({
imports: [TypeOrmModule.forFeature([TodolistEntity])],
controllers: [TodolistController],
providers: [TodolistService]
})
export class TodolistModule {}
npm run start
Mari kembali ke IDE untuk membuat API. Buka file todolist.controller.ts. Fungsi pengontrol di NestJS adalah untuk menangani permintaan dari pengguna, merespons pengguna, dan menentukan rute API.
import {
Body,
Controller,
Delete,
Get,
Param,
ParseIntPipe,
Post,
Put,
} from '@nestjs/common';
import { TodolistDto } from 'src/todolist/dtos/todolist.dto';
import { TodolistService } from 'src/todolist/services/todolist/todolist.service';
@Controller('todolist')
export class TodolistController {
constructor(private readonly todolistService: TodolistService) {}
@Get()
findAll() {
return this.todolistService.findAll();
}
@Get(':id')
findOne(@Param('id', ParseIntPipe) id: number) {
return this.todolistService.findOne(id);
}
@Post()
create(@Body() todolistDto: TodolistDto) {
return this.todolistService.create(todolistDto);
}
@Put(':id')
update(
@Param('id', ParseIntPipe) id: number,
@Body() todolistDto: TodolistDto,
) {
return this.todolistService.update(id, todolistDto);
}
@Delete(':id')
delete(@Param('id', ParseIntPipe) id: number) {
return this.todolistService.delete(id);
}
}
- Kita perlu menyuntikkan layanan todolist dependensi untuk mengelola data dari nestjs ke database dengan typeorm.
- @Param() adalah fungsi untuk menangkap parameter jalur pada API rute. contoh: /todolist/:id
- @Body() adalah fungsi untuk mendapatkan semua permintaan bidang dari klien oleh DTO
- @GET(), @POST() , @PUT(), @DELETE() adalah metode di HTTP
- ParseIntPipe adalah fungsi untuk mengubah id atau param menjadi angka.
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { TodolistDto } from 'src/todolist/dtos/todolist.dto';
import { TodolistEntity } from 'src/todolist/entities/todolist.entity';
import { Todolist } from 'src/todolist/interfaces/todolist/todolist.interface';
import { Repository } from 'typeorm';
@Injectable()
export class TodolistService {
constructor(
@InjectRepository(TodolistEntity)
private todolistRepository: Repository<TodolistEntity>,
) {}
async delete(id: number) {
const todolist: Todolist = await this.todolistRepository.findOneBy({ id });
if (!todolist) {
throw new HttpException(
`Todolist with id=${id} not found!`,
HttpStatus.BAD_REQUEST,
);
}
return this.todolistRepository.delete(id);
}
async update(id: number, todolistDto: TodolistDto) {
const todolist: Todolist = await this.todolistRepository.findOneBy({ id });
if (!todolist) {
throw new HttpException(
`Todolist with id=${id} not found!`,
HttpStatus.BAD_REQUEST,
);
}
return this.todolistRepository.update(id, todolistDto);
}
async findOne(id: number) {
const todolist: Todolist = await this.todolistRepository.findOneBy({ id });
if (!todolist) {
throw new HttpException(
`Todolist with id=${id} not found!`,
HttpStatus.BAD_REQUEST,
);
}
return todolist;
}
async findAll() {
return await this.todolistRepository.find();
}
async create(todolistDto: TodolistDto) {
const newTodolist = await this.todolistRepository.create({
...todolistDto,
});
const saveTodolist = await this.todolistRepository.save(newTodolist);
if (!saveTodolist) {
throw new HttpException(`Create todolist failed`, HttpStatus.BAD_REQUEST);
}
return saveTodolist;
}
}
- Dalam hal ini, kami menggunakan async await, artinya Janji, tetapi jika Anda ingin Dapat Diamati tentu saja dimungkinkan, Anda hanya perlu mengubahnya menjadi dapat diamati.
- this.todolistRepository adalah fungsi instance dari typeorm dengan banyak metode untuk mengelola data pada database, seperti find, findOneBy, create, save, update, dan delete.
- HttpException adalah fungsi dari nestjs untuk membuang data ketika data tidak ditemukan atau mendapatkan beberapa kesalahan.
- HttpStatus adalah fungsi untuk mendefinisikan semua kode status HTTP seperti 200, 300, 400, dan 500.
- Todolist pada tipe const todolist adalah untuk mendeklarasikan semua properti dari respons.
Pengujian API
Untuk pengujian API, Kita bisa menggunakan Postman. Sebelum pengujian, pastikan proyek nestjs sudah berjalan. Anda dapat menggunakan perintah ini untuk membangun kembali secara otomatis ketika ada perubahan dari proyek.
npm run start:dev
- DAPAT SEMUA
- DAPATKAN SATU
- MEMPERBARUI
- MENGHAPUS
- Validasi
- Periksa Dari ElephantSQL
Tantangan
Untuk latihan saja, Anda bisa mencoba membuat API untuk mengupdate status todolist progres, seperti todo, progres, dan selesai. Tetap Semangat!
Penutupan
Semoga artikel ini bermanfaat dan meningkatkan keterampilan Anda. Tentu saja, saya masih belajar seperti yang Anda ketahui, karena ketika kita menjadi pembelajar seumur hidup, kita akan tahu bahwa dunia ini sangat luas. Jika Anda ingin menghubungi saya, jangan ragu untuk menghubungi saya di [email protected] Terima kasih.
Referensi
#nestjs #postgresql #backend #tutorial #restapi

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































