Dezvoltare Backend - rute*

1. GET /messages

Din pașii trecuți, metoda GET /messages arată astfel

app.get("/messages", (req, res) => {
  connection.query("SELECT * FROM messages", (err, results) => {
    if (err) {
      return res.send(err);
    }

    return res.json({
      messages: results,
    });
  });
});

2. POST /messages

  • Pentru a implementa metoda POST /messages, vom instala și pachetul body-parser. ( npm install ... ).

  • Vom utiliza mai multe metode de procesare a body-ului trimis prin metoda POST, așa că vom transmite aplicației express următoarele instrucțiuni

// index.js
const bodyParser = require("body-parser");

// for parsing application/json
app.use(bodyParser.json()); 

// for parsing application/xwww-
app.use(bodyParser.urlencoded({ extended: true }));
  • Inițializăm și metoda POST /messages și aplicăm metoda mysql.escape() pe datele primite pentru a proteja baza de date de atacuri de tip injection

// index.js
app.post("/messages", (req, res) => {
  const {
    senderName,
    senderMail,
    receiverMail,
    messageContent
  } = req.body;
  
  if (!senderName || !senderMail || !receiverMail || !messageContent ) {
    // send bad request error
    return res.status(400).send("Bad request. Missing parametres.");
  }

  const queryString = `INSERT INTO messages (senderName, senderMail, receiverMail, messageContent) VALUES (${mysql.escape(senderName)}, ${mysql.escape(senderMail)}, ${mysql.escape(receiverMail)}, ${mysql.escape(messageContent)})`;

  connection.query(queryString, (err, results) => {
    if (err) {
      return res.send(err);
    }

    return res.json({
      data: results,
    });
  });
});

* Crearea unui Express Router

Putem observa dimensiunea fișierului index.js crește considerabil după fiecare nou endpoint pe care îl definim. Desigur, această metodă de definire a endpoint-urilor nu este optimă. Din fericire, NodeJS + Express ne oferă posibilitatea de a organiza rutele cu ajutorul unor Routere.

  • Creați un director nou in root-ul proiectului, îl vom denumi routers. În interiorul lui, creați fișierul messagesRouter.js

  • Cut and Paste funcțiilor app.get() și app.post() din index.js. De asemenea, Cut and Paste importurilor de care avem nevoie (mysql, connection (ATENȚIE - se va schimba path-ul relativ pentru db.js))

  • Definim routerul pe care îl vom exporta

// messagesRouter.js
const router = express.Router();
  • Înlocuim app cu router. Putem de asemenea să ștergem "/messages", vom preciza calea default a router-ului nostru in index.js

  • Exportăm router-ul la final

// messagesRouter.js
module.exports = router;
  • Codul până în acest punct cu toate endpoint-urile initiale (GET, GET/id, POST/ PUT/ DELETE) definite

// messagesRouter.js
const connection = require("../db.js");
const mysql = require("mysql");
const express = require("express");
const router = express.Router();

router.get("/", (req, res) => {
  connection.query("SELECT * FROM messages", (err, results) => {
    if (err) {
      return res.send(err);
    }

    return res.json({
      messages: results,
    });
  });
});

router.post("/", (req, res) => {
  const { senderName, senderMail, receiverMail, messageContent } = req.body;
  
  if (!senderName || !senderMail || !receiverMail || !messageContent || !language) {
    // send bad request error
    return res.status(400).send("Bad request. Missing parametres.");
  }

  const queryString = `INSERT INTO messages (senderName, senderMail, receiverMail, messageContent) VALUES (${mysql.escape(
    senderName
  )}, ${mysql.escape(senderMail)}, ${mysql.escape(
    receiverMail
  )}, ${mysql.escape(messageContent)})`;

  connection.query(queryString, (err, results) => {
    if (err) {
      return res.send(err);
    }

    return res.json({
      data: results,
    });
  });
});

// Add get by id route
router.get("/:id", (req, res) => {
    const { id } = req.params;
    if (!id) {
        // send bad request error
        return res.status(400).send("Bad request. Missing parametres.");
    }
    const queryString = `SELECT * FROM messages WHERE entryID = ${mysql.escape(id)}`;
    connection.query(queryString, (err, results) => {
        if (err) {
            return res.send(err);
        }
        if (results.length === 0) {
            return res.status(404).send("Message not found.");
        }
        return res.json({
            messages: results,
        });
    }
    );
}
);

// Add delete by id route
router.delete("/:id", (req, res) => {
    const { id } = req.params;
    if (!id) {
        // send bad request error
        return res.status(400).send("Bad request. Missing parametres.");
    }
    const queryString = `DELETE FROM messages WHERE entryID = ${mysql.escape(id)}`;
    connection.query(queryString, (err, results) => {
        if (err) {
            return res.send(err);
        }
        if (results.length === 0) {
            return res.status(404).send("Message not found.");
        }
        return res.json({
            results,
        });
    }
    );
}
);

// Add update by id route
router.put("/:id", (req, res) => {
    const { id } = req.params;
    if (!id) {
        // send bad request error
        return res.status(400).send("Bad request. Missing parametres.");
    }
    const { senderName, senderMail, receiverMail, messageContent } = req.body;
    if (!senderName || !senderMail || !receiverMail || !messageContent) {
        // send bad request error
        return res.status(400).send("Bad request. Missing parametres.");
    }
    const queryString = `UPDATE messages SET senderName = ${mysql.escape(senderName)}, senderMail = ${mysql.escape(senderMail)}, receiverMail = ${mysql.escape(receiverMail)}, messageContent = ${mysql.escape(messageContent)} WHERE entryID = ${mysql.escape(id)}`;
    connection.query(queryString, (err, results) => {
        if (err) {
            return res.send(err);
        }
        if (results.length === 0) {
            return res.status(404).send("Message not found.");
        }
        return res.json({
            results,
        });
    }
    );
}
);


module.exports = router;
  • În fișierul index.js -> importam router-ul nou creat și precizăm faptul că app va folosi router-ul nou creat pe ruta /messages. Codul in index.js până în acest punct - am evidențiat liniile modificate cu un comentariu //look here

// index.js
const express = require("express");
const messagesRouter = require("./routers/messagesRouter"); //look here
const bodyParser = require("body-parser");

const app = express();
// for parsing application/json
app.use(bodyParser.json()); 

// for parsing application/xwww-
app.use(bodyParser.urlencoded({ extended: true }));

app.use('/messages', messagesRouter); //and look here too

const port = 8080;
app.listen(port, () => {
  console.log(`Example app listening on port ${port}!`);
});

Last updated