يوفر هذا القالب مشروع Node.js Starter الذي تم تكوينه باستخدام GraphQL لـ API، Redis لـ التخزين المؤقت وتخزين البيانات المؤقتة، JWT للمصادقة والترخيص، وSequelize لـ ORM التي تتصل بقاعدة بيانات علائقية مثل PostgreSQL أو MySQL. يحتوي المشروع على هيكل معياري يسمح لك بالتطوير الفوري لتطبيقات الويب الحديثة بميزات متكاملة وقابلة للتطوير.
تم تصميم هذا المشروع لتسهيل تطوير تطبيقات الواجهة الخلفية باستخدام واجهة برمجة التطبيقات GraphQL التي تستخدم Redis للتخزين المؤقت للبيانات وJWT لتأمين واجهة برمجة التطبيقات. 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_URL="postgresql://user:password@localhost:5432/mydatabase" JWT_SECRET="your_jwt_secret_key" REDIS_HOST="localhost" REDIS_PORT="6379"
قم بتغيير المستخدم وكلمة المرور وقاعدة البيانات الخاصة بي وفقًا لتكوين قاعدة البيانات الخاصة بك.
إذا لم يكن لديك قاعدة بيانات مكونة، قم بتشغيل الأمر لتهيئة Sequelize وإنشاء النموذج:
yarn sequelize init
سيؤدي هذا إلى إنشاء بنية دليل التكوين والنماذج والترحيلات داخل مشروعك. بعد ذلك، قم بإنشاء النماذج اللازمة للتطبيق مثل User وPost، وقم بإجراء عمليات الترحيل لإنشاء الجداول في قاعدة البيانات.
yarn sequelize db:migrate
تأكد من تشغيل قاعدة البيانات (على سبيل المثال باستخدام PostgreSQL أو MySQL).
تثبيت التبعيات لخادم Apollo و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; }, }, };
لتشغيل الخادم في بيئة تطوير باستخدام التحديث السريع، استخدم الأمر التالي:
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 من خلال الخطوات التالية:
باتباع الخطوات المذكورة أعلاه، يمكنك الآن تشغيل وتطوير تطبيقات GraphQL API باستخدام Redis، JWT، وSequelize.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3