Archives Wild Code School
Express.js

Express 03 - 🛾 MĂ©thode PUT et modification des donnĂ©es

QuĂȘte 5 sur 12 · 1 image archivĂ©e

⚠ Avant de commencer cette quĂȘte, nous te recommandons de jeter un Ɠil Ă  celle-ci :
QuĂȘtes liĂ©es

Dans les quĂȘtes prĂ©cĂ©dentes, tu as appris à :

  • Configurer et crĂ©er un serveur avec Express
  • CrĂ©er des routes basiques
  • RĂ©cupĂ©rer des informations de ta base de donnĂ©es
  • InsĂ©rer de nouvelles donnĂ©es dans ta base de donnĂ©es

Dans cette quĂȘte, tu vas apprendre comment modifier des donnĂ©es existantes. Voyons comment faire en utilisant Express et MySQL.

đŸ€“ Dans cette quĂȘte, tu vas apprendre comment :

✅ Écrire des routes PUT ✅ Modifier des donnĂ©es dans la base de donnĂ©es ✅ Tester tes routes PUT avec Postman

đŸ’Ÿ Comment crĂ©er un HANDLER de routes PUT avec Express ?

Une pratique courante consiste à utiliser les verbes HTTP PUT ou PATCH pour spécifier que nous voulons modifier quelque chose qui existe déjà dans la base de données. Par souci de simplicité, nous n'utiliserons que PUT pour le moment.

Encore une fois, d'une certaine maniĂšre, tu sais dĂ©jĂ  quoi faire. Auparavant, face Ă  une requĂȘte comme celle-ci :

http
GET http://localhost:5000/api/movies/2

Tu as déclaré une route pour y répondre comme ceci :

javascript
app.get("/api/movies/:id", HANDLER);

Ensuite dans le HANDLER, tu as récupéré le 2 de l'URL via req.params.id.

Face Ă  ce genre de requĂȘte :

http
POST http://localhost:5000/api/movies
Content-type: application/json

{
  "title": "Citizen Kane",
  "director": "Orson Wells",
  "year": "1941",
  "color": "0",
  "duration": 120
}

Tu as déclaré ta route comme ceci :

javascript
app.post("/api/movies", HANDLER);

Et tu as récupéré les détails du film dans HANDLER via req.body.

Maintenant, nous voulons gĂ©rer des requĂȘtes de mise Ă  jour des ressources, comme celle-ci :

http
PUT http://localhost:5000/api/movies/2
Content-type: application/json

{
  "title": "Citizen Kane",
  "director": "Orson Wells",
  "year": "1941",
  "color": "0",
  "duration": 120
}

Pour ce dernier exemple :

quiz
false|||true|||false
# Quelle méthode d'app dois-tu utiliser pour déclarer la route ?
[] `app.post()`
[] `app.get()`
[] `app.delete()`
[x] `app.put()`
# Quel chemin dois-tu utiliser comme premier paramÚtre ?
[x] `"/api/movies/:id"`
[] `"/api/movies"`
[] `"/api/users"`
[] `"/api/users/:id"`
# Via quelle propriĂ©tĂ© de requĂȘte vas-tu rĂ©cupĂ©rer l'id du film ?
[x] `req.params`
[] `req.body`
[] `req.query`
# A travers quelle propriĂ©tĂ© de requĂȘte vas-tu rĂ©cupĂ©rer le titre du film, le rĂ©alisateur... ?
[] `req.params`
[x] `req.body`
[] `req.query`
# Quelle opération SQL vas-tu effectuer ici ?
[] `SELECT`
[] `INSERT`
[x] `UPDATE`
[] `DELETE`

C'est suffisant pour un premier jet. Essaye de crĂ©er la route pour PUT /api/movies/:id. Pense Ă  consulter cette page pour choisir le statut HTTP adaptĂ© Ă  ta rĂ©ponse. En cas de succĂšs, tu n'auras aucun contenu Ă  renvoyer au client, car il sait dĂ©jĂ  tout (identifiant et dĂ©tails du film). Si l'id n'existait pas dans la base de donnĂ©es, tu le sauras en vĂ©rifiant le rĂ©sultat de ta requĂȘte UPDATE (console.log() est ton ami) : la requĂȘte n'aura affectĂ© aucune ligne.

