Opbygning af Create Post-endpoint
Vi vil undersøge oprettelsen af et nyt opslag ved hjælp af "CREATE POST"-ruten i postsRoutes.js-filen. 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 brug af router.post():
router.post("/", validatePostData, async (req, res, next) => { ... }
- Denne rute er konfigureret til at håndtere HTTP POST-anmodninger til rodstien
/; - Den anvender middleware-funktionen
validatePostData, som sikrer, at dataene sendt i anmodningens body er gyldige, før der fortsættes.
Datavaliderings-middleware
Før vi går ind i rute-logikken, skal vi oprette en datavaliderings-middleware. Denne middleware sikrer, at de data, der sendes i anmodningens 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 anmodningens body; - Den kontrollerer, om disse felter er til stede. Hvis nogen af dem mangler (
!username,!postTitleeller!postContent), returneres et 400 (Bad Request) statuskode og en fejlmeddelelse, der angiver manglende påkrævede felter; - Hvis dataene er gyldige, kalder middleware-funktionen
next(), hvilket tillader anmodningen at 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.
Nye post-data
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 anmodningens 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 nyligt oprettede opslag.
Afsendelse af svar
Ved vellykket oprettelse af det nye opslag sendes et succes-svar til klienten. Svaret indeholder statuskoden 201 (Oprettet) samt detaljerne for det nyoprettede opslag i JSON-format.
res.status(201).json(newPost);
Fejlhåndtering
Rutekoden indkapsles i et try-catch-blok for at håndtere potentielle fejl under datahentning eller behandling af anmodningen. Eventuelle fejl, der opstår, logges til konsollen til fejlsøgningsformål:
try {
// ... (code for retrieving and processing data)
} catch (error) {
console.error(error.message);
}
Complete code of the postsRoutes.js file at this step
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);
}
});
Komplet 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;
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
Awesome!
Completion rate improved to 2.56
Opbygning af Create Post-endpoint
Stryg for at vise menuen
Vi vil undersøge oprettelsen af et nyt opslag ved hjælp af "CREATE POST"-ruten i postsRoutes.js-filen. 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 brug af router.post():
router.post("/", validatePostData, async (req, res, next) => { ... }
- Denne rute er konfigureret til at håndtere HTTP POST-anmodninger til rodstien
/; - Den anvender middleware-funktionen
validatePostData, som sikrer, at dataene sendt i anmodningens body er gyldige, før der fortsættes.
Datavaliderings-middleware
Før vi går ind i rute-logikken, skal vi oprette en datavaliderings-middleware. Denne middleware sikrer, at de data, der sendes i anmodningens 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 anmodningens body; - Den kontrollerer, om disse felter er til stede. Hvis nogen af dem mangler (
!username,!postTitleeller!postContent), returneres et 400 (Bad Request) statuskode og en fejlmeddelelse, der angiver manglende påkrævede felter; - Hvis dataene er gyldige, kalder middleware-funktionen
next(), hvilket tillader anmodningen at 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.
Nye post-data
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 anmodningens 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 nyligt oprettede opslag.
Afsendelse af svar
Ved vellykket oprettelse af det nye opslag sendes et succes-svar til klienten. Svaret indeholder statuskoden 201 (Oprettet) samt detaljerne for det nyoprettede opslag i JSON-format.
res.status(201).json(newPost);
Fejlhåndtering
Rutekoden indkapsles i et try-catch-blok for at håndtere potentielle fejl under datahentning eller behandling af anmodningen. Eventuelle fejl, der opstår, logges til konsollen til fejlsøgningsformål:
try {
// ... (code for retrieving and processing data)
} catch (error) {
console.error(error.message);
}
Complete code of the postsRoutes.js file at this step
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);
}
});
Komplet 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;
Tak for dine kommentarer!