برنامه نویسی

ترکیب پاسخ های API ها در Node

معرفی

آیا تا به حال با یک نقطه پایانی API مواجه شده اید که تمام اطلاعات مورد نیاز شما را در یک پاسخ ارائه نمی کند؟ این می تواند ناامید کننده باشد، به خصوص زمانی که در حال توسعه پروژه ای هستید که به داده هایی از منابع متعدد نیاز دارد. در چنین مواردی، ممکن است مجبور شوید چندین پرس و جو در یک نقطه پایانی ایجاد کنید و پاسخ‌ها را در کد جلویی خود ترکیب کنید.

در این آموزش، نحوه ایجاد یک سرور Node.js ساده برای پردازش پاسخ‌های API و ارسال داده‌های ترکیبی به مشتری خود را در یک پرس‌وجو بررسی خواهیم کرد. این تکنیک را می توان در کد سمت مشتری نیز اعمال کرد.

دو پاسخ api وارد یک سرور می شوند و سرور یک پاسخ ترکیبی را بیرون می اندازد

پیش نیازها

قبل از شروع، مطمئن شوید که ابزارهای زیر را روی سیستم خود نصب کرده اید:

  • Node.js
  • npm (مدیر بسته Node.js)

شروع شدن

برای شروع، بیایید یک پروژه Node.js جدید ایجاد کنیم. ترمینال خود را باز کنید و به دایرکتوری که می خواهید پروژه خود را در آن ایجاد کنید بروید. پس از رسیدن، دستور زیر را اجرا کنید:

npm init -y
وارد حالت تمام صفحه شوید

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

با این کار یک پروژه Node.js جدید با تنظیمات پیش‌فرض مقداردهی اولیه می‌شود. در مرحله بعد، اجازه دهید چند وابستگی را که برای پروژه خود نیاز داریم نصب کنیم:

npm install express axios
وارد حالت تمام صفحه شوید

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

  • بیان: یک چارچوب وب برای Node.js.
  • محورها: یک سرویس گیرنده HTTP مبتنی بر وعده برای ایجاد درخواست های API.

با نصب این وابستگی ها، اجازه دهید یک فایل جدید به نام ایجاد کنیم index.js در دایرکتوری اصلی پروژه ما.

در این فایل، ابتدا ماژول های لازم را وارد کرده و سرور خود را راه اندازی می کنیم:

const express = require('express');
const app = express();
const port = 8080;
وارد حالت تمام صفحه شوید

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

این یک سرور اصلی را تنظیم می کند که به درخواست ها در پورت 8080 گوش می دهد. در صورت تمایل می توانید هر پورت موجود دیگری را انتخاب کنید.

در مرحله بعد، بیایید چند متغیر برای ذخیره نقاط پایانی API ایجاد کنیم:

const postUrl = 'https://jsonplaceholder.typicode.com/posts';
const userUrl = 'https://jsonplaceholder.typicode.com/users';
وارد حالت تمام صفحه شوید

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

ما از JSONPlaceholder API برای این آموزش استفاده خواهیم کرد، که مجموعه ای از نقاط پایانی ساختگی را برای آزمایش و نمونه سازی ارائه می دهد.

حال، بیایید از ماژول axios برای ارسال درخواست به این نقاط پایانی و ذخیره پاسخ‌ها در فایل‌ها استفاده کنیم:

const fs = require('fs/promises');
const axios = require('axios');

const fetchPostsAndUsers = async () => {
  try {
    const [postsResponse, usersResponse] = await Promise.all([
      axios.get(postUrl),
      axios.get(userUrl),
    ]);

    await fs.writeFile('posts.json', JSON.stringify(postsResponse.data));
    await fs.writeFile('users.json', JSON.stringify(usersResponse.data));
  } catch (error) {
    console.error(error);
  }
};

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

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

این کد داده‌ها را از دو نقطه پایانی API واکشی می‌کند و پاسخ‌ها را در فایل‌هایی که نامیده می‌شوند ذخیره می‌کند posts.json و users.jsonو داده های JSON را با استفاده از قالب رشته ای تبدیل می کند JSON.stringify().

حال، بیایید داده‌های این فایل‌ها را بخوانیم و آن‌ها را در یک پاسخ واحد ترکیب کنیم:

const getUsersPosts = async () => {
  try {
    const [postsData, usersData] = await Promise.all([
      fs.readFile('posts.json', 'utf8'),
      fs.readFile('users.json', 'utf8'),
    ]);

    const posts = JSON.parse(postsData);
    const users = JSON.parse(usersData);

    const usersPosts = posts.map((post) => {
      const user = users.find((user) => user.id === post.userId).name;
      return {
        ...post,
        user,
      };
    });

    return usersPosts;
  } catch (error) {
    console.error(error);
    return [];
  }
};
وارد حالت تمام صفحه شوید

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

این کد با استفاده از داده های دو فایل را می خواند fs.readFileSync()، داده های JSON را با استفاده از تجزیه و تحلیل می کند JSON.parse()و داده ها را در یک پاسخ واحد با استفاده از ترکیب ترکیب می کند map() تابع.

اینجاست که می‌توانید انتخاب کنید چه داده‌هایی در پاسخ ترکیبی جدید بازگردانده شوند، در این مثال ما فقط ویژگی name را به پاسخ پست‌ها اضافه می‌کنیم.

در نهایت، اجازه دهید یک نقطه پایانی جدید در سرور خود ایجاد کنیم که داده های ترکیبی را برمی گرداند و توابع را فراخوانی می کند:

 fetchPostsAndUsers()
 app.get('/posts', (req, res) => {
  const usersPosts = await getUsersPosts();
    res.send(usersPosts);
  });
وارد حالت تمام صفحه شوید

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

این کد نهایی است:

const express = require('express');
const app = express();
const port = 8080;
const axios = require('axios');
const fs = require('fs/promises');

const postUrl = 'https://jsonplaceholder.typicode.com/posts/';
const userUrl = 'https://jsonplaceholder.typicode.com/users/';

const fetchPostsAndUsers = async () => {
  try {
    const [postsResponse, usersResponse] = await Promise.all([
      axios.get(postUrl),
      axios.get(userUrl),
    ]);

    await fs.writeFile('posts.json', JSON.stringify(postsResponse.data));
    await fs.writeFile('users.json', JSON.stringify(usersResponse.data));
  } catch (error) {
    console.error(error);
  }
};



const getUsersPosts = async () => {
  try {
    const [postsData, usersData] = await Promise.all([
      fs.readFile('posts.json', 'utf8'),
      fs.readFile('users.json', 'utf8'),
    ]);

    const posts = JSON.parse(postsData);
    const users = JSON.parse(usersData);

    const usersPosts = posts.map((post) => {
      const user = users.find((user) => user.id === post.userId).name;
      return {
        ...post,
        user,
      };
    });

    return usersPosts;
  } catch (error) {
    console.error(error);
    return [];
  }
};

fetchPostsAndUsers()

app.get('/posts', async (req, res) => {
  const usersPosts = await getUsersPosts();
  res.send(usersPosts);
});

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
});

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

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

در کد بالا، یک endpoint /posts جدید ایجاد کرده‌ایم که آرایه‌ای از پست‌ها را با فیلد کاربر اضافه شده برمی‌گرداند. این کار با خواندن داده‌های فایل‌های posts.json و users.json و سپس پردازش داده‌ها برای ترکیب فیلدهای ضروری به دست می‌آید.

برای آزمایش نقطه پایانی خود، می‌توانیم از ابزاری مانند Postman استفاده کنیم یا فقط URL http://localhost:8080/posts را در مرورگر باز کنیم. شما باید لیستی از پست ها را مشاهده کنید که فیلد کاربر اضافه شده است، مانند این:

[
  {
    "userId": 1,
    "id": 1,
    "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
    "body": "quia et suscipit\nsuscipit... ",
    "user": "Leanne Graham"
  },
  {
    "userId": 1,
    "id": 2,
    "title": "qui est esse",
    "body": "est rerum tempore vitae\nsequi sint... ",
    "user": "Leanne Graham"
  },
]
وارد حالت تمام صفحه شوید

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

و بس! ما با موفقیت یک سرور ساده ایجاد کرده‌ایم که داده‌ها را از دو نقطه پایانی API پردازش می‌کند و داده‌های ترکیبی را در یک کوئری برمی‌گرداند.

این رویکرد می‌تواند در سناریوهای مختلفی استفاده شود که در آن شما نیاز به ترکیب داده‌ها از چندین نقطه پایانی API دارید، و همچنین می‌توان آن را برای مدیریت منطق پیچیده‌تر و پردازش داده‌ها گسترش داد.

امیدوارم که این آموزش برای شما مفید بوده باشد و هر گونه سوال یا نظری را در بخش نظرات در زیر بنویسید!

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

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

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

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