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

bookBygge 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 validatePostData henter ut username, postTitle og postContent fra forespørselskroppen;
  • Den sjekker om disse feltene er til stede. Hvis noen av dem mangler (!username, !postTitle eller !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;

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 7

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Suggested prompts:

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

bookBygge 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 validatePostData henter ut username, postTitle og postContent fra forespørselskroppen;
  • Den sjekker om disse feltene er til stede. Hvis noen av dem mangler (!username, !postTitle eller !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;

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 7
some-alt