Opbygning af Create Post-endpointet
Stryg for at vise menuen
Vi vil undersøge oprettelsen af et nyt opslag ved hjælp af "CREATE POST"-ruten i filen postsRoutes.js. Denne rute har ansvaret for at håndtere oprettelsen af et opslag og gemme det i datakilden (database/posts.json).
Rutedefinition
Koden nedenfor definerer "CREATE POST"-ruten ved hjælp af router.post():
router.post("/", validatePostData, async (req, res, next) => { ... }
- Denne rute er konfigureret til at håndtere HTTP POST-anmodninger til rodstien
/; - Den benytter middleware-funktionen
validatePostData, som sikrer, at dataene sendt i anmodningens body er gyldige, før der fortsættes.
Middleware til datavalidering
Før vi går videre til rutens logik, skal vi oprette en middleware til datavalidering. Denne middleware sikrer, at de data, der sendes i request body, er gyldige, før der forsøges at oprette et nyt opslag.
// 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();
}
- Funktionen
validatePostDataudtrækkerusername,postTitleogpostContentfra request body; - Den kontrollerer, om disse felter er til stede. Hvis et af dem mangler (
!username,!postTitleeller!postContent), returneres en 400 (Bad Request) statuskode og en fejlmeddelelse, der angiver manglende påkrævede felter; - Hvis dataene er gyldige, kalder middleware-funktionen
next(), så anmodningen kan fortsætte til route handleren (i dette tilfælde "CREATE POST"-ruten).
Med datavaliderings-middleware på plads kan vi fortsætte med logikken for "CREATE POST"-ruten.
Data for nyt opslag
For at oprette et nyt opslag genereres et unikt ID ved hjælp af Date.now().toString(). Derudover udtrækkes username, postTitle og postContent fra request body.
const newPost = {
id: Date.now().toString(),
username: req.body.username,
postTitle: req.body.postTitle,
postContent: req.body.postContent,
};
Tilføj det nye opslag til databasen
Følgende trin beskriver, hvordan det nye opslag tilføjes til databasen:
const data = await readData();
data.push(newPost);
await fs.writeFile("./database/posts.json", JSON.stringify(data));
- De eksisterende data læses fra JSON-filen ved hjælp af den asynkrone funktion
readData, som tidligere beskrevet; - Det nye opslag tilføjes til
data-arrayet; - Det opdaterede
data-array skrives derefter tilbage til JSON-filen for at gemme det nyoprettede opslag.
Afsendelse af svar
Når det nye opslag er oprettet med succes, sendes et succes-svar til klienten. Svaret inkluderer en statuskode på 201 (Oprettet) og detaljerne om det nyoprettede opslag i JSON-format.
res.status(201).json(newPost);
Fejlhåndtering
Vi indkapsler rute-koden i et try-catch-blok for at håndtere potentielle fejl under datahentning eller behandling af forespørgslen. Eventuelle fejl, der opstår, logges til konsollen til fejlsøgning:
try {
// ... (code for retrieving and processing data)
} catch (error) {
console.error(error.message);
}
Komplet kode for postsRoutes.js-filen på dette trin
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);
}
});
Fuldt kodeeksempel 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;
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat