Vytváření RESTful API pomocí Node a MongoDB

Během své kariéry softwarového vývojáře jsem napsal RESTful API v různých jazycích a používal pro to různé frameworky jako VB.net, C#, Java, ASP.NET atd. Ale nedávno jsem dostal příležitost vytvářet RESTful API pomocí Node js.

Node.js je platforma na straně serveru postavená na JavaScript Engine Google Chrome (V8 Engine). Node.js poskytuje backendový webový aplikační rámec nazvaný Express. Je určen pro vytváření webových aplikací a API. MongoDB je open source databáze orientovaná na dokumenty.

Budeme budovat RESTful CRUD (Create, Retrieve, Update, Delete) API s Node.js, Express a MongoDB. Pro interakci s instancí MongoDB použijeme Mongoose.

Předpoklady

  1. Pokud jste to ještě neudělali, nainstalujte do počítače Node.js a MongoDB a použijte jakékoli vývojové prostředí, jako je Visual Studio Code

Vytváření aplikace

  1. Otevřete nový terminál a vytvořte novou složku pro aplikaci.
PS C:\> mkdir node-blog-app

2. Inicializujte aplikaci pomocí souboru package.json

V kořenovém adresáři složky zadejte npm init a inicializujte aplikaci pomocí souboru package.json.

PS C:\> cd node-blog-app      
PS C:\node-blog-app> npm init
package name: (blog-app) node-blog-app
version: (1.0.0)
description: Creates blogs easily and quickly.
entry point: (index.js) server.js
test command:
git repository:
keywords: Express,RestAPI,MongoDB,Mongoose,Blogs
author: dev.to
license: (ISC)

Zde jsme definovali vstupní bod jako soubor server.js, takže jej vytvoříme níže.

3. Nainstalujte závislosti aplikací

Budeme potřebovat expres, manguste. Nainstalujme je zadáním následujícího příkazu -

PS C:\node-blog-app> npm install express mongoose --save  

--save uloží tyto závislosti do souboru package.json.

4.Nastavení webového serveru
Nyní vytvoříme hlavní vstupní bod naší aplikace s názvem server.js v kořenové složce aplikace s následujícím obsahem-

const express = require('express');

// create express app
const app = express();

// parse requests of content-type - application/x-www-form-urlencoded
app.use(express.urlencoded({ extended: true }))

// parse requests of content-type - application/json
app.use(express.json())

// define a simple route
app.get('/', (req, res) => {
    res.json({"message": "Welcome to E-Blog. Creates blogs easily and quickly."});
});

// listen for requests
app.listen(3000, () => {
    console.log("Server is listening on port 3000");
});

Nejprve naimportujeme expresní, poté vytvoříme expresní aplikaci a přidáme dva middleware analyzátoru pomocí metody app.use() společnosti express.

Pokud používáte Express>=4.16.0, byl znovu přidán analyzátor těla pod metody express.json() a express.urlencoded().

Poté definujeme jednoduchou GET cestu, která vrací uvítací zprávu klientům.
Nakonec nasloucháme na portu 3000 pro příchozí připojení.

Nyní spusťte server a přejděte na http://localhost:3000 pro přístup k trase, kterou jsme právě definovali.

PS C:\node-blog-app> node server.js

5.Konfigurace a připojení databáze
Vytvořte nový soubor s názvem database.config.js uvnitř složky app/config s následujícím obsahem -

module.exports = {
    url: 'mongodb://localhost:27017/blogs'
}

Nyní naimportujeme výše uvedenou konfiguraci databáze do server.js a připojíme se k databázi pomocí mongoose.

Přidejte následující kód do souboru server.js.

// Configuring the database
const dbConfig = require('./config/database.config.js');
const mongoose = require('mongoose');

mongoose.Promise = global.Promise;

// Connecting to the database
mongoose.connect(dbConfig.url, {
    useNewUrlParser: true
}).then(() => {
    console.log("Successfully connected to the database");    
}).catch(err => {
    console.log('Could not connect to the database. Exiting now...', err);
    process.exit();
});

