قم بإنشاء واجهة برمجة تطبيقات CRUD الخاصة بك على Express و MySQL: الجزء الأول

تحية للجميع. تحسبًا لبدء دورة "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 وسوف نقوم باختبار كل شيء.

أولاً ، سأعطي بنية ملفات التطبيق:



بعد ذلك ، سأقدم جدولًا بالإجراءات والأساليب الموجودة في طلبنا:

طرقعنوان Urlأجراءات
احصل على/ صفقاتالحصول على جميع الحالات
احصل على/ Deals / 2الحصول على معرف برقم 2
بريد/ صفقاتمضيفا حالة جديدة
وضع/ Deals / 3تحديث المستخدم بالمعرف = 3
حذف/ Deals / 3حذف المستخدم بالمعرف = 3
حذف/ صفقاتإزالة كافة المستخدمين

إنشاء تطبيق 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();
    
    //     json
    app.use(bodyParser.json());
    
    //    : application/x-www-form-urlencoded
    app.use(bodyParser.urlencoded({ extended: true }));
    
    //   response - request
    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;
  };
  //    ,        CRUD,      :
  Deal.create = (newDeal, result) => {
    sql.query("INSERT INTO TODO SET ?", newDeal, (err, res) => {
      //   SQL
      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);
});
};



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


All Articles