Erstellen Sie Ihre eigene CRUD-API unter Express und MySQL: Teil eins

Hallo alle zusammen. Im Vorgriff auf den Start des Kurses „Fullstack JavaScript Developer“ möchten wir ein kleines Material teilen, das von unserem freiberuflichen Autor geschrieben wurde.



Express ist eines der beliebtesten Webframeworks, das Routing, Mittelgewichte und ein Vorlagensystem unterstützt. Ein Backend auf Node.js ohne Express im Jahr 2020 zu erstellen, ist eine ziemlich seltsame Aktivität, da Express ein De-facto-Framework zum Erstellen einer Webanwendung auf Node.js ist.
Heute werden wir versuchen, eine einfache CRUD-API unter Verwendung der MySQL-Datenbank zu erstellen. Ein erfahrener Node.js-Leser wird fragen, wo sich MongoDB befindet, mit dem Node.js normalerweise zusammen verwendet wird. Ich möchte jedoch sofort sagen, dass dieser Artikel eher für PHP-Entwickler gedacht ist, die Node.js ein wenig berühren und den Übergang zu einem neuen Ökosystem abmildern möchten Wir werden MySQL verwenden. Wir erstellen eine API für eine einfache Todo-Anwendung, falls jemand eine Verbindung zu seiner Aufgabe herstellen möchte (und es spielt keine Rolle, ob sie mit React geschrieben wurde oder nicht), fügen Sie ein wenig zurück und spielen Sie damit.


"Architektur" und das Wesentliche unserer Anwendung



In unserer Anwendung ist es möglich, Todo zu erstellen, zu empfangen, zu aktualisieren und zu löschen. Im Allgemeinen verfügen wir nur über einen minimalen Satz von CRUD-Funktionen (Read Read Update Delete erstellen).

Am Ende werden wir die Anwendung mit der Anwendung auf React kombinieren und alles testen.

Zunächst gebe ich die Struktur der Anwendungsdateien an:



Als Nächstes gebe ich eine Tabelle mit Aktionen und Methoden an, die in unserer Anwendung enthalten sind:

MethodenUrlAktionen
Erhalten/ Angebotealle Fälle bekommen
Erhalten/ Angebote / 2ID mit Nummer 2 bekommen
Post/ AngeboteHinzufügen eines neuen Falls
Stellen/ Angebote / 3Benutzer mit id = 3 aktualisieren
LÖSCHEN/ Angebote / 3Benutzer mit ID = 3 löschen
LÖSCHEN/ AngeboteEntfernen Sie alle Benutzer

Erstellen Ihrer Node.js-Anwendung

Gehen Sie zu Ihrem Lieblingsverzeichnis, starten Sie das Terminal und erstellen Sie Ihre Anwendung. Übrigens geht aus dem Titel wahrscheinlich hervor, dass Node.js bereits installiert sein sollte. Wenn Sie dies noch nicht getan haben, kann dies einfach nicht über den Link von hier heruntergeladen werden.

    $ mkdir CRUD_API
    $ cd CRUD_API

Als nächstes müssen Sie unsere Anwendung mit npm init initialisieren . weil Unsere Anwendung ist eher eine Test- und Schulungsanwendung. Ich werde einen Befehl verwenden, der alle Standarddaten ausfüllt, um keine Zeit mit kleinen Details zu verschwenden:

 npm init -y
 

Wenn dies package.jsonder Fall ist, können Sie mit Ihren Händen die Daten in die Daten ändern, die Sie benötigen: das Github-Repository, Tags, Autor usw.

Dann müssen wir alle Pakete platzieren, die erforderlich sind, damit die Anwendung funktioniert:

  npm i express mysql body-parser --save


Wenn Sie Ihre Entwicklung später an github senden möchten, sollten Sie eine versteckte Datei erstellen, um .gitignorenicht die schwersten node_modules zu ziehen und sich selbst zu blamieren . Wir schreiben:

    touch .gitignore 
    code .gitignore 

