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

معرفی
آیا تا به حال با یک نقطه پایانی API مواجه شده اید که تمام اطلاعات مورد نیاز شما را در یک پاسخ ارائه نمی کند؟ این می تواند ناامید کننده باشد، به خصوص زمانی که در حال توسعه پروژه ای هستید که به داده هایی از منابع متعدد نیاز دارد. در چنین مواردی، ممکن است مجبور شوید چندین پرس و جو در یک نقطه پایانی ایجاد کنید و پاسخها را در کد جلویی خود ترکیب کنید.
در این آموزش، نحوه ایجاد یک سرور Node.js ساده برای پردازش پاسخهای 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 دارید، و همچنین میتوان آن را برای مدیریت منطق پیچیدهتر و پردازش دادهها گسترش داد.
امیدوارم که این آموزش برای شما مفید بوده باشد و هر گونه سوال یا نظری را در بخش نظرات در زیر بنویسید!