MySQL: التطوير العملي: ربط Node.js بـ MySQL
آخر تحديث: 2026-08-26
بالنسبة لمطوري الواجهة الأمامية الذين يتعلمون تطوير الواجهة الخلفية، يُعد استخدام Node.js مع MySQL أفضل نقطة انطلاق.
يشرح هذا الدرس كيفية العمل مع MySQL باستخدام Node.js.
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. ما ستتعلمه
- تثبيت برنامج التشغيل mysql2 والاتصال به
- تكوين مجموعة الاتصالات
- عمليات CRUD
- الاستعلامات المعلمة (منع حقن SQL)
- تغليف المعاملات
2. قصة حقيقية
(1) المشكلة: تعلم لغة SQL دون معرفة كيفية تطبيقها في المشاريع
غالبًا ما يواجه مطورو الواجهة الأمامية الذين تعلموا لغة SQL صعوبات عند كتابة كود الواجهة الخلفية باستخدام Node.js: فالتسلسل اليدوي لسلاسل SQL يجعلهم عرضة لهجمات الحقن، كما أن سوء إدارة الاتصالات يؤدي إلى استنفاد اتصالات قاعدة البيانات، وتجعل عمليات الاستدعاء غير المتزامنة المتداخلة صيانة الكود أمرًا صعبًا.
(2) حل لتجميع الاتصالات في MySQL 2+ + الاستعلامات المعلمة
استخدم برنامج التشغيل mysql2 (الذي يدعم «الوعود» (Promises))، وتجميع الاتصالات لإدارة الاتصالات، والاستعلامات المعلمة لمنع هجمات الحقن.
| البعد | إنشاء SQL يدويًا | تجمع اتصالات MySQL 2+ |
|---|---|---|
| مخاطر حقن SQL | عالية جدًا | صفر (استعلامات معلمة) |
| إدارة الاتصال | غير مُدار (قد تنفد الموارد) | الإدارة التلقائية (التجميع وإعادة الاستخدام) |
| أسلوب البرمجة | جحيم الاستدعاءات المرتدة | async/await |
| جاهز للإنتاج | ❌ | ✅ |
3. التركيب والتوصيل
▶ مثال: تثبيت mysql2
npm install mysql2
▶ مثال: إنشاء اتصال
// ⚙️ 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. تجمع الاتصالات
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
▶ مثال: الاستعلام عن البيانات
// 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();
▶ مثال: إدخال البيانات
async function insertUser() {
const [result] = await pool.execute(
'INSERT INTO users (username, email) VALUES (?, ?)',
['alice', 'alice@email.com']
);
console.log(result.insertId);
}
insertUser();
▶ مثال: تحديث البيانات
async function updateUser() {
const [result] = await pool.execute(
'UPDATE users SET email = ? WHERE id = ?',
['new@email.com', 1]
);
console.log(result.affectedRows);
}
updateUser();
▶ مثال: حذف البيانات
async function deleteUser() {
const [result] = await pool.execute(
'DELETE FROM users WHERE id = ?',
[1]
);
console.log(result.affectedRows);
}
deleteUser();
6. منع هجمات حقن SQL
(1) خطأ: ربط سلاسل
// Danger! SQL injection
const sql = `SELECT * FROM users WHERE username = '${username}'`;
(2) صحيح: الاستعلام المعلم
// Safe: Parameterized query
async function safeQuery(username) {
const [rows] = await pool.execute(
'SELECT * FROM users WHERE username = ?',
[username]
);
console.log(rows);
}
safeQuery('alice');
7. تغليف المعاملات
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 | أداة إنشاء الاستعلامات |
// Prisma Example
async function getActiveUsers() {
const users = await prisma.user.findMany({
where: { status: 'active' },
include: { orders: true }
});
console.log(users);
}
getActiveUsers();
❓ أسئلة شائعة
📖 ملخص
- mysql2 هو برنامج تشغيل MySQL لـ Node.js يدعم Promises
- مجموعة الاتصالات تعيد استخدام الاتصالات لتحسين الأداء
- الاستعلامات المعلمة تمنع هجمات حقن SQL
- المعاملات تضمن اتساق البيانات
- ORM يبسط عمليات قاعدة البيانات
📝 تمارين
-
المشكلة الأساسية (مستوى الصعوبة: ⭐): استخدم Node.js للاتصال بقاعدة بيانات MySQL، وإجراء استعلام على قاعدة البيانات، وعرض قائمة المستخدمين.
-
تمرين متقدم (مستوى الصعوبة: ⭐⭐): قم بتنفيذ واجهة برمجة تطبيقات (API) كاملة لعمليات CRUD (إنشاء، قراءة، تحديث، حذف).
-
التحدي (مستوى الصعوبة: ⭐⭐⭐): قم بتنفيذ ميزة تحويل الأموال، بما في ذلك المعاملات ومعالجة الأخطاء.