Wir geben dort ein node_modules, später in dieser Datei können Sie die Namen der Ordner und Dateien eingeben, die Sie später auf dem Remote-Server sehen möchten.

Grundlegende Express-Einrichtung


Erstellen Sie im Stammordner des Projekts eine Datei 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 ");
    });

Jetzt können wir den Server starten mit:

node server.js

Wir benötigen Express, um unsere API zu erstellen, und das Body-Parser- Paket hilft uns, Anforderungen zu analysieren und eine req.bodyzu erstellen , die für das Routing nützlich ist.

Jetzt kann unser Server Folgendes tun:

  • Erstellen Sie mit app.use () eine Express-App, die Body-Parser zu einem Midlever macht.
  • Wir haben eine einfache Möglichkeit, nur um die Anwendung zu testen
  • Überwachen Sie Port 3001 auf alle eingehenden Änderungen

Zunächst funktioniert unsere Anwendung, dann können Sie die Datenbank erstellen.

Erstellen Sie Ihre MySQL-Datentabelle

Ich hoffe wirklich, dass der Leser dieses Artikels kein Problem damit hat, MySQL und MySQLWorkBranch selbst herunterzuladen und zu installieren. Als Nächstes erstellen Sie selbst ein Schema (DB) mit dem Namen, den Sie am besten mögen (in meinem Fall TODO), wählen dann die Blitzanforderung aus und kopieren / geben den folgenden Befehl ein:

    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;

In unserer Datenbank ist alles auf ein Minimum beschränkt: nur die ID und der Text des Falls selbst. Um jedoch eine weitere Spalte hinzuzufügen, in der beispielsweise die Dringlichkeit Ihres Falls beschrieben werden kann, hoffe ich, dass dies keine Probleme verursacht.

Konfiguration & Verbindung mit unserer Datenbank

Lassen Sie uns die Verbindung zur Datenbank herstellen und konfigurieren. Wir erstellen einen neuen App-Ordner direkt in unserem Stammordner und dort erstellen wir eine Datei db.config.jsim Ordner configmit ungefähr demselben Inhalt, der von Ihren Einstellungen in MySQLWorkBranch abhängt. In meinem Fall sieht die Datei folgendermaßen aus:

  module.exports = {
    HOST: "localhost",
    USER: "pavel",
    PASSWORD: "",
    DB: "TODO"
  };

Erstellen Sie anschließend einen Ordner zur Beschreibung unserer App- / Modusmodelle , in dem wir dann ein Modell erstellen:

  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;
   //  

Modell erstellen

In dem Ordner modelerstellen wir eine Datei namens deal.model.js. Wenn Sie eine Frage haben, was ein Modell im Allgemeinen ist, sollten Sie einen Artikel wie diesen lesen und sich mit dem MVC-Entwurfsmuster vertraut machen. Ich werde einen Konstruktor für ein Deal-Objekt erstellen und die Verbindung für die folgenden CRUD-Funktionen verwenden:

  • Gründung eines neuen Geschäfts
  • Fall anhand der ID finden
  • alle Fälle bekommen
  • Möglichkeit, unseren Fall anhand der ID zu aktualisieren
  • Löschen Sie einen Fall mit der ID
  • vollständige Löschung aller Fälle

Insgesamt müssen wir folgende Dinge tun:

  //   
  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 });
    });
  };


Ich werde den Rest des Codes in den Spoiler einfügen, da ich keinen Grund sehe, alles mitzubringen, da das Codemuster dort tatsächlich wiederholt wird und sich nur die SQL-Befehle und -Argumente ändern:

der Rest des Codes
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);
});
};



Das ist alles für jetzt. Der nächste Teil dieses Artikels nähert sich, in dem wir die Rückseite fertig schreiben und mit dem Testen beginnen. Und traditionell ein paar nützliche Links:


All Articles