此模板提供了一个 Node.js 入门项目,已配置 GraphQL 用于 API,Redis 用于缓存和临时数据存储,JWT 用于身份验证和授权,Sequelize 用于 ORM连接到关系数据库,例如 PostgreSQL 或 MySQL。该项目具有模块化结构,可让您立即开发具有集成和可扩展功能的现代 Web 应用程序。
该项目旨在让使用 GraphQL API 更轻松地开发后端应用程序,该 API 使用 Redis 进行数据缓存,并使用 JWT 来保护 API。 Sequelize 用作 ORM 来促进与关系数据库的交互。此外,还有中间件可以更轻松地处理身份验证、验证和日志记录。
首先,将此模板存储库克隆到本地计算机:
git clone https://gitlab.com/dioarafi1/graphify-api.git cd graphify-api
如果您从头开始,请使用以下命令初始化一个新项目:
mkdir blog-api cd blog-api npm init -y
克隆存储库或创建新项目后,运行命令安装所需的依赖项:
yarn install
这将安装 package.json 文件中列出的所有依赖项。
在项目根目录下创建.env文件,为Redis、JWT、Database添加如下配置:
DATABASE_URL="postgresql://user:password@localhost:5432/mydatabase" JWT_SECRET="your_jwt_secret_key" REDIS_HOST="localhost" REDIS_PORT="6379"
根据您的数据库配置更改用户、密码和 mydatabase。
如果没有配置数据库,请运行命令初始化Sequelize并创建模型:
yarn sequelize init
这将在您的项目中创建配置、模型和迁移目录结构。接下来,为应用程序创建必要的模型,例如 User 和 Post,并执行迁移以在数据库中创建表。
yarn sequelize db:migrate
确保数据库正在运行(例如使用 PostgreSQL 或 MySQL)。
安装 Apollo Server 和 GraphQL 的依赖项:
yarn add apollo-server graphql
之后,创建 GraphQL 服务器配置文件、架构和解析器。您可以通过以下方式配置 GraphQL 服务器:
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'); });
定义查询和突变的 GraphQL 架构:
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 } `;
为查询和突变实现解析器:
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; }, }, };
要使用hot-reload在开发环境中运行服务器,请使用以下命令:
yarn dev
服务器将在http://localhost:4000运行,您可以访问GraphQL Playground来测试API查询和突变。
此项目目录结构旨在分隔应用程序的不同部分,使其更加模块化且易于维护:
/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
要准备生产项目,请使用以下命令将 TypeScript 构建为 JavaScript:
yarn build
输出将位于 dist/ 文件夹中并准备好部署到生产服务器。
此项目可以部署到 Heroku、AWS 或 DigitalOcean 等平台,步骤如下:
按照上述步骤,您现在可以使用 Redis、JWT 和 Sequelize 运行和开发 GraphQL API 应用程序。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3