Construindo 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
datapor 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 arraydata. A variávelpostIndexdetermina a posição do post a ser excluído. - O array
dataatualizado, 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;
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Can you explain how the error handling works in the DELETE route?
What would happen if the post ID provided does not exist?
Can you summarize the main steps involved in deleting a post?
Awesome!
Completion rate improved to 2.56
Construindo 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
datapor 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 arraydata. A variávelpostIndexdetermina a posição do post a ser excluído. - O array
dataatualizado, 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;
Obrigado pelo seu feedback!