Spusťte prosím server.js a ujistěte se, že se můžete připojit k databázi -

PS C:\node-blog-app> node server.js
Server is listening on port 3000
Successfully connected to the database

6.Definování modelu blogu v Mongoose
Vytvořte soubor s názvem blog.model.js uvnitř složky aplikace/modely s následujícím obsahem -

const mongoose = require('mongoose');

const BlogSchema = mongoose.Schema({
    title: String,
    content: String
}, {
    timestamps: true
});

module.exports = mongoose.model('Blog', BlogSchema);

7.Definování tras pomocí Express
Vytvořte nový soubor s názvem blog.routes.js uvnitř složky app/routes s následujícím obsahem -

module.exports = (app) => {
    const blogs = require('../controllers/blog.controller.js');

    // Create a new Blog
    app.post('/blogs', blog.create);

    // Retrieve all Blogs
    app.get('/blogs', blog.findAll);

    // Update a Blog with blogId
    app.put('/blogs/:blogId', blog.update);

    // Delete a Blog with blogId
    app.delete('/blogs/:blogId', blog.delete);
}

8.Funkce řadiče zápisu
Vytvořte nový soubor s názvem blog.controller.js uvnitř složky app/controllers.

Vytvoření nového blogu -

// Create and Save a new Blog
exports.create = (req, res) => {

    // Create a Blog
    const blog = new Blog({
        title: req.body.title, 
        content: req.body.content
    });

    // Save Blog in the database
    blog.save()
    .then(data => {
        res.send(data);
    }).catch(err => {
        res.status(500).send({
            message: err.message || "Some error occurred while creating the Blog."
        });
    });
};

Načítání všech blogů -

// Retrieve and return all blogs from the database.
exports.findAll = (req, res) => {
    Blog.find()
    .then(blogs => {
        res.send(blogs);
    }).catch(err => {
        res.status(500).send({
            message: err.message || "Some error occurred while retrieving blogs."
        });
    });
};

Aktualizace blogu -

// Update a blog identified by the blogId in the request
exports.update = (req, res) => {

    // Find blog and update it with the request body
    Blog.findByIdAndUpdate(req.params.blogId, {
        title: req.body.title,
        content: req.body.content
    }, {new: true})
    .then(blog => {
        if(!blog) {
            return res.status(404).send({
                message: "Blog not found with id " + req.params.blogId
            });
        }
        res.send(blog);
    }).catch(err => {
        if(err.kind === 'ObjectId') {
            return res.status(404).send({
                message: "Blog not found with id " + req.params.blogId
            });                
        }
        return res.status(500).send({
            message: "Error updating blog with id " + req.params.blogId
        });
    });
};

Volba {new:true} v metodě findByIdAndUpdate() se používá k vrácení upraveného dokumentu do funkce then() namísto původní.

Smazání blogu -

// Delete a blog with the specified blogId in the request
exports.delete = (req, res) => {
    Blog.findByIdAndRemove(req.params.blogId)
    .then(blog => {
        if(!blog) {
            return res.status(404).send({
                message: "Blog not found with id " + req.params.blogId
            });
        }
        res.send({message: "Blog deleted successfully!"});
    }).catch(err => {
        if(err.kind === 'ObjectId' || err.name === 'NotFound') {
            return res.status(404).send({
                message: "Blog not found with id " + req.params.blogId
            });                
        }
        return res.status(500).send({
            message: "Could not delete blog with id " + req.params.blogId
        });
    });
};

Podívejte se na dokumentaci rozhraní Mongoose API.

Testování rozhraní Blogs API -
Podívejte se na to v POSTMAN a otestujte Blogs API.

Závěr
V tomto blogu jsme se naučili, jak vytvářet REST API v Node.js pomocí expresního frameworku a mongodb.
Jakékoli otázky, které byste mohli mít, položte v sekci komentářů níže.

Děkuji za přečtení.