نحوه یکپارچه‌سازی API با پایگاه داده

یکپارچه‌سازی API با پایگاه داده
یکپارچه‌سازی API با پایگاه داده

بسیاری از آموزش‌های مربوط به ساخت API، از جمله آموزش‌هایی که در سایت پادیوم منشتر کرده‌ایم، از داده‌های ثابت و پایگاه داده درون حافظه‌ای استفاده می‌کردند. در این پست قرار است با یکدیگر یک پایگاه داده MySQL برای ذخیره‌سازی تمام داده‌های خود بسازیم، آن را به یک اپلیکیشن Node.js وصل و با استفاده از API درخواست‌های CRUD را ارسال کنیم.

نصب MySQL

اگر شما از قبل MySQL را نصب کرده‌اید، به مرحله بعدی بروید. اگر MySQL را ندارید، می‌توانید MAMP را دانلود کنید. این برنامه یک محیط و پایگاه داده لوکال و رایگان در اختیار شما می‌گذارد. بعد از دانلود برنامه، آن را باز کرده و روی دکمه Start Servers کلیک کنید. علاوه بر MySQL، ما به یک GUI برای دیدن پایگاه داده و جدول‌ها نیاز داریم. برای مک، می‌توانید از SequelPro و برای ویندوز از SQLyog استفاده کنید. بعد از نصب MySQL، می‌توانید با استفاده از این برنامه‌ها به localhost و با نام کاربری و رمز عبور root روی پورت ۳۳۰۶ وصل شوید.

راه‌اندازی پایگاه داده

در برنامه GUI خود، یک پایگاه داده جدید ایجاد کرده و نام آن را api بگذارید. وقتی پایگاه داده api را ساختید، به این پایگاه رفته و با اجرای کوئری زیر یک جدول جدید بسازید:

CREATE TABLE `users` (
  `id`       int(11)     unsigned NOT NULL AUTO_INCREMENT,
  `name`     varchar(30) DEFAULT '',
  `email`    varchar(50) DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

این کوئری ساختار جدول users را می‌سازد. هر کاربر یک id، نام و یک آدرس ایمیل دارد. همچنین ما می‌توانیم با استفاده از کوئری INSERT داده‌هایی که از طریق آرایه JSON نمایش می‌دهیم را وارد پایگاه داده کنیم:

INSERT INTO users (name, email) 
 VALUES ('Richard Hendricks', 'richard@piedpiper.com'), 
 ('Bertram Gilfoyle',  'gilfoyle@piedpiper.com');

در اینجا نیاز یه وارد کردن id نداریم، چرا که به طور خودکار تخصیص داده می‌شود. در حال حاضر ما ساختار جدول خودمان و داده‌های نمونه را داریم.

اتصال به MySQL

در اپلیکیشن Node.js خودمان بادی به پایگاه داده‌ای که ایجاد کرده‌ایم، متصل شویم. قبل از این مراحل، ما ماژول npm مربوط به mysql را نصب کرده و حالا باید از آن استفاده کنیم.

یک دایرکتوری به نام data ساخته و داخل آن یک فایل config.js ایجاد کنید. حالا ما باید فایل config.js را در ماژول mysql قرار دهیم:

const mysql = require('mysql');

بیایید یک آبجکت config که حاوی میزبان، نام کاربری، رمز عبورو پایگاه داده است را ایجاد کنیم. این آبجکت باید به پایگاه داده api ارجاع داده و از تنظیمات پیش‌فرض لوکال‌هاست استفاده کند.

// Set database connection credentials
const config = {
    host: 'localhost',
    user: 'root',
    password: 'root',
    database: 'api',
};

برای کارایی بهتر، ما از MySQL pool استفاده می‌کنیم که به ما اجازه می‌دهد به جای باز کردن و بستن هر کانکشن به صورت جداگانه، چندین کانکشن را به صورت هم‌زمان استفاده کنیم.

// Create a MySQL pool
const pool = mysql.createPool(config);

و در نهایت، ما از MySQL pool خروجی می‌گیریم تا اپلیکیشن بتواند از آن استفاده کند:

// Export the pool
module.exports = pool;

حالا که ما به MySQL شدیم تنظیمات تکمیل شده است، می‌توانیم تعامل با پایگاه داده از طریق API بپردازیم.

دریافت داده API از MySQL

در حال حاضر، فایل routes.js ما به صورت دستی یک آرایه JSON از کاربران می‌سازد که به شکل زیر است:

const users = [{ ...

از آنجایی که ما دیگر از داده ثابت استفاده نمی‌کنیم، می‌توانیم کد زیر را به جای آرایه قرار دهیم:

// Load the MySQL pool connection
const pool = require('../data/config');

قبل از این، دستور GET برای مسیر users/ داده‌های ثابت users را برای ما می‌فرستاد، اما کد به‌روز‌شده ما پایگاه داده را برای داده کوئری می‌کند. ما می‌خواهیم از کوئری SQL برای SELECT کردن جدول users استفاده کنیم:

SELECT * FROM users

در ادامه کد به‌روز‌شده با استفاده از متد ()pool.query را می‌بینیم:

// Display all users
app.get('/users', (request, response) => {
    pool.query('SELECT * FROM users', (error, result) => {
 if (error) throw error;
 
        response.send(result);
    });
});

استفاده از پارامترهای URL

تا به اینجا، اندپوینت‌های ما مسیر ثابتی داشته‌اند (مانند / یا users/). اما زمانی که می‌خواهیم داده‌های مربوط به یک کاربر خاص را ببینیم، باید یک اندپوینت متغیر استفاده کنیم. برای مثال، ممکن است ما بخواهیم بر اساس id اطلاعات یک کاربر را دریافت کنیم. برای این کار ما از (:) برای تعیین پارامتر مسیر استفاده می‌کنیم:

// Display a single user by ID
app.get('/users/:id', (request, response) => {
        ...
    });
});

ما می‌توانیم با استفاده از دستور request.property پارامتر این مسیر را بازیابی کنیم:

const id = request.params.id;

حالا ما با اضافه کردن WHERE به دستور SELECT نتایج مربوط به یک id خاص را دریافت کنیم. ما از ? به عنوان پیش‌فرض برای جلوگیری از تزریق SQL استفاده کرده و id را به عنوان پارامتر ارسال می‌کنیم:

pool.query('SELECT * FROM users WHERE id = ?', id, (error, result) => {
 if (error) throw error;
 
    response.send(result);
});

کد کامل برای یک کاربر به صورت زیر خواهد بود:

// Display a single user by ID
app.get('/users/:id', (request, response) => {
 const id = request.params.id;
 
    pool.query('SELECT * FROM users WHERE id = ?', id, (error, result) => {
 if (error) throw error;
 
        response.send(result);
    });
});

حالا شما می‌توانید سرور را مجدد راه‌اندازی کنید و با رفتن به آدرس https://localhost/users/2 اطلاعات مربوط به این کاربر را ببینید. اگر خطای Cannot GET /users/2 را ردیافت کردید، به این معنی است که باید سرور را دوباره راه‌اندازی کنید. در صورتی که همه چیز درست انجام شده باشد، باید نتیجه زیر را دریافت کنید:

[{
    id: 2,
    name: &quotBertram Gilfoyle&quot,
    email: &quotgilfoyle@piedpiper.com&quot
}]

در صورتی که نتیجه بالا را دریافت کرده‌اید، شما با موفقیت با استفاده از API به پایگاه داده خودتان دسترسی پیدا کرده‌اید. برای تمرین می‌توانید کد مربوط به دستورات POST، PUT و DELETE را خودتان بنویسید.