MySQL: التطوير العملي: ربط Node.js بـ MySQL

آخر تحديث: 2026-08-26

بالنسبة لمطوري الواجهة الأمامية الذين يتعلمون تطوير الواجهة الخلفية، يُعد استخدام Node.js مع MySQL أفضل نقطة انطلاق.

يشرح هذا الدرس كيفية العمل مع MySQL باستخدام Node.js.

100%
graph TB
    A[Node.js Applications] --> B[mysql2 Driver]
    B --> C[Connection Pool]
    C --> D[Get the link]
    D --> E[Parametric Queries]
    E --> F{Operation Type}
    F -->|Search| G[execute SELECT]
    F -->|Insert| H[execute INSERT]
    F -->|Update| I[execute UPDATE]
    F -->|Delete| J[execute DELETE]
    F -->|Transactions| K[beginTransaction]
    K --> L[commit / rollback]
    D --> M[Release the connection back to the pool]

1. ما ستتعلمه



2. قصة حقيقية

(1) المشكلة: تعلم لغة SQL دون معرفة كيفية تطبيقها في المشاريع

غالبًا ما يواجه مطورو الواجهة الأمامية الذين تعلموا لغة SQL صعوبات عند كتابة كود الواجهة الخلفية باستخدام Node.js: فالتسلسل اليدوي لسلاسل SQL يجعلهم عرضة لهجمات الحقن، كما أن سوء إدارة الاتصالات يؤدي إلى استنفاد اتصالات قاعدة البيانات، وتجعل عمليات الاستدعاء غير المتزامنة المتداخلة صيانة الكود أمرًا صعبًا.

(2) حل لتجميع الاتصالات في MySQL 2+ + الاستعلامات المعلمة

استخدم برنامج التشغيل mysql2 (الذي يدعم «الوعود» (Promises))، وتجميع الاتصالات لإدارة الاتصالات، والاستعلامات المعلمة لمنع هجمات الحقن.

البعد إنشاء SQL يدويًا تجمع اتصالات MySQL 2+
مخاطر حقن SQL عالية جدًا صفر (استعلامات معلمة)
إدارة الاتصال غير مُدار (قد تنفد الموارد) الإدارة التلقائية (التجميع وإعادة الاستخدام)
أسلوب البرمجة جحيم الاستدعاءات المرتدة async/await
جاهز للإنتاج


3. التركيب والتوصيل

▶ مثال: تثبيت mysql2

BASH
npm install mysql2

▶ مثال: إنشاء اتصال

JAVASCRIPT
// ⚙️ Requires: npm install mysql2, running MySQL server
const mysql = require('mysql2/promise');

async function main() {
    const connection = await mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password: 'Root123!',
        database: 'mydb'
    });
    
    const [rows] = await connection.execute('SELECT VERSION()');
    console.log(rows);
    
    await connection.end();
}

main();
▶ جرّب الكود

4. تجمع الاتصالات

JAVASCRIPT
const pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: 'Root123!',
    database: 'mydb',
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0
});

// Querying Using a Connection Pool
async function queryWithPool() {
    const [rows] = await pool.execute('SELECT * FROM users WHERE id = ?', [1]);
    console.log(rows);
}
queryWithPool();


5. عمليات CRUD

▶ مثال: الاستعلام عن البيانات

JAVASCRIPT
// Search All Users
async function queryUsers() {
    const [users] = await pool.execute('SELECT * FROM users');

    // Conditional Query
    const userId = 1;
    const [user] = await pool.execute(
        'SELECT * FROM users WHERE id = ?',
        [userId]
    );
    console.log(users, user);
}
queryUsers();
▶ جرّب الكود

▶ مثال: إدخال البيانات

JAVASCRIPT
async function insertUser() {
    const [result] = await pool.execute(
        'INSERT INTO users (username, email) VALUES (?, ?)',
        ['alice', 'alice@email.com']
    );
    console.log(result.insertId);
}
insertUser();
▶ جرّب الكود

▶ مثال: تحديث البيانات

