Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Opbygning af Create Post-endpoint | Opbygning af REST API'er med Node.js og Express.js
Backend-Udvikling med Node.js og Express.js

bookOpbygning 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 validatePostData udtrækker username, postTitle og postContent fra anmodningens body;
  • Den kontrollerer, om disse felter er til stede. Hvis nogen af dem mangler (!username, !postTitle eller !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;

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 7

Spørg AI

expand

Spørg AI

ChatGPT

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

bookOpbygning 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 validatePostData udtrækker username, postTitle og postContent fra anmodningens body;
  • Den kontrollerer, om disse felter er til stede. Hvis nogen af dem mangler (!username, !postTitle eller !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;

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 7
some-alt