hidden
Voir la solution|||javascript|||Tu as des doutes sur comment faire ? |||0|||Masquer
// in src/controllers/movieControllers.js

const updateMovie = (req, res) => {
  const id = parseInt(req.params.id);
  const { title, director, year, color, duration } = req.body;

  database
    .query(
      "update movies set title = ?, director = ?, year = ?, color = ?, duration = ? where id = ?",
      [title, director, year, color, duration, id]
    )
    .then(([result]) => {
      if (result.affectedRows === 0) {
        res.sendStatus(404);
      } else {
        res.sendStatus(204);
      }
    })
    .catch((err) => {
      console.error(err);
      res.sendStatus(500);
    });
};

module.exports = {
  getMovies,
  getMovieById,
  postMovie,
  updateMovie, // don't forget to export your function ;)
};

// in app.js

app.put("/api/movies/:id", movieControllers.updateMovie);

Tester notre route PUT

CrĂ©e un nouveau film en utilisant la route POST. Fais dĂ©filer la liste des mĂ©thodes et sĂ©lectionne "PUT". Ensuite, modifie les donnĂ©es dans le corps de la requĂȘte (met une blague sur le titre par exemple).

Clique sur "Send", et vois le résultat. Essaye de PUT sur un id invalide : cette fois ton serveur devrait répondre "Not Found" ;)

đŸ’Ș Challenge

Modification d'un utilisateur dans la base de données

Maintenant que tu as créé la route PUT pour les films, crée la route PUT pour mettre à jour les utilisateurs !

  • CrĂ©ez une route PUT pour le chemin /api/users/:id : ta route modifiera un utilisateur dans la base de donnĂ©es
  • Publie un lien GitHub pour partager ta solution

🧐 Critùres d'acceptation

  • [ ] Le GitHub contient une route PUT pour les utilisateurs
  • [ ] Une requĂȘte PUT sur /api/users/:id devrait mettre Ă  jour le bon utilisateur dans la base de donnĂ©es

==$== Ce que tu devrais avoir dans :

javascript
// ...

const movieControllers = require("./controllers/movieControllers");

app.get("/api/movies", movieControllers.getMovies);
app.get("/api/movies/:id", movieControllers.getMovieById);
app.post("/api/movies", movieControllers.postMovie);
app.put("/api/movies/:id", movieControllers.updateMovie);

const userControllers = require("./controllers/userControllers");

app.get("/api/users", userControllers.getUsers);
app.get("/api/users/:id", userControllers.getUserById);
app.post("/api/users", userControllers.postUser);
app.put("/api/users/:id", userControllers.updateUser);

// ...
javascript
// ...

const updateUser = (req, res) => {
  const id = parseInt(req.params.id);
  const { firstname, lastname, email, city, language } = req.body;

  database
    .query(
      "update users set firstname = ?, lastname = ?, email = ?, city = ?, language = ? where id = ?",
      [firstname, lastname, email, city, language, id]
    )
    .then(([result]) => {
      if (result.affectedRows === 0) {
        res.sendStatus(404);
      } else {
        res.sendStatus(204);
      }
    })
    .catch((err) => {
      console.error(err);
      res.sendStatus(500);
    });
};

module.exports = {
  getUsers,
  getUserById,
  postUser,
  updateUser,
};
javascript
// ...

const updateMovie = (req, res) => {
  const id = parseInt(req.params.id);
  const { title, director, year, color, duration } = req.body;

  database
    .query(
      "update movies set title = ?, director = ?, year = ?, color = ?, duration = ? where id = ?",
      [title, director, year, color, duration, id]
    )
    .then(([result]) => {
      if (result.affectedRows === 0) {
        res.sendStatus(404);
      } else {
        res.sendStatus(204);
      }
    })
    .catch((err) => {
      console.error(err);
      res.sendStatus(500);
    });
};

module.exports = {
  getMovies,
  getMovieById,
  postMovie,
  updateMovie,
};