NodeJS یک محیط اجرای جاوااسکریپتی است که امکان ساخت سرویس‌های مقیاس‌پذیر و منعطفی را در اختیارتان قرار می‌دهد. این محیط، از دیتابیس‌های مختلفی از جمله MySQL پشتیبانی می‌کند. شما می‌توانید به‌راحتی اپلیکیشن NodeJS خود را به MySQL مدیریت‌شده‌ی آروان‌کلاد متصل کنید.

در این راهنما، پس از نصب NodeJS، یک پروزه‌ی نمونه می‌سازیم و با استفاده از کتاب‌خانه‌ی mysql2 آن را به دیتابیس ابری آروان متصل می‌کنیم.

پیش‌نیازها

پیش از شروع لازم است:

گام نخست: نصب NodeJS

برای نصب NodeJS روی سرور می‌توانید بر اساس سیستم‌عامل‌تان از لینک زیر استفاده کنید:

در این راهنما روش نصب NodeJS در Ubuntu 22.04 را بررسی خواهیم کرد.

پس از اتصال به سرور از طریق SSH، دستور زیر را اجرا کنید:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash

این دستور ‍nvm را که یک ابزار برای مدیریت نسخه‌ی NodeJS است نصب می‌‌کند.

سپس برای نصب NodeJS، از دستور زیر استفاده کنید:

nvm install 20

این کامند NodeJS را دریافت و نصب می‌کند. توجه داشته باشید ممکن است پیش از اجرای این دستور نیاز به راه‌اندازی مجدد ترمینال داشته باشید.

در پایان برای بررسی صحت فرآیند نصب، این دستورها را اجرا کنید:

node -v
npm -v

خروجی این دستورها، نسخه‌‌ی محیط‌های NodeJS و npm است.

گام دوم: راه‌اندازی پروژه

یک دایرکتوری جدید برای پروژه بسازید:

mkdir project

وارد دایرکتوری project شوید:

cd project

با استفاده از npm مقداردهی اولیه‌ی پروژه را انجام دهید:

npm init -y

دستور بالا یک فایل جدید به نام package.json ایجاد می‌کند که شامل جزییات و وابستگی‌های پروژه است.

پس از آن وابستگی‌های پروژه را نصب کنید:

npm i mysql2 dotenv

این دستور، کتابخانه‌ها‌ی mysql2 و dotenv را که به اپلیکیشن NodeJS اجازه می‌دهد با دیتابیس MySQL ارتباط برقرار کند، نصب می‌کند.

در گام بعد، فایل package.json را باز کرده و بررسی کنید که تمام وابستگی‌های مورد نیاز نصب شده‌اند:

cat package.json

خروجی باید مشابه زیر باشد:

"dependencies": {
    "dotenv": "^16.3.1",
    "mysql2": "^3.6.0"
}

سپس فایل اصلی یا index.js پروژه را ایجاد کنید:

touch index.js

با استفاده از ویرایشگری مانند Nano، یک فایل env. ایجاد کنید تا اطلاعات دیتابیس را ذخیره کنید:

nano .env

متغیرهای زیر را در فایل اضافه کنید. مقادیر نمونه را با جزئیات اتصال دیتابیس MySQL مدیریت‌شده‌ی آروان جایگزین کنید:

DB_HOSTNAME = example.db.arvandbaas.ir
DB_PORT = 3306
DB_USER = base-user
DB_PASSWORD = 'password'
DB_NAME = default

فایل را ذخیره کرده و ببندید.

اتصال به دیتابیس

برای اتصال اپلیکیشن NodeJS به دیتابیس MySQL، از کتابخانه‌ی mysql2 و فایل env. استفاده می‌کنیم.

فایل index.js را باز کرده و ویرایش کنید:

nano index.js

کد زیر را به فایل اضافه کنید:

require('dotenv').config();
const mysql = require('mysql2');

const dbConfig = {
    host: process.env.DB_HOSTNAME,
    port: process.env.DB_PORT,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
};

let db;
const connectToDB = async () => {
    const pool = mysql.createPool(dbConfig);
    const poolPromise = pool.promise();

    return poolPromise;
};

const main = async () => {
    db = await connectToDB();
    console.log('Connected to database');
};

main();

فایل index.js بالا، اپلیکیشن NodeJS شما را به دیتابیس MySQL متصل کرده و اجرای عملیات‌ CRUD را ممکن می‌کند.

برای اجرای فایل index.js و شروع اپلیکیشن Node.js، دستور زیر را اجرا کنید:

node index.js

اگر تنظیمات به‌درستی اعمال شده باشند، باید خروجی زیر را دریافت کنید:

Connected to database

ارتباط با دیتابیس

برای بررسی عملکرد اپلیکیشن NodeJS، می‌توانید یک جدول جدید ایجاد کرده و عملیات‌ CRUD را با استفاده از دستورهای SQL انجام دهید.

ایجاد جدول جدید

فایل index.js را باز کنید:

nano index.js

قبل از دستور ;return poolPromise در متد ()connectToDB، یک کوئری SQL اضافه کنید که یک جدول جدید به نام posts ایجاد کند:

