Andmebaasi sidumine

Esimene asi, mida teeme, on registreerumine MongoDB Atlasesse. https://cloud.mongodb.com/

Laadime alla raamatukogud muutujate keskkonna jaoks ja MongoDB andmebaasiga ühenduse jaoks.

npm install dotenv
npm install mongoose

Loome projekti juurkataloogis faili .env ja kirjutame sinna MongoDB-ga ühenduse loomise rea.

Loome mudeli kollektsioonile Hero. Esmalt peame looma kausta „models“ ja sinna faili „hero.js“

const mongoose = require('mongoose');
 
const heroSchema = new mongoose.Schema({
    id: {
        type: Number,
        required: true,
        unique: true
    },
    name: {
        type: String,
        required: true
    },
    attribute: {
        type: String,
        required: true,
        enum: ['Strength', 'Agility', 'Intelligence', 'Universal']
    }
});
 
module.exports = mongoose.model('Hero', heroSchema);

Edasi kuulutame oma Mongoose’i peamises serverifailis

require('dotenv').config();
const uri = process.env.MONGO_URI;
const mongoose = require("mongoose");
const Hero = require('./models/hero');
mongoose.connect(uri)
    .then(() => console.log('Connected to MongoDB Atlas'))
    .catch(err => console.error('MongoDB connection error:', err));

Ja pärast kõike seda uuendame ja läheme üle kohalikult andmetega töötamiselt MongoDB andmebaasiga töötamisele, peame uuendama iga end-pointi ja kohandama selle töötamise Mongoose (MongoDB) jaoks.

app.get("/heroes", async (req, res) => {
    try {
        const heroes = await Hero.find();
        res.json(heroes);
    } catch (err) {
        res.status(500).json({ message: err.message });
    }
});

app.get("/heroes/:id", async (req, res) => {
    try {
        const hero = await Hero.findOne({ id: parseInt(req.params.id) });
        if (!hero) return res.status(404).json({ message: "Hero not found" });
        res.json(hero);
    } catch (err) {
        res.status(500).json({ message: err.message });
    }
});

app.post("/heroes", async (req, res) => {
    try {
        const lastHero = await Hero.findOne().sort({ id: -1 });
        const newId = lastHero ? lastHero.id + 1 : 1;

        if (!req.body.name || !req.body.attribute) {
            return res.status(400).json({ message: "Name and attribute           are required" });
        }

        if (!attributes.includes(req.body.attribute)) {
            return res.status(400).json({ message: "Invalid attribute" });
        }

        const existingHero = await Hero.findOne({ name: req.body.name });
        if (existingHero) return res.status(409).json({ message: "Hero already exists" });

        const hero = new Hero({
            id: newId,
            name: req.body.name,
            attribute: req.body.attribute
        });

        const newHero = await hero.save();
        res.status(201).json(newHero);
    } catch (err) {
        res.status(500).json({ message: err.message });
    }
});

app.delete("/heroes/:id", async (req, res) => {
    try {
        const hero = await Hero.findOne({ id: parseInt(req.params.id) });
        if (!hero) return res.status(404).json({ message: "Hero not found" });
        if (hero.name === "Shadow Fiend") return res.status(409).json({ message: "You cannot delete this hero" });

        await hero.remove();
        res.status(204).send();
    } catch (err) {
        res.status(500).json({ message: err.message });
    }
});

lisame kaasaegselt uue end-pointi andmete uuendamiseks

app.put("/heroes/:id", async (req, res) => {
    try {
        const hero = await Hero.findOne({ id: parseInt(req.params.id) });
        if (!hero) return res.status(404).json({ message: "Hero not found" });

        if (req.body.name) hero.name = req.body.name;
        if (req.body.attribute) {
            if (!attributes.includes(req.body.attribute)) {
                return res.status(400).json({ message: "Invalid attribute" });
            }
            hero.attribute = req.body.attribute;
        }

        const updatedHero = await hero.save();
        res.json(updatedHero);
    } catch (err) {
        res.status(500).json({ message: err.message });
    }
});

Praegu näeb projekti juurkataloog välja järgmine

Kokkuvõtte

Selle asemel, et töötada kohalike ja meie puhul staatiliste andmetega, võib kasutada andmebaasi, mis asub tegelikel serveritel.