Bygge Create-Post Endepunktet
Vi skal se nærmere på opprettelse av et nytt innlegg ved bruk av "CREATE POST"-ruten i postsRoutes.js-filen. Denne ruten har ansvaret for å håndtere opprettelsen av et innlegg og lagre det i datakilden (database/posts.json).
Rutedefinisjon
Koden nedenfor definerer "CREATE POST"-ruten ved bruk av router.post():
router.post("/", validatePostData, async (req, res, next) => { ... }
- Denne ruten er konfigurert for å håndtere HTTP POST-forespørsler til rotstien
/; - Den benytter
validatePostData-mellomvaren, som sikrer at dataene sendt i forespørselskroppen er gyldige før prosessen fortsetter.
Datavaliderings-mellomvare
Før vi går inn i logikken for ruten, må vi opprette en datavaliderings-mellomvare. Denne mellomvaren sikrer at dataene som sendes i forespørselskroppen er gyldige før vi forsøker å opprette et nytt innlegg.
// Middleware to validate post data
function validatePostData(req, res, next) {
const { username, postTitle, postContent } = req.body;
if (!username || !postTitle || !postContent) {
return res.status(400).json({ error: "Missing required fields" });
}
// If data is valid, proceed to the next route handler
next();
}
- Funksjonen
validatePostDatahenter utusername,postTitleogpostContentfra forespørselskroppen; - Den sjekker om disse feltene er til stede. Hvis noen av dem mangler (
!username,!postTitleeller!postContent), returnerer den en 400 (Bad Request) statuskode og en feilmelding som indikerer at påkrevde felter mangler; - Hvis dataene er gyldige, kaller mellomvaren
next(), slik at forespørselen kan fortsette til rutehåndtereren (i dette tilfellet "CREATE POST"-ruten).
Med datavaliderings-mellomvaren på plass, fortsetter vi med logikken for "CREATE POST"-ruten.
Nye postdata
For å opprette et nytt innlegg genererer vi en unik ID ved å bruke Date.now().toString(). I tillegg henter vi ut username, postTitle og postContent fra forespørselskroppen.
const newPost = {
id: Date.now().toString(),
username: req.body.username,
postTitle: req.body.postTitle,
postContent: req.body.postContent,
};
Legge til det nye innlegget i databasen
Følgende trinn beskriver hvordan det nye innlegget legges til i databasen:
const data = await readData();
data.push(newPost);
await fs.writeFile("./database/posts.json", JSON.stringify(data));
- Eksisterende data leses fra JSON-filen ved hjelp av den asynkrone funksjonen
readData, som tidligere forklart; - Det nye innlegget legges til i
data-arrayet; - Det oppdaterte
data-arrayet skrives deretter tilbake til JSON-filen for å lagre det nylig opprettede innlegget.
Sende et svar
Når det nye innlegget er opprettet, sendes et suksessvar til klienten. Svaret inkluderer statuskode 201 (Created) og detaljene om det nylig opprettede innlegget i JSON-format.
res.status(201).json(newPost);
Feilhåndtering
Rutekoden pakkes inn i en try-catch-blokk for å håndtere potensielle feil under datainnhenting eller forespørselsbehandling. Eventuelle feil som oppstår logges til konsollen for feilsøkingsformål:
try {
// ... (code for retrieving and processing data)
} catch (error) {
console.error(error.message);
}
Komplett kode for postsRoutes.js-filen på dette steget
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 {
// Generate a unique ID for the new post
const newPost = {
id: Date.now().toString(),
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);
}
});
Komplett kode for validateData.js-filen
// Middleware to validate post data
function validatePostData(req, res, next) {
const { username, postTitle, postContent } = req.body;
if (!username || !postTitle || !postContent) {
return res.status(400).json({ error: "Missing required fields" });
}
// If data is valid, proceed to the next route handler
next();
}
module.exports = validatePostData;
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
Can you explain how the validatePostData middleware works in more detail?
What happens if there is an error while writing to the posts.json file?
How can I test the "CREATE POST" route using a tool like Postman?
Awesome!
Completion rate improved to 2.56
Bygge Create-Post Endepunktet
Sveip for å vise menyen
Vi skal se nærmere på opprettelse av et nytt innlegg ved bruk av "CREATE POST"-ruten i postsRoutes.js-filen. Denne ruten har ansvaret for å håndtere opprettelsen av et innlegg og lagre det i datakilden (database/posts.json).
Rutedefinisjon
Koden nedenfor definerer "CREATE POST"-ruten ved bruk av router.post():
router.post("/", validatePostData, async (req, res, next) => { ... }
- Denne ruten er konfigurert for å håndtere HTTP POST-forespørsler til rotstien
/; - Den benytter
validatePostData-mellomvaren, som sikrer at dataene sendt i forespørselskroppen er gyldige før prosessen fortsetter.
Datavaliderings-mellomvare
Før vi går inn i logikken for ruten, må vi opprette en datavaliderings-mellomvare. Denne mellomvaren sikrer at dataene som sendes i forespørselskroppen er gyldige før vi forsøker å opprette et nytt innlegg.
// Middleware to validate post data
function validatePostData(req, res, next) {
const { username, postTitle, postContent } = req.body;
if (!username || !postTitle || !postContent) {
return res.status(400).json({ error: "Missing required fields" });
}
// If data is valid, proceed to the next route handler
next();
}
- Funksjonen
validatePostDatahenter utusername,postTitleogpostContentfra forespørselskroppen; - Den sjekker om disse feltene er til stede. Hvis noen av dem mangler (
!username,!postTitleeller!postContent), returnerer den en 400 (Bad Request) statuskode og en feilmelding som indikerer at påkrevde felter mangler; - Hvis dataene er gyldige, kaller mellomvaren
next(), slik at forespørselen kan fortsette til rutehåndtereren (i dette tilfellet "CREATE POST"-ruten).
Med datavaliderings-mellomvaren på plass, fortsetter vi med logikken for "CREATE POST"-ruten.
Nye postdata
For å opprette et nytt innlegg genererer vi en unik ID ved å bruke Date.now().toString(). I tillegg henter vi ut username, postTitle og postContent fra forespørselskroppen.
const newPost = {
id: Date.now().toString(),
username: req.body.username,
postTitle: req.body.postTitle,
postContent: req.body.postContent,
};
Legge til det nye innlegget i databasen
Følgende trinn beskriver hvordan det nye innlegget legges til i databasen:
const data = await readData();
data.push(newPost);
await fs.writeFile("./database/posts.json", JSON.stringify(data));
- Eksisterende data leses fra JSON-filen ved hjelp av den asynkrone funksjonen
readData, som tidligere forklart; - Det nye innlegget legges til i
data-arrayet; - Det oppdaterte
data-arrayet skrives deretter tilbake til JSON-filen for å lagre det nylig opprettede innlegget.
Sende et svar
Når det nye innlegget er opprettet, sendes et suksessvar til klienten. Svaret inkluderer statuskode 201 (Created) og detaljene om det nylig opprettede innlegget i JSON-format.
res.status(201).json(newPost);
Feilhåndtering
Rutekoden pakkes inn i en try-catch-blokk for å håndtere potensielle feil under datainnhenting eller forespørselsbehandling. Eventuelle feil som oppstår logges til konsollen for feilsøkingsformål:
try {
// ... (code for retrieving and processing data)
} catch (error) {
console.error(error.message);
}
Komplett kode for postsRoutes.js-filen på dette steget
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 {
// Generate a unique ID for the new post
const newPost = {
id: Date.now().toString(),
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);
}
});
Komplett kode for validateData.js-filen
// Middleware to validate post data
function validatePostData(req, res, next) {
const { username, postTitle, postContent } = req.body;
if (!username || !postTitle || !postContent) {
return res.status(400).json({ error: "Missing required fields" });
}
// If data is valid, proceed to the next route handler
next();
}
module.exports = validatePostData;
Takk for tilbakemeldingene dine!