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 را بررسی کنید.