تحية للجميع. تحسبًا لبدء دورة "Fullstack JavaScript Developer" ، نريد مشاركة القليل من المواد التي كتبها كاتبنا المستقل.
Express هو أحد أكثر أطر الويب شيوعًا التي تدعم التوجيه والوزن المتوسط ونظام القالب. يعد النسخ الاحتياطي لـ Node.js بدون Express في 2020 نشاطًا غريبًا إلى حد ما ، لأن Express هو إطار عمل واقعي لبناء تطبيق ويب على Node.js.سنحاول اليوم إنشاء واجهة برمجة تطبيقات CRUD بسيطة باستخدام قاعدة بيانات MySQL. سوف يسألك قارئ Node.js ذو خبرة ، أين هو MongoDB ، حيث يتم استخدام Node.js عادة معًا ، ولكن سأقول على الفور أن هذه المقالة أكثر لمطوري PHP الذين يريدون لمس Node.js قليلاً ، وللتخفيف من الانتقال إلى نظام بيئي جديد ، فإننا سوف نستخدم MySQL. سننشئ واجهة برمجة تطبيقات لتطبيق Todo بسيط ، في حالة ما إذا أراد شخص ما إرفاقه بمهامه (ولا يهم حتى إذا كانت مكتوبة برد فعل أم لا) ، نعلق القليل من اللعب ونلعب معه."العمارة" وجوهر تطبيقنا
في تطبيقنا سيكون من الممكن إنشاء واستلام وتحديث وحذف Todo. بشكل عام ، سيكون لدينا الحد الأدنى من وظائف CRUD (إنشاء حذف تحديث القراءة).في النهاية ، سنقوم بدمج التطبيق مع التطبيق على React وسوف نقوم باختبار كل شيء.أولاً ، سأعطي بنية ملفات التطبيق:
بعد ذلك ، سأقدم جدولًا بالإجراءات والأساليب الموجودة في طلبنا:إنشاء تطبيق Node.js الخاص بك
انتقل إلى الدليل المفضل لديك ، وقم بتشغيل الوحدة الطرفية وإنشاء التطبيق الخاص بك. بالمناسبة ، من الواضح أنه من العنوان يجب تثبيت Node.js بالفعل. إذا لم تكن قد قمت بذلك بالفعل ، فلا يمكن تنزيل هذا ببساطة من الرابط من هنا. $ mkdir CRUD_API
$ cd CRUD_API
بعد ذلك ، تحتاج إلى تهيئة تطبيقنا باستخدام npm init . لان تطبيقنا هو أكثر من اختبار وتدريب واحد ، سأستخدم أمرًا يملأ جميع البيانات الافتراضية حتى لا تضيع الوقت في التفاصيل الصغيرة: npm init -y
إذا كان ذلك ، فعندئذ package.json
يمكنك تغيير البيانات إلى البيانات التي تحتاجها: مستودع جيثب ، العلامات ، المؤلف ، إلخ.ثم نحتاج إلى وضع جميع الحزم اللازمة للتطبيق للعمل: npm i express mysql body-parser --save
إذا كنت بصدد ارسال تطوير لجيثب في وقت لاحق، يجب عليك إنشاء ملف مخفي .gitignore
حتى لا سحب أثقل node_modules وصمة عار نفسك . نحن نكتب: touch .gitignore
code .gitignore
ندخل هناك node_modules
، في وقت لاحق في هذا الملف يمكنك إدخال أسماء المجلدات والملفات التي تريد رؤيتها لاحقًا على الخادم البعيد.الإعداد الأساسي السريع
في المجلد الجذر للمشروع ، قم بإنشاء ملف server.js
: const express = require("express");
const bodyParser = require("body-parser");
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.get("/", (req, res) => {
res.json({ message: " " });
});
app.listen(3001, () => {
console.log(" 3001 ");
});
الآن يمكننا أن نبدأ الخادم مع:node server.js
نحتاج إلى Express لإنشاء واجهة برمجة تطبيقاتنا ، وتساعدنا حزمة body-parser على تحليل الطلب وإنشاء طلبreq.body
مفيد للتوجيه.يمكن لخادمنا الآن القيام بما يلي:- إنشاء تطبيق Express يجعل محلل النص وسيطًا باستخدام app.use ()
- لدينا مجرد الحصول على اختبار التطبيق
- استمع إلى المنفذ 3001 لجميع التغييرات الواردة
في البداية ، يعمل تطبيقنا ، ثم يمكنك القيام بقاعدة البيانات.إنشاء جدول بيانات MySQL
آمل حقًا ألا يواجه قارئ هذه المقالة مشكلة في تنزيل MySQL و MySQLWorkBranch وتثبيتهما بمفردهما. بعد ذلك ، تقوم بنفسك بإنشاء مخطط (DB) بالاسم الذي تفضله (في حالتي ، TODO) ، ثم حدد طلب البرق وانسخ / اكتب الأمر التالي: CREATE TABLE IF NOT EXISTS `todo` (
id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
text varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
في قاعدة البيانات الخاصة بنا ، سيكون كل شيء على الأقل: المعرف فقط ونص الحالة نفسها. ومع ذلك ، لإضافة عمود آخر يمكن ، على سبيل المثال ، وصف إلحاح حالتك ، آمل ألا يتسبب في مشاكل.التكوين والتواصل مع قاعدة البيانات الخاصة بنا
لنقم بتكوين الاتصال بقاعدة البيانات وتكوينه. سنقوم بإنشاء مجلد تطبيق جديد مباشرة في مجلد الجذر الخاص بنا ، وهناك سنقوم بإنشاء ملف db.config.js
في المجلد config
، مع نفس المحتوى تقريبًا ، والذي يعتمد على إعداداتك في MySQLWorkBranch. في حالتي ، سيبدو الملف كما يلي: module.exports = {
HOST: "localhost",
USER: "pavel",
PASSWORD: "",
DB: "TODO"
};
بعد ذلك ، قم بإنشاء مجلد لوصف نماذج التطبيق / الوضع الخاصة بنا ، حيث سنقوم بعد ذلك بإنشاء نموذج: const mysql = require("mysql");
const dbConfig = require("../config/db.config.js");
//
const connection = mysql.createConnection({
host: dbConfig.HOST,
user: dbConfig.USER,
password: dbConfig.PASSWORD,
database: dbConfig.DB
});
//
connection.connect(err => {
if (err) throw error;
console.log(" ");
});
module.exports = connection;
//
إنشاء نموذج
في المجلد model
، نقوم بإنشاء ملف يسمى deal.model.js
. إذا كان لديك سؤال ، ما هو النموذج بشكل عام ، يجب عليك قراءة مقال مثل هذا والتعرف على نمط تصميم MVC. سوف أقوم بإنشاء مُنشئ لكائن الصفقة ، واستخدام الاتصال لوظائف CRUD التالية:- إنشاء عمل جديد
- إيجاد حالة عن طريق معرف
- الحصول على جميع الحالات
- القدرة على تحديث قضيتنا عن طريق معرف
- حذف حالة واحدة بواسطة معرف
- الحذف الكامل لجميع الحالات
المجموع ، يتعين علينا القيام بالأمور التالية:
const Deal = function(deal) {
this.text = deal.text;
};
Deal.create = (newDeal, result) => {
sql.query("INSERT INTO TODO SET ?", newDeal, (err, res) => {
if (err) {
console.log("error: ", err);
result(err, null);
return;
}
console.log(" ", { id: res.insertId, ...newDeal });
result(null, { id: res.insertId, ...newDeal });
});
};
سأضع بقية الكود في المفسد ، لأنني لا أرى أي سبب لإحضار كل شيء ، لأنه في الواقع يتكرر نمط الكود هناك ، تتغير فقط أوامر SQL والوسيطات:ما تبقى من الكودDeal.findById = (dealId, result) => {
sql.query(`SELECT * FROM TODO WHERE id = ${dealId}`, (err, res) => {
if (err) {
console.log(«error: », err);
result(err, null);
return;
}
if (res.length) {
console.log(« : », res[0]);
result(null, res[0]);
return;
}
//
result({ kind: «not_found» }, null);
});
};
Deal.getAll = result => {
sql.query(«SELECT * FROM TODO», (err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}
console.log(«deals: », res);
result(null, res);
});
};
Deal.updateById = (id, deal, result) => {
sql.query(
«UPDATE TODO SET text =? WHERE id = ?»,
[deal.text, id],
(err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}
if (res.affectedRows == 0) {
result({ kind: «not_found» }, null);
return;
}
console.log(« », { id: id, ...deal });
result(null, { id: id, ...deal });
}
);
};
Deal.remove = (id, result) => {
sql.query(«DELETE FROM TODO WHERE id = ?», id, (err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}
if (res.affectedRows == 0) {
// id
result({ kind: «not_found» }, null);
return;
}
console.log(« », id);
result(null, res);
});
};
Deal.removeAll = result => {
sql.query(«DELETE FROM TODO», (err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}
console.log(`deleted ${res.affectedRows} deals`);
result(null, res);
});
};
هذا كل شئ حتى الان. يقترب الجزء التالي من هذه المقالة ، حيث ننتهي من كتابة الظهر ونبدأ اختباره. وبحسب التقاليد ، بعض الروابط المفيدة: