Créez votre propre API CRUD sur Express et MySQL: première partie

Bonjour à tous. En prévision du début du cours «Développeur Fullstack JavaScript» , nous souhaitons partager un peu de matériel écrit par notre rédacteur indépendant.



Express est l'un des frameworks Web les plus populaires qui prend en charge le routage, les poids moyens et un système de modèles. Faire un backend sur Node.js sans Express en 2020 est une activité plutôt étrange, car Express est un framework de facto pour construire une application web sur Node.js.
Aujourd'hui, nous allons essayer de créer une API CRUD simple en utilisant la base de données MySQL. Un lecteur expérimenté de Node.js demandera, où est MongoDB, avec lequel Node.js sont généralement utilisés en tandem, mais je dirai tout de suite que cet article s'adresse davantage aux développeurs PHP qui souhaitent toucher un peu à Node.js, et pour atténuer la transition vers un nouvel écosystème, nous nous utiliserons MySQL. Nous allons créer une API pour une application Todo simple, au cas où quelqu'un voudrait attacher à sa tâche (et peu importe si elle a été écrite avec React ou non), attachez un peu en arrière et jouez avec.


"L'architecture" et l'essence de notre application



Dans notre application, il sera possible de créer, recevoir, mettre à jour et supprimer Todo. En général, nous aurons un ensemble minimal de fonctions CRUD (création, lecture, suppression, mise à jour).

Au final, nous combinerons l'application avec l'application sur React et nous testerons tout.

Tout d'abord, je vais donner la structure des fichiers d'application:



Ensuite, je vais donner un tableau des actions et méthodes qui sont dans notre application:

Les méthodesURLActions
Avoir/ offresobtenir tous les cas
Avoir/ offres / 2Identifier avec le numéro 2
Publier/ offresajouter un nouveau cas
Mettre/ offres / 3Mettre Ă  jour l'utilisateur avec id = 3
SUPPRIMER/ offres / 3supprimer l'utilisateur avec id = 3
SUPPRIMER/ offressupprimer tous les utilisateurs

Création de votre application Node.js

Accédez à votre répertoire préféré, lancez le terminal et créez votre application. Au fait, il est probablement clair d'après le titre que Node.js devrait déjà être installé. Si vous ne l'avez pas déjà fait, cela ne peut tout simplement pas être téléchargé à partir du lien à partir d'ici.

    $ mkdir CRUD_API
    $ cd CRUD_API

Ensuite, vous devez initialiser notre application en utilisant npm init . Parce que notre application est plus un test et une formation, j'utiliserai une commande qui remplira toutes les données par défaut afin de ne pas perdre de temps sur de petits détails:

 npm init -y
 

Si c'est le cas, alors avec vos mains, package.jsonvous pouvez changer les données en celles dont vous avez besoin: le référentiel github, les balises, l'auteur, etc.

Ensuite, nous devons mettre tous les packages nécessaires au fonctionnement de l'application:

  npm i express mysql body-parser --save


Si vous allez envoyer votre développement à github plus tard, vous devez créer un fichier caché .gitignoreafin de ne pas faire glisser les nœuds_modules les plus lourds et de vous déshonorer . Nous écrivons:

    touch .gitignore 
    code .gitignore 

Nous y entrons node_modules, plus loin dans ce fichier, vous pouvez entrer les noms des dossiers et fichiers que vous souhaitez voir plus tard sur le serveur distant.

Configuration de base Express


Dans le dossier racine du projet, créez un fichier 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 ");
    });

Maintenant, nous pouvons démarrer le serveur avec:

node server.js

Nous avons besoin d'Express pour créer notre API, et le package body-parser nous aide à analyser la demande et à en créer req.bodyune qui est utile pour le routage.

Maintenant, notre serveur peut effectuer les opérations suivantes:

  • CrĂ©ez une application Express qui rend l'analyseur corporel un moyen intelligent en utilisant app.use ()
  • nous avons un simple get, juste pour tester l'application
  • Écoutez le port 3001 pour toutes les modifications entrantes

Au départ, notre application fonctionne, alors vous pouvez faire la base de données.

Créez votre table de données MySQL

J'espère vraiment que le lecteur de cet article n'a aucun problème à télécharger et à installer MySQL et MySQLWorkBranch par eux-mêmes. Ensuite, vous créez vous-même un schéma (DB) avec le nom que vous préférez (dans mon cas, TODO), puis sélectionnez la demande de foudre et copiez / tapez la commande suivante:

    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;

Dans notre base de données, tout sera au minimum: seulement l'id et le texte de l'affaire elle-même. Cependant, pour ajouter une autre colonne dans laquelle, par exemple, l'urgence de votre cas peut être décrite, j'espère que cela ne posera pas de problème.

Configuration et connexion avec notre base de données

Établissons et configurons la connexion à la base de données. Nous allons créer un nouveau dossier d'application directement dans notre dossier racine, et là nous allons créer un fichier db.config.jsdans le dossier config, avec approximativement le même contenu, qui dépend de vos paramètres dans MySQLWorkBranch. Dans mon cas, le fichier ressemblera à ceci:

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

Après cela, créez un dossier pour décrire nos modèles d' application / mode , dans lequel nous allons ensuite créer un modèle:

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

Créer un modèle

Dans le dossier model, nous créons un fichier appelé deal.model.js. Si vous avez une question, qu'est-ce qu'un modèle en général, vous devriez lire un article comme celui-ci et vous familiariser avec le modèle de conception MVC. Je vais créer un constructeur pour un objet Deal et utiliser la connexion pour les fonctions CRUD suivantes:

  • crĂ©ation d'une nouvelle entreprise
  • recherche de cas par identifiant
  • obtenir tous les cas
  • possibilitĂ© de mettre Ă  jour notre cas par id
  • Supprimer un cas par identifiant
  • suppression complète de tous les cas

Au total, nous devons faire les choses suivantes:

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


Je vais placer le reste du code dans le spoiler, car je ne vois aucune raison de tout apporter, car le modèle de code y est essentiellement répété, seules les commandes sql et les arguments changent:

le reste du code
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);
});
};



C'est tout pour le moment. La prochaine partie de cet article approche, dans laquelle nous finissons d'écrire le dos et commençons à le tester. Et par tradition, quelques liens utiles:


All Articles