DEV Community

dio arafi
dio arafi

Posted on

Node.js Starter Project dengan GraphQL, Redis, JWT, dan Sequelize

Template ini menyediakan Node.js Starter Project yang telah dikonfigurasi dengan GraphQL untuk API, Redis untuk caching dan penyimpanan data sementara, JWT untuk otentikasi dan otorisasi, serta Sequelize untuk ORM yang terhubung ke database relasional seperti PostgreSQL atau MySQL. Proyek ini memiliki struktur modular yang memungkinkan Anda untuk langsung mengembangkan aplikasi web modern dengan fitur-fitur yang telah terintegrasi dan dapat diskalakan.

📋 Ikhtisar Proyek

Proyek ini dirancang untuk memudahkan pengembangan aplikasi backend dengan API GraphQL yang menggunakan Redis untuk caching data dan JWT untuk mengamankan API. Sequelize digunakan sebagai ORM untuk memudahkan interaksi dengan database relasional. Selain itu, terdapat middleware yang memudahkan penanganan otentikasi, validasi, dan logging.

Fitur Utama

  • GraphQL API untuk query dan mutasi data yang lebih fleksibel dan efisien
  • JWT Authentication untuk otentikasi berbasis token yang aman
  • Redis untuk caching data dan meningkatkan performa aplikasi
  • Sequelize ORM untuk pengelolaan database relasional
  • Middleware untuk otorisasi dan penanganan request secara terpusat
  • Modular dan terstruktur dengan baik untuk skalabilitas dan pemeliharaan yang lebih mudah

🛠️ Teknologi yang Digunakan

  • Node.js: Platform untuk membangun aplikasi server-side dengan JavaScript. Pelajari lebih lanjut
  • GraphQL: Query language untuk API yang memungkinkan pengambilan data secara efisien dan fleksibel. Pelajari lebih lanjut
  • Redis: Penyimpanan data sementara (in-memory) yang sering digunakan untuk caching dan message brokering. Pelajari lebih lanjut
  • JWT: Teknologi otentikasi berbasis token yang aman dan sederhana. Pelajari lebih lanjut
  • Sequelize: ORM untuk Node.js yang mendukung PostgreSQL, MySQL, dan database relasional lainnya. Pelajari lebih lanjut

🚀 Langkah-langkah untuk Menyiapkan dan Menjalankan Proyek

1. Mengkloning Repositori

Pertama-tama, kloning repositori template ini ke mesin lokal Anda:

git clone https://gitlab.com/dioarafi1/graphify-api.git
cd graphify-api
Enter fullscreen mode Exit fullscreen mode

Jika Anda memulai dari awal, inisialisasi proyek baru dengan:

mkdir blog-api
cd blog-api
npm init -y
Enter fullscreen mode Exit fullscreen mode

2. Instalasi Dependensi

Setelah mengkloning repositori atau membuat proyek baru, jalankan perintah untuk menginstal dependensi yang diperlukan:

yarn install
Enter fullscreen mode Exit fullscreen mode

Ini akan menginstal semua dependensi yang tercantum dalam file package.json.


3. Konfigurasi Environment

Buat file .env di direktori root proyek dan tambahkan konfigurasi berikut untuk Redis, JWT, dan Database:

DATABASE_URL="postgresql://user:password@localhost:5432/mydatabase"
JWT_SECRET="your_jwt_secret_key"
REDIS_HOST="localhost"
REDIS_PORT="6379"
Enter fullscreen mode Exit fullscreen mode

Gantilah user, password, dan mydatabase sesuai dengan konfigurasi database Anda.


4. Menyiapkan Database dengan Sequelize

Jika Anda belum memiliki database yang terkonfigurasi, jalankan perintah untuk menginisialisasi Sequelize dan membuat model:

yarn sequelize init
Enter fullscreen mode Exit fullscreen mode

Ini akan membuat struktur direktori config, models, dan migrations di dalam proyek Anda. Selanjutnya, buat model yang diperlukan untuk aplikasi seperti User dan Post, serta lakukan migrasi untuk membuat tabel di database.

yarn sequelize db:migrate
Enter fullscreen mode Exit fullscreen mode

Pastikan database sudah berjalan (misalnya menggunakan PostgreSQL atau MySQL).


5. Menyiapkan Server GraphQL

Install dependensi untuk Apollo Server dan GraphQL:

yarn add apollo-server graphql
Enter fullscreen mode Exit fullscreen mode

Setelah itu, buat file konfigurasi server GraphQL, schema, dan resolvers. Anda bisa mengonfigurasi server GraphQL dengan cara berikut:

src/server.ts

import { ApolloServer } from 'apollo-server-express';
import express from 'express';
import { typeDefs, resolvers } from './graphql';
import { authenticateJWT } from './middlewares/auth';
import { sequelize } from './config/database';

const app = express();

// Gunakan middleware JWT
app.use(authenticateJWT);

// Inisialisasi Apollo Server
const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req }) => ({ user: req.user }),
});

server.applyMiddleware({ app });

const PORT = process.env.PORT || 4000;

app.listen(PORT, async () => {
  console.log(`Server running at http://localhost:${PORT}${server.graphqlPath}`);
  await sequelize.authenticate();
  console.log('Database connected');
});
Enter fullscreen mode Exit fullscreen mode

src/graphql/schema.ts

Definisikan schema GraphQL untuk query dan mutasi:

import { gql } from 'apollo-server-express';

export const typeDefs = gql`
  type User {
    id: ID!
    username: String!
  }

  type Post {
    id: ID!
    title: String!
    content: String!
    user: User!
  }

  type Query {
    posts: [Post]
    post(id: ID!): Post
    users: [User]
  }

  type Mutation {
    createPost(title: String!, content: String!): Post
    register(username: String!, password: String!): User
    login(username: String!, password: String!): String # JWT token
  }
`;
Enter fullscreen mode Exit fullscreen mode

src/graphql/resolvers.ts

Implementasikan resolvers untuk query dan mutasi:

import { Post, User } from '../models';
import jwt from 'jsonwebtoken';
import bcrypt from 'bcryptjs';

export const resolvers = {
  Query: {
    posts: () => Post.findAll(),
    post: (_, { id }) => Post.findByPk(id),
    users: () => User.findAll(),
  },
  Mutation: {
    createPost: async (_, { title, content }, { user }) => {
      if (!user) throw new Error('Authentication required');
      const post = await Post.create({ title, content, userId: user.id });
      return post;
    },
    register: async (_, { username, password }) => {
      const hashedPassword = await bcrypt.hash(password, 10);
      const user = await User.create({ username, password: hashedPassword });
      return user;
    },
    login: async (_, { username, password }) => {
      const user = await User.findOne({ where: { username } });
      if (!user) throw new Error('User not found');

      const match = await bcrypt.compare(password, user.password);
      if (!match) throw new Error('Invalid password');

      const token = jwt.sign({ userId: user.id }, process.env.JWT_SECRET!, { expiresIn: '1h' });
      return token;
    },
  },
};
Enter fullscreen mode Exit fullscreen mode

6. Menjalankan Server untuk Pengembangan

Untuk menjalankan server di lingkungan pengembangan dengan hot-reload, gunakan perintah berikut:

yarn dev
Enter fullscreen mode Exit fullscreen mode

Server akan berjalan di http://localhost:4000, dan Anda dapat mengakses GraphQL Playground untuk menguji query dan mutasi API.


📂 Struktur Direktori Proyek

Struktur direktori proyek ini dirancang untuk memisahkan berbagai bagian aplikasi agar lebih modular dan mudah dipelihara:

/myapp
├── src
│   ├── middlewares      # Berisi middleware untuk otentikasi (JWT), caching (Redis), dan validasi
│   ├── routes           # Definisi endpoint API dan resolver GraphQL
│   ├── services         # Logika bisnis utama dan pengolahan data
│   ├── app.ts           # File utama untuk inisialisasi aplikasi dan middleware
│   ├── graphql          # Menyimpan konfigurasi GraphQL, schema, dan resolvers
│   ├── models           # Model Sequelize untuk mengelola database relasional
│   ├── config           # File konfigurasi global untuk Redis, JWT, database, dll
│   ├── index.ts         # Entry point aplikasi, menginisialisasi server dan middleware
│   ├── resolvers        # Berisi resolver GraphQL untuk query dan mutasi
│   ├── server.ts        # File untuk setup Apollo Server dan konfigurasi GraphQL
│   ├── schema           # Definisi schema GraphQL
│   ├── types            # TypeScript types dan interfaces untuk GraphQL dan lainnya
│   └── utils            # Berisi helper dan fungsi utility
├──

 .env                 # File konfigurasi environment (Redis, JWT Secret, Database URL)
├── package.json         # Metadata proyek dan dependensi
└── tsconfig.json        # Konfigurasi TypeScript
Enter fullscreen mode Exit fullscreen mode

📦 Deployment

Untuk mempersiapkan proyek untuk produksi, gunakan perintah berikut untuk membangun TypeScript menjadi JavaScript:

yarn build
Enter fullscreen mode Exit fullscreen mode

Output akan berada di folder dist/ dan siap untuk di-deploy ke server produksi.

Menyiapkan untuk Platform Cloud

Proyek ini dapat di-deploy ke platform seperti Heroku, AWS, atau DigitalOcean dengan langkah-langkah berikut:

  1. Push Kode ke Repositori Git (GitHub, GitLab, atau lainnya).
  2. Atur Variabel Environment di platform cloud yang dipilih (Redis, JWT Secret, Database URL).
  3. Deploy proyek menggunakan perintah atau integrasi dari platform cloud.

📚 Sumber Daya


Dengan mengikuti langkah-langkah di atas, Anda sekarang dapat menjalankan dan mengembangkan aplikasi GraphQL API menggunakan Redis, JWT, dan Sequelize.

Top comments (0)