برنامه نویسی

نحوه ساخت API GraphQL از ابتدا در Node.js

مقدمه

GraphQL با ارائه روشی انعطاف پذیر و کارآمد برای پرس و جو از داده ها ، توسعه API را متحول کرده است. بر خلاف API های REST ، جایی که شما اغلب داده های غیر ضروری را واگذار می کنید یا درخواست های مختلفی را انجام می دهید ، GraphQL به مشتریان اجازه می دهد تا دقیقاً آنچه را که لازم دارند در یک درخواست واحد درخواست کنند.

در این آموزش ، ما یک API GraphQL را از ابتدا با استفاده از Node.js و Apollo Server می سازیم. API ما با کاربران و پست ها اداره می شود و نمونه ای ساختاری از نمایش داده ها و جهش ها را ارائه می دهد.

آنچه ما یاد خواهیم گرفت

  • تنظیم سرور Node.js GraphQL با سرور آپولو
  • تعریف یک طرح GraphQL (انواع ، نمایش داده شد و جهش)
  • ایجاد حل کننده برای رسیدگی به درخواست ها
  • اتصال به MongoDB با استفاده از Mongoose
  • اجرای احراز هویت JWT

آپولو چیست و چرا ما در اینجا از آن استفاده می کنیم؟ آپولو یک سرور محبوب GraphQL و کتابخانه مشتری است. ما از سرور Apollo در Node.js استفاده می کنیم تا نمایش داده شدگان ، جهش ها و اشتراک ها را به طور کارآمد انجام دهیم و ویژگی هایی مانند دوخت طرحواره ، ذخیره سازی و ادغام میان افزار را ارائه می دهیم.

بیایید شروع کنیم! 🚀

1⃣ تنظیم پروژه

node.js را نصب کنید و پروژه را آغاز کنید
اطمینان حاصل کنید که node.js نصب کرده اید. سپس ، یک پروژه جدید ایجاد کنید:

mkdir graphql-blog-api && cd graphql-blog-api
npm init -y
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

وابستگی های مورد نیاز را نصب کنید
ما از Apollo Server (برای GraphQL) ، Express (برای رسیدگی به درخواست ها) و Mongoose (برای MongoDB) استفاده خواهیم کرد.

npm install express apollo-server-express graphql mongoose jsonwebtoken bcryptjs dotenv cors
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

چرا ما JsonWebtoken ، Bcryptjs و Cors را نصب می کنیم؟
JsonWebtoken – برای تأیید اعتبار از طریق نشانه های JWT استفاده می شود.
BCRYPTJS – برای هشدار ایمن و مقایسه رمزهای عبور استفاده می شود.
CORS-به اشتراک گذاری منابع متقاطع (CORS) امکان پذیر می شود و به API امکان دسترسی از حوزه های مختلف می دهد.

برای توسعه ، Nodemon را نصب کنید:

npm install --save-dev nodemon
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

بسته بندی را به روز کنید تا بارگیری خودکار را فعال کنید:

