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

bookConstruindo o Endpoint Update de Post por Id

Vamos analisar como atualizar uma postagem existente utilizando a rota "UPDATE POST BY ID" no arquivo postsRoutes.js. Esta rota é responsável por atualizar uma postagem com base em seu ID exclusivo.

Definição da Rota

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

router.put("/post/:id", validatePostData, async (req, res, next) => { ... }
  • Esta rota está configurada para lidar com requisições HTTP PUT, especificamente para atualização de postagens;
  • Inclui um parâmetro :id no caminho da rota para identificar a postagem a ser atualizada;
  • O middleware validatePostData é adicionado para garantir a validação dos dados antes de prosseguir. A lógica do middleware validatePostData permanece a mesma do passo anterior.

Obtendo Dados da Requisição

Aqui, são extraídos os dados necessários da requisição, incluindo o ID da postagem e o conteúdo atualizado da postagem:

const postId = req.params.id;
const updatedData = {
  username: req.body.username,
  postTitle: req.body.postTitle,
  postContent: req.body.postContent,
};
  • O ID da postagem é extraído dos parâmetros da requisição, tornando-o disponível para processamento posterior. O parâmetro :id da URL da rota é capturado utilizando req.params.id;
  • Os campos username, postTitle e postContent são extraídos do corpo da requisição.

Atualizando a Postagem no Banco de Dados

A atualização de uma postagem existente envolve várias etapas, conforme descrito abaixo:

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[postIndex] = {
  ...data[postIndex],
  ...updatedData,
};

await fs.writeFile("./database/posts.json", JSON.stringify(data));
  • Os dados existentes são lidos do arquivo JSON utilizando a função assíncrona readData, conforme explicado anteriormente;
  • A variável postIndex armazena o índice da postagem a ser atualizada no array data, comparando os IDs das postagens;
  • Caso a postagem não seja encontrada (ou seja, postIndex === -1), uma resposta 404 (Não Encontrado) com uma mensagem de erro é retornada ao cliente;
  • Para atualizar os dados da postagem, os dados existentes (...data[postIndex]) são mesclados com os dados atualizados (...updatedData). Isso garante que apenas os campos especificados sejam atualizados e os dados existentes sejam mantidos;
  • Por fim, o array data atualizado é gravado novamente no arquivo JSON para salvar as alterações feitas na postagem.

Enviando uma Resposta

Após a atualização bem-sucedida da postagem, uma resposta JSON é enviada ao cliente. A resposta inclui um código de status 200 (OK), indicando uma atualização bem-sucedida e os dados da postagem atualizada.

res.status(200).json(data[postIndex]);

Tratamento de Erros

O código da rota é envolvido em um bloco try-catch para lidar com possíveis erros durante a recuperação de dados ou 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 neste passo

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

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 4. Capítulo 8

Pergunte à IA

expand

Pergunte à IA

ChatGPT

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

Suggested prompts:

Can you explain how the validatePostData middleware works?

What should I do if I get a "Post not found" error when updating?

Can you show how to test the update route with an example request?

Awesome!

Completion rate improved to 2.56

bookConstruindo o Endpoint Update de Post por Id

Deslize para mostrar o menu

Vamos analisar como atualizar uma postagem existente utilizando a rota "UPDATE POST BY ID" no arquivo postsRoutes.js. Esta rota é responsável por atualizar uma postagem com base em seu ID exclusivo.

Definição da Rota

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

router.put("/post/:id", validatePostData, async (req, res, next) => { ... }
  • Esta rota está configurada para lidar com requisições HTTP PUT, especificamente para atualização de postagens;
  • Inclui um parâmetro :id no caminho da rota para identificar a postagem a ser atualizada;
  • O middleware validatePostData é adicionado para garantir a validação dos dados antes de prosseguir. A lógica do middleware validatePostData permanece a mesma do passo anterior.

Obtendo Dados da Requisição

Aqui, são extraídos os dados necessários da requisição, incluindo o ID da postagem e o conteúdo atualizado da postagem:

const postId = req.params.id;
const updatedData = {
  username: req.body.username,
  postTitle: req.body.postTitle,
  postContent: req.body.postContent,
};
  • O ID da postagem é extraído dos parâmetros da requisição, tornando-o disponível para processamento posterior. O parâmetro :id da URL da rota é capturado utilizando req.params.id;
  • Os campos username, postTitle e postContent são extraídos do corpo da requisição.

Atualizando a Postagem no Banco de Dados

A atualização de uma postagem existente envolve várias etapas, conforme descrito abaixo:

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[postIndex] = {
  ...data[postIndex],
  ...updatedData,
};

await fs.writeFile("./database/posts.json", JSON.stringify(data));
  • Os dados existentes são lidos do arquivo JSON utilizando a função assíncrona readData, conforme explicado anteriormente;
  • A variável postIndex armazena o índice da postagem a ser atualizada no array data, comparando os IDs das postagens;
  • Caso a postagem não seja encontrada (ou seja, postIndex === -1), uma resposta 404 (Não Encontrado) com uma mensagem de erro é retornada ao cliente;
  • Para atualizar os dados da postagem, os dados existentes (...data[postIndex]) são mesclados com os dados atualizados (...updatedData). Isso garante que apenas os campos especificados sejam atualizados e os dados existentes sejam mantidos;
  • Por fim, o array data atualizado é gravado novamente no arquivo JSON para salvar as alterações feitas na postagem.

Enviando uma Resposta

Após a atualização bem-sucedida da postagem, uma resposta JSON é enviada ao cliente. A resposta inclui um código de status 200 (OK), indicando uma atualização bem-sucedida e os dados da postagem atualizada.

res.status(200).json(data[postIndex]);

Tratamento de Erros

O código da rota é envolvido em um bloco try-catch para lidar com possíveis erros durante a recuperação de dados ou 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 neste passo

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

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

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