This template provides a Node.js Starter Project preconfigured with GraphQL for API, Redis for caching and temporary data storage, JWT for authentication and authorization, as well as Sequelize for ORMs connected to relational databases such as PostgreSQL or MySQL. The project has a modular structure that allows you to instantly develop modern web applications with integrated and scalable features.
This project is designed to make it easier to develop backend applications with a GraphQL API that uses Redis for data caching and JWT to secure the API. Sequelize is used as an ORM to facilitate interaction with relational databases. In addition, there is middleware that makes it easier to handle authentication, validation and logging.
First of all, clone this template repository to your local machine:
git clone https://gitlab.com/dioarafi1/graphify-api.git cd graphify-api
If you are starting from scratch, initialize the new project with:
git clone https://gitlab.com/dioarafi1/graphify-api.git cd graphify-api
After cloning the repository or creating a new project, run the command to install the required dependencies:
mkdir blog-api cd blog-api npm init -y
This will install all the dependencies listed in the package.json file.
Create an .env file in the project root directory and add the following configurations for Redis, JWT, and Database:
yarn install
Change user, password, and mydatabase according to your database configuration.
If you don't have a database configured, run the command to initialize Sequelize and create the model:
DATABASE_URL="postgresql://user:password@localhost:5432/mydatabase" JWT_SECRET="your_jwt_secret_key" REDIS_HOST="localhost" REDIS_PORT="6379"
This will create a config, models, and migrations directory structure within your project. Next, create the necessary models for the application such as User and Post, and perform migrations to create tables in the database.
yarn sequelize init
Make sure the database is running (for example using PostgreSQL or MySQL).
Install dependencies for Apollo Server and GraphQL:
yarn sequelize db:migrate
After that, create a GraphQL server configuration file, schema, and resolvers. You can configure the GraphQL server in the following way:
yarn add apollo-server graphql
Define GraphQL schema for queries and mutations:
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'); });
Implement resolvers for queries and mutations:
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 } `;
To run the server in a development environment with hot-reload, use the following command:
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; }, }, };
The server will run at http://localhost:4000, and you can access the GraphQL Playground to test API queries and mutations.
This project directory structure is designed to separate the different parts of the application to make it more modular and easy to maintain:
yarn dev
To prepare the project for production, use the following command to build TypeScript into JavaScript:
/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
The output will be in the dist/ folder and ready to be deployed to the production server.
This project can be deployed to platforms such as Heroku, AWS, or DigitalOcean with the following steps:
By following the steps above, you can now run and develop GraphQL API applications using Redis, JWT, and Sequelize.
The above is the detailed content of Node.js Starter Project dengan GraphQL, Redis, JWT, dan Sequelize. For more information, please follow other related articles on the PHP Chinese website!