"scripts": {
 "dev": "nodemon index.js"
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

2 ⃣ تعریف طرح GraphQL

GraphQL برای تعریف انواع و نمایش داده ها به یک طرح متکی است. بیایید یک پرونده schema.js ایجاد کنیم:

const { gql } = require("apollo-server-express");
// type defines a GraphQL object structure, and typedefs (short for type definitions) collectively define the GraphQL schema, including queries and mutations.
const typeDefs = gql`
    type User {
        id: ID!
        name: String!
        email: String!
        password: String!
    }
    type Post {
        id: ID!
        title: String!
        content: String!
        authorId: ID!
        author: User
    }
    type Query {
        users: [User]
        posts: [Post]
    }
    type Mutation {
        register(name: String!, email: String!, password: String!): User
        login(email: String!, password: String!): String
        createPost(title: String!, content: String!): Post
    }
`;
module.exports = typeDefs;
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

GQL چیست؟
GQL (TAG GraphQL) یک الگوی تحت اللفظی از آپولو است که تعاریف طرحواره GraphQL را در یک AST (درخت نحوی انتزاعی) تجزیه می کند.
چه می کند! میانگین در انواع؟
! یک قسمت غیر قابل تهی را نشان می دهد ، به این معنی که این زمینه باید دارای یک مقدار باشد و نمی تواند تهی باشد.

3 ⃣ تنظیم حل کننده ها

حل کننده ها نحوه پاسخ GraphQL به نمایش داده ها و جهش ها را تعریف می کنند. ایجاد Resolvers.js:

const bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");
const User = require("../models/User");
const Post = require("../models/Post");

const resolvers = {
  Query: {
    users: async () => await User.find(),
    posts: async () => await Post.find().populate("author"),
  },

  Mutation: {
    register: async (_, { name, email, password }) => {
      const hashedPassword = await bcrypt.hash(password, 10);
      return await User.create({ name, email, password: hashedPassword });
    },

    login: async (_, { email, password }) => {
      const user = await User.findOne({ email });
      if (!user || !(await bcrypt.compare(password, user.password))) {
        throw new Error("Invalid credentials");
      }
      return jwt.sign({ ...user.toObject() }, process.env.JWT_SECRET, { expiresIn: "1h" });
    },
    createPost: async (_, { title, content }, { user }) => {
      if (!user) throw new Error("Authentication required");
      const post = Post({ title, content, authorId: user._id });
      await post.save();
      return await Post.findById(post._id).populate('author');
    },
  },
};
module.exports = resolvers;
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

4⃣ اتصال به MongoDB

ایجاد a .env پرونده برای ذخیره MongoDB URI:

MONGO_URI=mongodb://localhost:27017/graphql_blog
JWT_SECRET="secretKey"
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اکنون ، مدل ها/user.js ایجاد کنید:

const mongoose = require("mongoose");
const userSchema = new mongoose.Schema({
    name: String,
    email: String,
    password: String,
});
module.exports = mongoose.model("User", userSchema);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

و مدل ها/post.js:

const mongoose = require("mongoose");
const postSchema = new mongoose.Schema({
    title: String,
    content: String,
    authorId: { type: mongoose.Schema.Types.ObjectId, ref: "User" },
});

postSchema.virtual('author', {
    localField: 'authorId',
    foreignField: '_id',
    ref: 'User',
    justOne: true
})

module.exports = mongoose.model("Post", postSchema);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

5 در حال اجرا و آزمایش API

ایجاد index.js برای تنظیم سرور آپولو:

const express = require('express');
require('dotenv').config();
const { ApolloServer } = require('apollo-server-express');
const mongoose = require('mongoose');
const typeDefs = require("./src/graphql/schema");
const resolvers = require("./src/graphql/resolvers");

const app = express();

mongoose.connect(process.env.MONGO_URI)
  .then(() => console.log('connected to mongodb'))
  .catch((err) => console.log('Not able to connect to mongodb', err));

const jwt = require('jsonwebtoken');

const context = ({ req }) => {
  const authHeader = req.headers.authorization || '';
  const token = authHeader.split(' ')[1]; // Extract token from "Bearer "

  if (token) {
    try {
      const user = jwt.verify(token, process.env.JWT_SECRET); // Decode user
      return { user }; // Attach user to context
    } catch (err) {
      console.log('Invalid Token');
    }
  }
  return {}; // No user attached if token is missing/invalid
};


const server = new ApolloServer({
  typeDefs,
  resolvers,
  context
});

async function startServer() {
  await server.start();
  server.applyMiddleware({ app });

  // Start Express Server
  app.listen(4000, () => {
    console.log(`Server running at http://localhost:4000${server.graphqlPath}`);
  });
}

startServer();
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

API را اجرا کنید:

npm run dev
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

نمایش داده های تست در زمین بازی GraphQl در http://localhost:4000/graphqlبشر

پایان

🎉 شما با استفاده از Node.js ، Apollo Server و MongoDB یک API GraphQL را از ابتدا ساخته اید. شما یاد گرفتید:
✅ نحوه تعریف یک طرحواره GraphQL
✅ نحوه تنظیم نمایش داده ها و جهش ها
✅ نحوه اتصال به MongoDB
✅ نحوه تأیید اعتبار کاربران

مراحل بعدی: اشتراک ها را برای به روزرسانی های زمان واقعی اضافه کنید یا یک Frontend React ایجاد کنید!

🚀 دوست دارید بعد چه چیزی بیاموزید؟ نظر زیر را رها کنید!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا