Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Construindo o Endpoint DELETE de Post por ID | Construindo APIs REST com Node.js e Express.js
Desenvolvimento Backend com Node.js e Express.js

bookConstruindo o Endpoint DELETE de Post por ID

Vamos explorar a implementação da rota "DELETE POST BY ID" dentro do arquivo postsRoutes.js. Essa rota permite que os clientes excluam uma postagem específica fornecendo seu ID exclusivo.

Definição da Rota

O código abaixo define a rota "DELETE POST BY ID" utilizando router.delete():

router.delete("/post/:id", async (req, res, next) => { ... }

Essa rota lida com requisições HTTP DELETE com um parâmetro :id no caminho da rota. O parâmetro :id é utilizado para identificar a postagem a ser excluída. Não é necessário middleware adicional como dataValidation, pois todas as informações necessárias são obtidas a partir do parâmetro da URL.

Extração do ID da Postagem

Extraímos o ID da postagem dos parâmetros da requisição utilizando req.params.id:

const postId = req.params.id;

Essa linha captura o valor de :id da URL, permitindo que ele seja utilizado no código subsequente.

Excluir o Post

Veja como excluir o post:

const data = await readData();

const postIndex = data.findIndex((post) => post.id === postId);

if (postIndex === -1) {
  return res.status(404).json({ error: "Post not found" });
}

data.splice(postIndex, 1);

await fs.writeFile("./database/posts.json", JSON.stringify(data));
  • Inicialmente, os dados existentes são lidos do arquivo JSON utilizando a função assíncrona readData, conforme explicado anteriormente.
  • O índice do post a ser excluído é localizado no array data por meio da comparação dos IDs dos posts.
  • Caso o post não seja encontrado (ou seja, postIndex === -1), uma resposta 404 (Não Encontrado) é retornada com uma mensagem de erro.
  • Utilizando o método splice, os dados do post são removidos do array data. A variável postIndex determina a posição do post a ser excluído.
  • O array data atualizado, já sem o post, é gravado novamente no arquivo JSON para salvar as alterações realizadas durante a exclusão.

Envio de Resposta

Uma resposta JSON com o código de status 200 (OK) é enviada ao cliente, indicando que a exclusão foi realizada com sucesso. A resposta inclui uma mensagem confirmando que o post foi excluído com êxito:

res.status(200).json({ message: "Post deleted successfully" });

Tratamento de Erros

O código da rota é envolvido em um bloco try-catch para tratar possíveis erros durante a recuperação dos dados ou o processamento da requisição. Quaisquer erros que ocorram são registrados no console para fins de depuração:

try {
  // ... (code for retrieving and processing data)
} catch (error) {
  console.error(error.message);
}

Código completo do arquivo postsRoutes.js nesta etapa

const express = require("express");
const fs = require("fs/promises");
const validatePostData = require("../middlewares/validateData");

const router = express.Router();

// Function to read data from the JSON file
async function readData() {
  try {
    // Read the contents of the `posts.json` file
    const data = await fs.readFile("./database/posts.json");
    // Parse the JSON data into a JavaScript object
    return JSON.parse(data);
  } catch (error) {
    // If an error occurs during reading or parsing, throw the error
    throw error;
  }
}

// GET ALL POSTS
router.get("/", async (req, res, next) => {
  try {
    // Call the `readData` function to retrieve the list of posts
    const data = await readData();
    // Send the retrieved data as the response
    res.status(200).send(data);
  } catch (error) {
    // If an error occurs during data retrieval or sending the response
    console.error(error.message); // Log the error to the console for debugging
  }
});

// GET POST BY ID
router.get("/post/:id", async (req, res, next) => {
  try {
    // Extract the post ID from the request parameters
    const postId = req.params.id;
    // Read data from the JSON file
    const data = await readData();

    // Find the post with the matching ID
    const post = data.find((post) => post.id === postId);

    // If the post is not found, send a 404 response
    if (!post) {
      res.status(404).json({ error: "Post not found" });
    } else {
      // If the post is found, send it as the response
      res.status(200).send(post);
    }
  } catch (error) {
    // Handle errors by logging them and sending an error response
    console.error(error.message);
  }
});

// CREATE POST
router.post("/", validatePostData, async (req, res, next) => {
  try {
    const newPost = {
      id: Date.now().toString(), // Generate a unique ID for the new post
      username: req.body.username,
      postTitle: req.body.postTitle,
      postContent: req.body.postContent,
    };

    // Read the existing data
    const data = await readData();

    // Add the new post to the data
    data.push(newPost);

    // Write the updated data back to the JSON file
    await fs.writeFile("./database/posts.json", JSON.stringify(data));

    // Send a success response with the new post
    res.status(201).json(newPost);
  } catch (error) {
    // Handle errors by logging them to the console
    console.error(error.message);
  }
});

// UPDATE POST BY ID
router.put("/post/:id", validatePostData, async (req, res, next) => {
  try {
    // Extract the post ID from the request parameters
    const postId = req.params.id;
    // Extract the updated data from the request body
    const updatedData = {
      username: req.body.username,
      postTitle: req.body.postTitle,
      postContent: req.body.postContent,
    };

    // Read the existing data
    const data = await readData();

    // Find the index of the post with the specified ID in the data array
    const postIndex = data.findIndex((post) => post.id === postId);

    // If the post with the specified ID doesn't exist, return a 404 error
    if (postIndex === -1) {
      return res.status(404).json({ error: "Post not found" });
    }

    // Update the post data with the new data using spread syntax
    data[postIndex] = {
      ...data[postIndex], // Keep existing data
      ...updatedData, // Apply updated data
    };

    // Write the updated data back
    await fs.writeFile("./database/posts.json", JSON.stringify(data));

    // Send a success response with the updated post
    res.status(200).json(data[postIndex]);
  } catch (error) {
    console.error(error.message);
    next(error);
  }
});

// DELETE POST BY ID
router.delete("/post/:id", async (req, res, next) => {
  try {
    // Extract the post ID from the request parameters
    const postId = req.params.id;

    // Read the existing data
    const data = await readData();

    // Find the index of the post with the specified ID in the data array
    const postIndex = data.findIndex((post) => post.id === postId);

    // If the post with the specified ID doesn't exist, return a 404 error
    if (postIndex === -1) {
      return res.status(404).json({ error: "Post not found" });
    }

    // Remove the post from the data array using `splice`
    data.splice(postIndex, 1);

    // Write the updated data back to the data source (e.g., a JSON file)
    await fs.writeFile("./database/posts.json", JSON.stringify(data));

    // Send a success response with the JSON response indicating successful deletion
    res.status(200).json({ message: "Post deleted successfully" });
  } catch (error) {
    console.error(error.message);
    next(error);
  }
});

module.exports = router;

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 4. Capítulo 9

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Awesome!

Completion rate improved to 2.56

bookConstruindo o Endpoint DELETE de Post por ID

Deslize para mostrar o menu

Vamos explorar a implementação da rota "DELETE POST BY ID" dentro do arquivo postsRoutes.js. Essa rota permite que os clientes excluam uma postagem específica fornecendo seu ID exclusivo.

Definição da Rota

O código abaixo define a rota "DELETE POST BY ID" utilizando router.delete():

router.delete("/post/:id", async (req, res, next) => { ... }

Essa rota lida com requisições HTTP DELETE com um parâmetro :id no caminho da rota. O parâmetro :id é utilizado para identificar a postagem a ser excluída. Não é necessário middleware adicional como dataValidation, pois todas as informações necessárias são obtidas a partir do parâmetro da URL.

Extração do ID da Postagem

Extraímos o ID da postagem dos parâmetros da requisição utilizando req.params.id:

const postId = req.params.id;

Essa linha captura o valor de :id da URL, permitindo que ele seja utilizado no código subsequente.

Excluir o Post

Veja como excluir o post:

const data = await readData();

const postIndex = data.findIndex((post) => post.id === postId);

if (postIndex === -1) {
  return res.status(404).json({ error: "Post not found" });
}

data.splice(postIndex, 1);

await fs.writeFile("./database/posts.json", JSON.stringify(data));
  • Inicialmente, os dados existentes são lidos do arquivo JSON utilizando a função assíncrona readData, conforme explicado anteriormente.
  • O índice do post a ser excluído é localizado no array data por meio da comparação dos IDs dos posts.
  • Caso o post não seja encontrado (ou seja, postIndex === -1), uma resposta 404 (Não Encontrado) é retornada com uma mensagem de erro.
  • Utilizando o método splice, os dados do post são removidos do array data. A variável postIndex determina a posição do post a ser excluído.
  • O array data atualizado, já sem o post, é gravado novamente no arquivo JSON para salvar as alterações realizadas durante a exclusão.

Envio de Resposta

Uma resposta JSON com o código de status 200 (OK) é enviada ao cliente, indicando que a exclusão foi realizada com sucesso. A resposta inclui uma mensagem confirmando que o post foi excluído com êxito:

res.status(200).json({ message: "Post deleted successfully" });

Tratamento de Erros

O código da rota é envolvido em um bloco try-catch para tratar possíveis erros durante a recuperação dos dados ou o processamento da requisição. Quaisquer erros que ocorram são registrados no console para fins de depuração:

try {
  // ... (code for retrieving and processing data)
} catch (error) {
  console.error(error.message);
}

Código completo do arquivo postsRoutes.js nesta etapa

const express = require("express");
const fs = require("fs/promises");
const validatePostData = require("../middlewares/validateData");

const router = express.Router();

// Function to read data from the JSON file
async function readData() {
  try {
    // Read the contents of the `posts.json` file
    const data = await fs.readFile("./database/posts.json");
    // Parse the JSON data into a JavaScript object
    return JSON.parse(data);
  } catch (error) {
    // If an error occurs during reading or parsing, throw the error
    throw error;
  }
}

// GET ALL POSTS
router.get("/", async (req, res, next) => {
  try {
    // Call the `readData` function to retrieve the list of posts
    const data = await readData();
    // Send the retrieved data as the response
    res.status(200).send(data);
  } catch (error) {
    // If an error occurs during data retrieval or sending the response
    console.error(error.message); // Log the error to the console for debugging
  }
});

// GET POST BY ID
router.get("/post/:id", async (req, res, next) => {
  try {
    // Extract the post ID from the request parameters
    const postId = req.params.id;
    // Read data from the JSON file
    const data = await readData();

    // Find the post with the matching ID
    const post = data.find((post) => post.id === postId);

    // If the post is not found, send a 404 response
    if (!post) {
      res.status(404).json({ error: "Post not found" });
    } else {
      // If the post is found, send it as the response
      res.status(200).send(post);
    }
  } catch (error) {
    // Handle errors by logging them and sending an error response
    console.error(error.message);
  }
});

// CREATE POST
router.post("/", validatePostData, async (req, res, next) => {
  try {
    const newPost = {
      id: Date.now().toString(), // Generate a unique ID for the new post
      username: req.body.username,
      postTitle: req.body.postTitle,
      postContent: req.body.postContent,
    };

    // Read the existing data
    const data = await readData();

    // Add the new post to the data
    data.push(newPost);

    // Write the updated data back to the JSON file
    await fs.writeFile("./database/posts.json", JSON.stringify(data));

    // Send a success response with the new post
    res.status(201).json(newPost);
  } catch (error) {
    // Handle errors by logging them to the console
    console.error(error.message);
  }
});

// UPDATE POST BY ID
router.put("/post/:id", validatePostData, async (req, res, next) => {
  try {
    // Extract the post ID from the request parameters
    const postId = req.params.id;
    // Extract the updated data from the request body
    const updatedData = {
      username: req.body.username,
      postTitle: req.body.postTitle,
      postContent: req.body.postContent,
    };

    // Read the existing data
    const data = await readData();

    // Find the index of the post with the specified ID in the data array
    const postIndex = data.findIndex((post) => post.id === postId);

    // If the post with the specified ID doesn't exist, return a 404 error
    if (postIndex === -1) {
      return res.status(404).json({ error: "Post not found" });
    }

    // Update the post data with the new data using spread syntax
    data[postIndex] = {
      ...data[postIndex], // Keep existing data
      ...updatedData, // Apply updated data
    };

    // Write the updated data back
    await fs.writeFile("./database/posts.json", JSON.stringify(data));

    // Send a success response with the updated post
    res.status(200).json(data[postIndex]);
  } catch (error) {
    console.error(error.message);
    next(error);
  }
});

// DELETE POST BY ID
router.delete("/post/:id", async (req, res, next) => {
  try {
    // Extract the post ID from the request parameters
    const postId = req.params.id;

    // Read the existing data
    const data = await readData();

    // Find the index of the post with the specified ID in the data array
    const postIndex = data.findIndex((post) => post.id === postId);

    // If the post with the specified ID doesn't exist, return a 404 error
    if (postIndex === -1) {
      return res.status(404).json({ error: "Post not found" });
    }

    // Remove the post from the data array using `splice`
    data.splice(postIndex, 1);

    // Write the updated data back to the data source (e.g., a JSON file)
    await fs.writeFile("./database/posts.json", JSON.stringify(data));

    // Send a success response with the JSON response indicating successful deletion
    res.status(200).json({ message: "Post deleted successfully" });
  } catch (error) {
    console.error(error.message);
    next(error);
  }
});

module.exports = router;

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 4. Capítulo 9
some-alt