const connectToDB = async () => {
    const pool = mysql.createPool(dbConfig);
    const poolPromise = pool.promise();

    await poolPromise.query("CREATE TABLE IF NOT EXISTS `posts` (`id` int NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `body` varchar(255) NOT NULL, `author` varchar(255), PRIMARY KEY (`id`) );");

    const [allPosts, fields] = await poolPromise.query('SELECT * FROM posts;');
    console.log(`Posts Table: ${JSON.stringify({ allPosts, fields })}`);

    return poolPromise;
};

فایل را ببندید و ذخیره کنید. سپس اپلیکیشن را اجرا کنید:

node index.js

خروجی باید مشابه زیر باشد:

34,0]},"_clientEncoding":"utf8","_catalogLength":3,"_catalogStart":167,"_schemaLength":9,"_schemaStart":171,"_tableLength":5,"_tableStart":181,"_orgTableLength":5,"_orgTableStart":187,"_orgNameLength":6,"_orgNameStart":200,"characterSet":224,"encoding":"utf8","name":"author","columnLength":1020,"columnType":253,"type":253,"flags":0,"decimals":0}]}

 Connected to database

ایجاد یک پست جدید

فایل index.js را ویرایش کنید:

nano index.js

یک متد جدید به نام ()createNewPost تعریف کنید تا یک پست جدید در جدول posts ایجاد کند:

const createNewPost = async (postData) => {
    const { title, body, author } = postData;
    const [newPost, fields] = await db.query('INSERT INTO posts (title, body, author) VALUES (?,?,?);', [title, body, author]);
    console.log(`New post created: ${JSON.stringify(newPost)}`);
};

متد ()createNewPost را با داده‌های مثال در متد ()main فراخوانی کنید تا یک پست جدید ایجاد شود:

await createNewPost({ title: "Test Title", body: "This is the return of test body.", author: "Tommy Shelby" });

فایل را ببندید و ذخیره کنید. سپس اپلیکیشن را اجرا کنید:

node index.js

خروجی باید مشابه زیر باشد:

New post created: {"fieldCount":0,"affectedRows":1,"insertId":4,"info":"","serverStatus":2,"warningStatus":0,"changedRows":0}

دریافت یک پست با ID

فایل index.js را ویرایش کنید:

nano index.js

یک متد جدید به نام ()getPostById اضافه کنید که داده‌های یک پست را با استفاده از id دریافت کند:

const getPostById = async (postId) => {
    const [post, fields] = await db.query('SELECT * FROM posts WHERE id=?;', [postId]);
    console.log(`Post: ${JSON.stringify(post)}`);
};

در متد ()main، متد ()getPostById را با یک postId فراخوانی کنید تا داده‌های پست دریافت شود:

await getPostById(1);

فایل را ببندید و ذخیره کنید. سپس اپلیکیشن را اجرا کنید:

node index.js

خروجی باید مشابه زیر باشد:

Post: [{"id":1,"title":"Test Title","body":"This is the return of test body.","author":"Tommy Shelby"}]

به‌روزرسانی یک پست با ID

فایل index.js را ویرایش کنید:

nano index.js

یک متد جدید به نام ()updatePostById اضافه کنید که پست را به‌روزرسانی کند:

const updatePostById = async (postId, postData) => {
    const { title, body } = postData;
    const [updatePost, fields] = await db.query('UPDATE posts SET title=?, body=? WHERE id=?;', [title, body, postId]);
    console.log(`Post updated: ${JSON.stringify(updatePost)}`);
};

در متد ()main، متد ()updatePostById را با یک postId موجود و داده‌های جدید فراخوانی کنید. برای مثال:

await updatePostById(1, { title: 'Updated Title', body: "This is updated post body" });

فایل را ببندید و ذخیره کنید. سپس اپلیکیشن را اجرا کنید:

node index.js

خروجی باید مشابه زیر باشد:

Post updated: {"fieldCount":0,"affectedRows":1,"insertId":0,"info":"Rows matched: 1  Changed: 0  Warnings: 0","serverStatus":2,"warningStatus":0,"changedRows":0}

حذف یک پست با ID

فایل index.js را ویرایش کنید:

nano index.js

یک متد جدید به نام ()deletePostById اضافه کنید که یک پست را با id حذف کند:

const deletePostById = async (postId) => {
    const [post, fields] = await db.query('DELETE FROM posts WHERE id=?;', [postId]);
    console.log(`Post deleted : ${JSON.stringify(post)}`);
};

در متد ()main، متد ()deletePostById را برای حذف یک پست فراخوانی کنید. برای مثال، پست با آی‌دی 2 را حذف کنید:

await deletePostById(2);

فایل را ببندید و ذخیره کنید. سپس اپلیکیشن را اجرا کنید:

node index.js

خروجی باید مشابه زیر باشد:

Post deleted : {"fieldCount":0,"affectedRows":1,"insertId":0,"info":"","serverStatus":2,"warningStatus":0,"changedRows":0}

برای آشنایی بیش‌تر با شیوه‌ی استفاده از کتابخانه‌ی mysql2 در NodeJS، مستندات MySQL2 را بررسی کنید.