JAVASCRIPT
async function updateUser() {
    const [result] = await pool.execute(
        'UPDATE users SET email = ? WHERE id = ?',
        ['new@email.com', 1]
    );
    console.log(result.affectedRows);
}
updateUser();
▶ جرّب الكود

▶ مثال: حذف البيانات

JAVASCRIPT
async function deleteUser() {
    const [result] = await pool.execute(
        'DELETE FROM users WHERE id = ?',
        [1]
    );
    console.log(result.affectedRows);
}
deleteUser();
▶ جرّب الكود

6. منع هجمات حقن SQL

(1) خطأ: ربط سلاسل

JAVASCRIPT
// Danger! SQL injection
const sql = `SELECT * FROM users WHERE username = '${username}'`;

(2) صحيح: الاستعلام المعلم

JAVASCRIPT
// Safe: Parameterized query
async function safeQuery(username) {
    const [rows] = await pool.execute(
        'SELECT * FROM users WHERE username = ?',
        [username]
    );
    console.log(rows);
}
safeQuery('alice');


7. تغليف المعاملات

JAVASCRIPT
async function transfer(fromId, toId, amount) {
    const conn = await pool.getConnection();
    
    try {
        await conn.beginTransaction();
        
        await conn.execute(
            'UPDATE accounts SET balance = balance - ? WHERE id = ?',
            [amount, fromId]
        );
        
        await conn.execute(
            'UPDATE accounts SET balance = balance + ? WHERE id = ?',
            [amount, toId]
        );
        
        await conn.commit();
        return { success: true };
    } catch (error) {
        await conn.rollback();
        return { success: false, error: error.message };
    } finally {
        conn.release();
    }
}


8. مقدمة إلى ORM

ORM الوصف
Sequelize أداة ORM عريقة تتمتع بمجموعة كاملة من الميزات
بريزما الجيل الجديد من الأمان القائم على الأنواع
TypeORM دعم جيد لـ TypeScript
Knex.js أداة إنشاء الاستعلامات
JAVASCRIPT
// Prisma Example
async function getActiveUsers() {
    const users = await prisma.user.findMany({
        where: { status: 'active' },
        include: { orders: true }
    });
    console.log(users);
}
getActiveUsers();


❓ أسئلة شائعة

س هل يجب عليّ استخدام mysql أم mysql2؟
ج نوصي باستخدام mysql2 (فهي تدعم Promises وتوفر أداءً أفضل).
س ما هو الحجم الذي ينبغي ضبطه لمجموعة الاتصالات؟
ج عادةً ما يتراوح بين 10 و20، ويتم تعديله وفقًا لمعدل التزامن.
س متى ينبغي استخدام ORM؟
ج استخدم ORM لتبسيط عملية التطوير في المشاريع المعقدة؛ واستخدم لغة SQL الأصلية للحصول على مرونة أكبر في المشاريع البسيطة.
س ما الفرق بين mysql و mysql2؟
ج mysql هو برنامج التشغيل الأقدم الذي يدعم فقط وظائف الاستدعاء العكسي (callbacks)، بينما يدعم mysql2 الوعود (Promises) ويقدم أداءً أفضل. نوصي باستخدام mysql2.
س ما هو الحجم المثالي لمجموعة الاتصالات؟
ج المعادلة هي: عدد نوى وحدة المعالجة المركزية × 2 + عدد الأقراص؛ وبالنسبة لتطبيق ويب عادي، يكفي أن يتراوح العدد بين 10 و20.

📖 ملخص


📝 تمارين

  1. المشكلة الأساسية (مستوى الصعوبة: ⭐): استخدم Node.js للاتصال بقاعدة بيانات MySQL، وإجراء استعلام على قاعدة البيانات، وعرض قائمة المستخدمين.

  2. تمرين متقدم (مستوى الصعوبة: ⭐⭐): قم بتنفيذ واجهة برمجة تطبيقات (API) كاملة لعمليات CRUD (إنشاء، قراءة، تحديث، حذف).

  3. التحدي (مستوى الصعوبة: ⭐⭐⭐): قم بتنفيذ ميزة تحويل الأموال، بما في ذلك المعاملات ومعالجة الأخطاء.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%