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: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.json
der 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 .gitignore
nicht 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();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
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.body
zu 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.js
im Ordner config
mit 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 model
erstellen 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;
};
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 });
});
};
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 CodesDeal.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: