Стани премиум член и добиј попуст на 2000+ производи и куп други бенефити!

Туторијал RESTful API со Express и MongoDB

Fatal1ty_

Großmeister
28 февруари 2008
23.848
34.056
roka.mk
Здраво на сите, Ајде да го продолжиме серијалот со едукација за креирање на RESTful API, но овој пат користејќи Express, Prisma и MongoDB. Во овој туторијал ќе започнеме од основите со креирање на Express проект и негово поврзување со MongoDB користејќи Prisma како ORM (Object Relational Mapping).

Цел на туторијалот:

1. Креирање и поставување на Express проект.
2. Користење на Prisma како ORM за MongoDB.
3. Креирање на RESTful API endpoint-и.
4. Поврзување на API-то со MongoDB за CRUD операции (Create, Read, Update, Delete).

Овој туторијал ќе биде поделен на два дела (постови). Ајде да почнеме!

Чекор 1: Инсталација на Node.js

Најпрво, мора да го инсталираме Node.js на компјутерот. Ако се уште не сте го инсталирале, за да го инсталирате Node.js може да ги следите чекорите од официјалната веб-страница на Node.js — Download Node.js®.

За да дознаеме дали на нашиот компјутер веќе е инсталиран Node.js, може да ја извршиме следнава команда во терминалот/CMD:

Код:
node --version
npm --version
Ако се е во ред, ќе се појави верзијата на Node.js и NPM што се инсталирани.

Screenshot_1.jpg

Чекор 2: Креирање на Express проект

Продолжуваме со креирање на нов проект за Express. Влезете во папката каде што сакате да го зачувате проектот, а потоа извршете ја следнава команда.

Код:
mkdir express-mongodb


Командата mkdir погоре се користи за создавање на нов директориум/папка, а името на таа папка е express-mongodb.

Откако папката е успешно создадена, сега ќе влеземе во таа папка користејќи ја следнава команда:

Код:
cd express-mongodb

Кога веќе се наоѓате во папката express-mongodb, сега ќе продолжиме со креирање на нов Express проект. Извршете ја следнава команда во терминалот/CMD:

Код:
npm init -y


Ако сe помине успешно, ќе се појави излез како следниов.
Код:
{
  "name": "express-mongodb",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

Сега продолжуваме со инсталација на Express. Извршете ја следнава команда во терминалот/CMD и осигурете се дека се наоѓате во папката express-mongodb.

Код:
npm install [email protected] --save

Ако горенаведената команда се изврши успешно, ќе добиеме 1 нова папка со име node_modules, која содржи зависности од Node.js, вклучувајќи го и Express.

И ако погледнеме во датотеката package.json во делот dependencies, ќе најдеме нешто горе-долу вака:

Код:
"dependencies": {
   "express": "^4.19.2"
}

Тоа значи дека Express е успешно креиран.

Чекор 3: Креирање на главната датотека на Express

Сега ќе ја додадеме главната датотека на Express и ќе додадеме 1 route за да го тестираме во веб-прелистувачот. Создадете нова датотека со име index.js и внесете го следниов код во неа.

JavaScript:
//import express
const express = require('express')

//init app
const app = express()

//define port
const port = 3000;

//route
app.get('/', (req, res) => {
  res.send('Hello World!')
})

//start server
app.listen(port, () => {
    console.log(`Server started on port ${port}`);
})

Погоре, најпрво создаваме нова променлива со името express, чија содржина е импортиран Express.

JavaScript:
//import express
const express = require('express')

Потоа создаваме уште една нова променлива со името app, чија содржина е иницијализација на Express.

JavaScript:
//init app
const app = express()

Потоа создаваме променлива со името port чија вредност е 3000. Токму оваа порта ќе се користи за стартување на Express проектот. Оваа порта може да се прилагоди според нашите потреби.

JavaScript:
//define port
const port = 3000;

Потоа создаваме 1 нов route со методот GET, чија содржина е текстот Здраво it.mk!.

JavaScript:
//route
app.get('/', (req, res) => {
  res.send('Здраво it.mk!')
})

И го слушаме (listen) Express на портата што ја создадовме погоре, а ќе прикажеме log како показател дека Express е успешно стартуван на localhost со портата 3000.

JavaScript:
//start server
app.listen(port, () => {
    console.log(`Server started on port ${port}`);
})

Чекор 4: Стартување на Express проектот

Сега ќе го инсталираме Nodemon на компјутерот глобално. Nodemon ќе се користи за стартување на нашиот Express проект, при што ако настане промена во кодот на проектот нема да треба рачно да го рестартираме серверот, бидејќи Nodemon тоа ќе го прави автоматски.

Извршете ја следнава команда во терминалот/CMD.

Код:
npm install -g nodemon

Ако добиете грешка поврзана со дозволи (permission), тогаш може да додадете sudo на почетокот од командата за инсталација. Или ако користите Windows, тогаш отворете го CMD како администратор (as Administrator).

Откако Nodemon е успешно инсталиран, сега ќе научиме како да го стартуваме проектот. Извршете ја следнава команда во терминалот/CMD и осигурете се дека се наоѓате во папката express-mongodb.

Код:
nodemon index.js

Ако горенаведената команда се изврши успешно, проектот ќе се стартува на localhost користејќи ја портата 3000.

Screenshot_2.jpg

Конфигурација на Prisma со MongoDB

Prisma ни овозможува да комуницираме со MongoDB базата користејќи JavaScript синтакса што е лесна за разбирање, а истовремено обезбедува разни напредни функционалности за поефикасно управување со податоците.

Чекор 1: Добивање на MongoDB Connection String

Регистрирајте сметка на Atlas Database. Ако се помине успешно, ќе влезете на страницата со контролната табла, што горе-долу изгледа вака.

Screenshot_3.jpg

Кликнете на + Create за да создадете нов кластер во MongoDB. Тоа би изгледало вака.

Screenshot_4.jpg

Потоа ќе се појави pop-up како на сликата подолу. Прилагодете ги username и password за нашиот корисник на базата. Потоа кликнете на Create Database User.

Screenshot_5.jpg

Почекајте го процесот на создавање на кластерот.

Кога ќе заврши, кликнете на копчето get connection string и не заборавајте за Application Development да изберете JavaScript/Node.js.

Screenshot_6.jpg

Погоре, го добивме MongoDB Connection String-от, кој подоцна ќе го користиме во Express проектот преку Prisma ORM.

Потоа кликнете на менито Network Access што се наоѓа во страничната лента (sidebar) и додадете ја вашата IP адреса со кликнување на Add Current IP Address.

Чекор 2: Инсталација на Prisma ORM

Влезете во папката на проектот, а потоа извршете ја следнава команда во терминалот/CMD.

Код:
npm install [email protected] --save-dev

Почекајте го процесот на инсталација да заврши и осигурете се дека сте поврзани на интернет. Откако процесот на инсталација ќе заврши, сега извршете ја следнава команда.
Код:
npx prisma init

Ако горенаведената команда се изврши успешно, ќе добиеме 2 работи, а тоа се:

1. Се создава нова папка со името prisma што содржи датотека со името schema.prisma, во која ќе се наоѓа Prisma шемата со променливата за конекција кон базата и model schema-та што подоцна ќе се користи за создавање на collection.
2. Се создава датотека .env во root-от на проектот, која се користи за дефинирање на environment променливи (како што е конекцијата кон базата).

Screenshot_7.jpg

Чекор 3: Конекција кон базата (MongoDB)

Отворете ја датотеката .env, а потоа сменете го кодот за да изгледа вака.

Screenshot_8.jpg

Го менуваме за да го користиме connection string-от што претходно го добивме и додаваме име на базата што ќе ја користиме подоцна, а тоа е db_express.

ЗАБЕЛЕШКА: прилагодете го според конфигурацијата на вашиот MongoDB connection string.

Чекор 4: Креирање на Prisma Schema

Сега ќе продолжиме со креирање на schema во Prisma. Ако користите релациска база, оваа schema ќе се генерира како табела. Меѓутоа, ако користите MongoDB, таа schema ќе се генерира како collection.

Отворете ја датотеката prisma/schema.prisma, а потоа сменете го кодот за да изгледа вака.

Код:
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mongodb"
  url      = env("DATABASE_URL")
}

model Post {
  id String @id @default(auto()) @map("_id") @db.ObjectId
  title String
  content String
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  @@map("posts")
}

Со оваа промена на кодот, најпрво го менуваме provider-от на базата што се користи во mongodb.

Потоа создаваме нов модел со името Post, а во него создаваме неколку атрибути/колони што подоцна ќе се генерираат.

На крајот, извршете ја следнава команда во терминалот/CMD и осигурете се дека се наоѓате во Express проектот.

Код:
npx prisma generate

Прикажување на податоци од базата

Чекор 1: Инсталација на Prisma Client

Prisma Client ќе ни го олесни ефикасното и интуитивно комуницирање со базата. Извршете ја следнава команда во терминалот/CMD и осигурете се дека се наоѓате во Express проектот.

Код:
npm install @prisma/[email protected]

Чекор 2: Креирање на Post контролер

Сега создадете нова папка со името controllers, а во таа папка создадете нова датотека со името PostController.js, а потоа внесете го следниов код во неа.

JavaScript:
//import PrismaClient
const { PrismaClient } = require('@prisma/client');

//init prisma client
const prisma = new PrismaClient();

//function findPosts
const findPosts = async (req, res) => {
    try {

        //get all posts from database
        const posts = await prisma.post.findMany({
            select: {
                id: true,
                title: true,
                content: true,
                createdAt: true,
                updatedAt: true,
            },
            orderBy: {
                createdAt: "desc",
            },
        });

        //send response
        res.status(200).send({
            success: true,
            message: "Get All Posts Successfully",
            data: posts,
        });

    } catch (error) {
        res.status(500).send({
            success: false,
            message: "Internal server error",
        });
    }
};

//export function
module.exports = {
    findPosts,
}

Со оваа промена на кодот, најпрво го импортираме и иницијализираме Prisma Client.
JavaScript:
//import PrismaClient
const { PrismaClient } = require('@prisma/client');

//init prisma client
const prisma = new PrismaClient();

Потоа создаваме нова функција со името findPosts.
JavaScript:
//function findPosts
const findPosts = async (req, res) => {

    //...
    
}

Внатре во неа преземаме податоци од MongoDB користејќи Prisma. Податоците што се прикажуваат ги подредуваме според најновите.

JavaScript:
//get all posts from database
const posts = await prisma.post.findMany({
    select: {
        id: true,
        title: true,
        content: true,
        createdAt: true,
        updatedAt: true,
    },
    orderBy: {
        createdAt: "desc",
    },
});

Потоа ги враќаме горенаведените податоци во JSON формат.
JavaScript:
//send response
res.status(200).send({
    success: true,
    message: "Get All Posts Successfully",
    data: posts,
});

На крајот, не заборавајте да ја експортирате функцијата findPosts.

Код:
//export function
module.exports = {
    findPosts,
}

Чекор 3: Креирање на Route за API Posts Index

Откако успешно го создадовме контролерот, ќе продолжиме со креирање на route за API posts index-от.

Создадете нова папка со име routes, а во неа создадете нова датотека со името index.js, а потоа внесете го следниов код во неа.

JavaScript:
//import express
const express = require('express')

//init express router
const router = express.Router();

//import PostController
const PostController = require('../controllers/PostController');

//define route for posts
router.get('/posts', PostController.findPosts);

//export router
module.exports = router

[code]

Со оваа промена на кодот, ја иницијализираме router-от од Express.
[code=javascript]
//import express
const express = require('express')

//init express router
const router = express.Router();

Потоа го импортираме контролерот PostController.
JavaScript:
//import PostController
const PostController = require('../controllers/PostController');

Потоа создаваме нов route со методот GET и патека /posts, при што неговиот handler го насочуваме кон PostController со функцијата findPosts.

JavaScript:
//define route for posts
router.get('/posts', PostController.findPosts);

Не заборавајте да го експортирате router-от.
JavaScript:
//export router
module.exports = router

Чекор 4: Регистрирање на Route

За да може горенаведениот route да се користи во апликацијата, ќе го повикаме во главната датотека на Express. Отворете ја датотеката index.js, а потоа сменете го кодот за да изгледа вака.

JavaScript:
//import express
const express = require('express')

//import router
const router = require('./routes')

//init app
const app = express()

//define port
const port = 3000;

//route
app.get('/', (req, res) => {
  res.send('Hello World!')
})

//define routes
app.use('/api', router)

//start server
app.listen(port, () => {
    console.log(`Server started on port ${port}`);
})

Со оваа промена на кодот, најпрво ја импортираме датотеката routes што претходно ја создадовме.
JavaScript:
//import router
const router = require('./routes')

Потоа ја користиме во Express преку клучниот збор use и ѝ ја задаваме основната патека (basePath) /api. Тоа значи дека подоцна на сите URL адреси ќе им се додава /api на почетокот.
JavaScript:
//define routes
app.use('/api', router)

Чекор 5: Тестирање на прикажување на листата со податоци

Отворете ја апликацијата POSTMAN Download Postman | Get Started for Free, а потоа внесете ја следнава URL адреса , а за методот изберете GET.

Откако сте готови, кликнете на Send, и ако се помине успешно, ќе добиеме JSON одговор што горе-долу изгледа вака.

Код:
{
    "success": true,
    "message": "Get All Posts Successfully",
    "data": []
}

Screenshot_9.jpg

Погоре, се уште добиваме празна низа [] во data одговорот. Тоа е затоа што сеуште немаме никви податоци во табелата.

Внесување на податоци во базата

Чекор 1: Инсталација и конфигурација на Body Parser


Body Parser е библиотека што содржи middleware за читање на податоците што се испраќаат преку HTTP request и нивно зачувување како JavaScript објект до кој може да се пристапи преку req.body.

Извршете ја следнава команда во терминалот/CMD и осигурете се дека се наоѓате во Express проектот.

Код:
npm install [email protected]

Откако инсталацијата е успешна, сега продолжуваме со конфигурацијата во Express проектот. Отворете ја датотеката index.js, а потоа сменете го кодот за да изгледа вака:

JavaScript:
//import express
const express = require('express')

//import router
const router = require('./routes')

//import bodyParser
const bodyParser = require('body-parser')

//init app
const app = express()

//define port
const port = 3000;

//use body parser
app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json
app.use(bodyParser.json())

//route
app.get('/', (req, res) => {
  res.send('Hello World!')
})

//define routes
app.use('/api', router)

//start server
app.listen(port, () => {
    console.log(`Server started on port ${port}`);
})

Со оваа промена на кодот, најпрво ја импортираме библиотеката Body Parser.

JavaScript:
//import body parser
const bodyParser = require('body-parser')

Потоа го користиме клучниот збор use за да ја доделиме таа библиотека во Express проектот.

JavaScript:
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json
app.use(bodyParser.json())

Чекор 2: Инсталација и конфигурација на Express Validator

Express Validator е middleware за Node.js што обезбедува разни функции за валидација и филтрирање на податоците што се примаат преку HTTP request во Express апликацијата.

Извршете ја следнава команда во терминалот/CMD и осигурете се дека се наоѓате во Express проектот.

Код:
npm install [email protected]

Откако инсталацијата е успешна, сега создадете нова папка со името utils, а во неа создадете нова датотека со името validators.js, а потоа внесете го следниов код.

JavaScript:
//import express validator
const { body } = require('express-validator');

//definisikan validasi untuk post
const validatePost= [
    body('title').notEmpty().withMessage('Title is required'),
    body('content').notEmpty().withMessage('Content is required'),
];

module.exports = { validatePost };

Со оваа промена на кодот, го импортираме body од Express Validator.

JavaScript:
//import express validator
const { body } = require('express-validator');

Потоа создаваме 2 валидации за податоците title и content.
JavaScript:
body('title').notEmpty().withMessage('Title is required'),
body('content').notEmpty().withMessage('Content is required'),

Чекор 3: Креирање на процесот за внесување на податоци

Отворете ја датотеката controllers/PostController.js, а потоа сменете го целиот код за да изгледа вака.

JavaScript:
//import PrismaClient
const { PrismaClient } = require('@prisma/client');

//init prisma client
const prisma = new PrismaClient();

// Import validationResult from express-validator
const { validationResult } = require("express-validator");

//function findPosts
const findPosts = async (req, res) => {
    try {

        //get all posts from database
        const posts = await prisma.post.findMany({
            select: {
                id: true,
                title: true,
                content: true,
                createdAt: true,
                updatedAt: true,
            },
            orderBy: {
                createdAt: "desc",
            },
        });

        //send response
        res.status(200).send({
            success: true,
            message: "Get All Posts Successfully",
            data: posts,
        });

    } catch (error) {
        res.status(500).send({
            success: false,
            message: "Internal server error",
        });
    }
};

//function createPost
const createPost = async (req, res) => {

    const errors = validationResult(req);

    if (!errors.isEmpty()) {
        
        return res.status(422).json({
            success: false,
            message: "Validation error",
            errors: errors.array(),
        });
    }

    try {

        //insert data
        const post = await prisma.post.create({
            data: {
                title: req.body.title,
                content: req.body.content,
            },
        });

        res.status(201).send({
            success: true,
            message: "Post Created Successfully",
            data: post,
        });

    } catch (error) {
        res.status(500).send({
            success: false,
            message: "Internal server error",
        });
    }
};

//export function
module.exports = {
    findPosts,  
    createPost,
}

Со оваа промена на кодот, најпрво го импортираме validationResult од Express Validator.

JavaScript:
// Import validationResult from express-validator
const { validationResult } = require("express-validator");

Потоа создаваме нова функција со името createPost.

JavaScript:
//function createPost
const createPost = async (req, res) => {

    //...
    
}

Внатре во неа создаваме нова променлива со името errors што содржи validationResult, чиј параметар е request-от од корисникот.

JavaScript:
const errors = validationResult(req);

Ако горенаведената променлива errors не е празна, тоа значи дека има валидација што не е исполнета, па ќе направиме return во JSON формат со информација за потребната валидација.

JavaScript:
return res.status(422).json({
    success: false,
    message: "Validation error",
    errors: errors.array(),
});

Но ако request-от е во согласност со валидацијата, тогаш ќе направиме процес на внесување на податоците во MongoDB користејќи Prisma.

JavaScript:
//insert data
const post = await prisma.post.create({
    data: {
        title: req.body.title,
        content: req.body.content,
    },
});

Потоа враќаме во JSON формат со информација за податоците на post-от што е успешно внесен.

JavaScript:
res.status(201).send({
    success: true,
    message: "Post Created Successfully",
    data: post,
});e

И не заборавајте да ја експортирате функцијата createPost.

JavaScript:
//export function
module.exports = {
    findPosts,  
    createPost,
}

Чекор 4: Креирање на Route за API Create Post

Отворете ја датотеката routes/index.js, а потоа сменете го целиот код за да изгледа вака.

JavaScript:
//import express
const express = require('express')

//init express router
const router = express.Router();

//import PostController
const PostController = require('../controllers/PostController');

//import validate post
const { validatePost } = require('../utils/validators');

//define route for posts
router.get('/posts', PostController.findPosts);

//define route for create post
router.post('/posts', validatePost, PostController.createPost);

//export router
module.exports = router

Со оваа промена на кодот, најпрво го импортираме helper-от validatePost.

JavaScript:
//import validate post
const { validatePost } = require('../utils/validators');

Потоа создаваме нов route со методот POST и патека /posts.

JavaScript:
//define route for create post
router.post('/posts', validatePost, PostController.createPost);

Погоре, исто така го додаваме параметарот validatePost за да ја обработиме валидацијата на request-от што се испраќа.

Чекор 5: Тестирање на внесување на податоци за post

Отворете ја апликацијата Postman, а потоа внесете ја следнава URL адреса , а за методот изберете POST.

Сега кликнете на табот Body, а потоа изберете x-www-urlencoded и внесете ги следниве key и value: title, contenet.

Откако сите полиња се пополнети, сега кликнете на Send, и ако се помине успешно, ќе добиеме одговор во JSON формат што содржи информации за податоците на post-от што штотуку е внесен.

Код:
{
    "success": true,
    "message": "Post Created Successfully",
    "data": {
        "id": "6a8d325e2ba7fc0404cb7ca3",
        "title": "Ова е прв пост",
        "content": "Здраво на сите!",
        "createdAt": "2026-08-25T06:12:45.812Z",
        "updatedAt": "2026-08-25T06:12:45.812Z"
    }
}

Screenshot_10.jpg

Сега може да ги видите податоците во Atlas MongoDB.

Screenshot_11.jpg
 

Fatal1ty_

Großmeister
28 февруари 2008
23.848
34.056
roka.mk
Прикажување на податоци според ID

Чекор 1: Додавање на функцијата findPostById во контролерот


Отворете ја датотеката controllers/PostController.js, а потоа сменете го целиот код за да изгледа вака.

JavaScript:
//import PrismaClient
const { PrismaClient } = require('@prisma/client');

//init prisma client
const prisma = new PrismaClient();

// Import validationResult from express-validator
const { validationResult } = require("express-validator");

//function findPosts
const findPosts = async (req, res) => {
    try {

        //get all posts from database
        const posts = await prisma.post.findMany({
            select: {
                id: true,
                title: true,
                content: true,
                createdAt: true,
                updatedAt: true,
            },
            orderBy: {
                createdAt: "desc",
            },
        });

        //send response
        res.status(200).send({
            success: true,
            message: "Get All Posts Successfully",
            data: posts,
        });

    } catch (error) {
        res.status(500).send({
            success: false,
            message: "Internal server error",
        });
    }
};

//function createPost
const createPost = async (req, res) => {

    const errors = validationResult(req);

    if (!errors.isEmpty()) {
        return res.status(422).json({
            success: false,
            message: "Validation error",
            errors: errors.array(),
        });
    }

    try {

        //insert data
        const post = await prisma.post.create({
            data: {
                title: req.body.title,
                content: req.body.content,
            },
        });

        res.status(201).send({
            success: true,
            message: "Post Created Successfully",
            data: post,
        });

    } catch (error) {
        res.status(500).send({
            success: false,
            message: "Internal server error",
        });
    }
};

//function findPostById
const findPostById = async (req, res) => {

    //get ID from params
    const { id } = req.params;

    try {

        //get post by ID
        const post = await prisma.post.findUnique({
            where: {
                id: id,
            },
            select: {
                id: true,
                title: true,
                content: true,
                createdAt: true,
                updatedAt: true,
            },
        });

        //send response
        res.status(200).send({
            success: true,
            message: `Get Post By ID :${id}`,
            data: post,
        });

    } catch (error) {
        res.status(500).send({
            success: false,
            message: "Internal server error",
        });
    }
};

//export function
module.exports = {
    findPosts,  
    createPost,
    findPostById,
}

Со оваа промена на кодот, најпрво создаваме функција findPostById.
JavaScript:
//function findPostById
const findPostById = async (req, res) => {

    //...
    
}

Внатре во неа го издвојуваме (destruct) id од параметарот на request-от.

JavaScript:
//get ID from params
const { id } = req.params;

Потоа преземаме податоци користејќи Prisma врз основа на горенаведеното ID.

JavaScript:
//get post by ID
const post = await prisma.post.findUnique({
    where: {
        id: id,
    },
    select: {
        id: true,
        title: true,
        content: true,
        createdAt: true,
        updatedAt: true,
    },
});

Потоа само правиме return во JSON формат што содржи детални информации за податоците на post-от.

JavaScript:
//send response
res.status(200).send({
    success: true,
    message: `Get Post By ID :${id}`,
    data: post,
});

На крајот, не заборавајте да ја експортирате функцијата findPostById.

JavaScript:
//export function
module.exports = {
    findPosts,  
    createPost,
    findPostById,
}


Чекор 2: Креирање на Route за API Detail Post

Отворете ја датотеката routes/index.js, а потоа сменете го целиот код за да изгледа вака.

JavaScript:
//import express
const express = require('express')

//init express router
const router = express.Router();

//import PostController
const PostController = require('../controllers/PostController');

//import validate post
const { validatePost } = require('../utils/validators');

//define route for posts
router.get('/posts', PostController.findPosts);

//define route for create post
router.post('/posts', validatePost, PostController.createPost);

//define route for get post by id
router.get('/posts/:id', PostController.findPostById);

//export router
module.exports = router

Со оваа промена на кодот, создаваме нов route со методот GET што има патека /posts/:id.

JavaScript:
//define route for get post by id
router.get('/posts/:id', PostController.findPostById);

Чекор 3: Тестирање на прикажување на детали за корисникот

Отворете ја апликацијата Postman и внесете ја следнава URL адреса http://localhost:3000/api/posts/6a8d325e2ba7fc0404cb7ca3, а за методот изберете GET.

Погоре даваме пример користејќи post со ID: 6a8d325e2ba7fc0404cb7ca3. Во вашиот случај тој може да се разликува.

Откако сте готови, кликнете на Send, и ако се помине успешно, ќе добиеме одговор во JSON формат што содржи детални информации за податоците на post-от.

Screenshot_1.jpg

Ажурирање на податоци во базата

Чекор 1: Додавање на функцијата updatePost во контролерот


Отворете ја датотеката contorller/PostController.js, а потоа сменете го целиот код за да изгледа вака.

JavaScript:
//import PrismaClient
const { PrismaClient } = require('@prisma/client');

//init prisma client
const prisma = new PrismaClient();

// Import validationResult from express-validator
const { validationResult } = require("express-validator");

//function findPosts
const findPosts = async (req, res) => {
    try {

        //get all posts from database
        const posts = await prisma.post.findMany({
            select: {
                id: true,
                title: true,
                content: true,
                createdAt: true,
                updatedAt: true,
            },
            orderBy: {
                createdAt: "desc",
            },
        });

        //send response
        res.status(200).send({
            success: true,
            message: "Get All Posts Successfully",
            data: posts,
        });

    } catch (error) {
        res.status(500).send({
            success: false,
            message: "Internal server error",
        });
    }
};

//function createPost
const createPost = async (req, res) => {

  
    const errors = validationResult(req);

    if (!errors.isEmpty()) {
        return res.status(422).json({
            success: false,
            message: "Validation error",
            errors: errors.array(),
        });
    }

    try {

        //insert data
        const post = await prisma.post.create({
            data: {
                title: req.body.title,
                content: req.body.content,
            },
        });

        res.status(201).send({
            success: true,
            message: "Post Created Successfully",
            data: post,
        });

    } catch (error) {
        res.status(500).send({
            success: false,
            message: "Internal server error",
        });
    }
};

//function findPostById
const findPostById = async (req, res) => {

    //get ID from params
    const { id } = req.params;

    try {

        //get post by ID
        const post = await prisma.post.findUnique({
            where: {
                id: id,
            },
            select: {
                id: true,
                title: true,
                content: true,
                createdAt: true,
                updatedAt: true,
            },
        });

        //send response
        res.status(200).send({
            success: true,
            message: `Get Post By ID :${id}`,
            data: post,
        });

    } catch (error) {
        res.status(500).send({
            success: false,
            message: "Internal server error",
        });
    }
};

//function updatePost
const updatePost = async (req, res) => {

    //get ID from params
    const { id } = req.params;

    const errors = validationResult(req);

    if (!errors.isEmpty()) {
       
        return res.status(422).json({
            success: false,
            message: "Validation error",
            errors: errors.array(),
        });
    }

    try {

        //update post
        const post = await prisma.post.update({
            where: {
                id: id,
            },
            data: {
                title: req.body.title,
                content: req.body.content,
                updatedAt: new Date(),
            },
        });

        //send response
        res.status(200).send({
            success: true,
            message: 'Post Updated Successfully',
            data: post,
        });

    } catch (error) {
        res.status(500).send({
            success: false,
            message: "Internal server error",
        });
    }
};

//export function
module.exports = {
    findPosts,  
    createPost,
    findPostById,
    updatePost,
}

Со оваа промена на кодот, додаваме нова функција со името updatePost.

JavaScript:
//function updatePost
const updatePost = async (req, res) => {

    //...
    
}

Внатре во неа го издвојуваме (destruct) id што се презема од параметрите на request-от.

JavaScript:
//get ID from params
const { id } = req.params;

Потоа создаваме нова променлива со името errors што содржи validationResult, чиј параметар е request-от од корисникот.

JavaScript:
const errors = validationResult(req);

Ако горенаведената променлива errors не е празна, тоа значи дека има валидација што не е исполнета, па ќе направиме return во JSON формат со информација за потребната валидација.

JavaScript:
return res.status(422).json({
    success: false,
    message: "Validation error",
    errors: errors.array(),
});

Но ако request-от е во согласност со валидацијата, тогаш ќе направиме процес на ажурирање на податоците во MongoDB врз основа на ID.

JavaScript:
//update post
const post = await prisma.post.update({
    where: {
        id: id,
    },
    data: {
        title: req.body.title,
        content: req.body.content,
        updatedAt: new Date(),
    },
});

Потоа враќаме во JSON формат со информација за податоците на post-от што е успешно ажуриран.

JavaScript:
//send response
res.status(200).send({
    success: true,
    message: 'Post Updated Successfully',
    data: post,
});

И не заборавајте да ја експортирате функцијата updatePost.

JavaScript:
//export function
module.exports = {
    findPosts,  
    createPost,
    findPostById,
    updatePost,
}

Чекор 2: Креирање на Route за API Update Post

Отворете ја датотеката routes/index.js, а потоа сменете го целиот код за да изгледа вака.

JavaScript:
//import express
const express = require('express')

//init express router
const router = express.Router();

//import PostController
const PostController = require('../controllers/PostController');

//import validate post
const { validatePost } = require('../utils/validators');

//define route for posts
router.get('/posts', PostController.findPosts);

//define route for create post
router.post('/posts', validatePost, PostController.createPost);

//define route for get post by id
router.get('/posts/:id', PostController.findPostById);

//define route for update post
router.put('/posts/:id', validatePost, PostController.updatePost);

//export router
module.exports = router

Погоре, додаваме нов route со методот PUT што има патека /posts/:id, а секако додаваме и validatePost за да го валидираме request-от што се испраќа.

JavaScript:
//define route for update post
router.put('/posts/:id', validatePost, PostController.updatePost);

Чекор 3: Тестирање на ажурирање на податоци за корисникот

Сега отворете ја апликацијата Postman и внесете ја следнава URL адреса http://localhost:3000/api/posts/6a8d325e2ba7fc0404cb7ca3, а за методот изберете PUT.

Погоре давам пример користејќи post со ID: 6a8d325e2ba7fc0404cb7ca3.

Откако сте готови, сега кликнете на табот Body, а потоа изберете x-www-urlencoded и внесете ги следниве key и value: title, content

Откако сте готови, кликнете на Send, и ако се помине успешно, ќе добиеме одговор во JSON формат што содржи информации за податоците на post-от што е ажуриран.

Screenshot_2.jpg

Бришење на податоци од базата

Чекор 1: Додавање на функцијата deletePost во контролерот


Сега ќе продолжиме со учење како да додадеме нова функција во контролерот, каде што оваа функција е задолжена за процесот на бришење на податоци.

Отворете ја датотеката controller/PostController.js, а потоа сменете го целиот код за да изгледа вака.

JavaScript:
//import PrismaClient
const { PrismaClient } = require('@prisma/client');

//init prisma client
const prisma = new PrismaClient();

// Import validationResult from express-validator
const { validationResult } = require("express-validator");

//function findPosts
const findPosts = async (req, res) => {
    try {

        //get all posts from database
        const posts = await prisma.post.findMany({
            select: {
                id: true,
                title: true,
                content: true,
                createdAt: true,
                updatedAt: true,
            },
            orderBy: {
                createdAt: "desc",
            },
        });

        //send response
        res.status(200).send({
            success: true,
            message: "Get All Posts Successfully",
            data: posts,
        });

    } catch (error) {
        res.status(500).send({
            success: false,
            message: "Internal server error",
        });
    }
};

//function createPost
const createPost = async (req, res) => {

    const errors = validationResult(req);

    if (!errors.isEmpty()) {

        return res.status(422).json({
            success: false,
            message: "Validation error",
            errors: errors.array(),
        });
    }

    try {

        //insert data
        const post = await prisma.post.create({
            data: {
                title: req.body.title,
                content: req.body.content,
            },
        });

        res.status(201).send({
            success: true,
            message: "Post Created Successfully",
            data: post,
        });

    } catch (error) {
        res.status(500).send({
            success: false,
            message: "Internal server error",
        });
    }
};

//function findPostById
const findPostById = async (req, res) => {

    //get ID from params
    const { id } = req.params;

    try {

        //get post by ID
        const post = await prisma.post.findUnique({
            where: {
                id: id,
            },
            select: {
                id: true,
                title: true,
                content: true,
                createdAt: true,
                updatedAt: true,
            },
        });

        //send response
        res.status(200).send({
            success: true,
            message: `Get Post By ID :${id}`,
            data: post,
        });

    } catch (error) {
        res.status(500).send({
            success: false,
            message: "Internal server error",
        });
    }
};

//function updatePost
const updatePost = async (req, res) => {

    //get ID from params
    const { id } = req.params;


    const errors = validationResult(req);

    if (!errors.isEmpty()) {

        return res.status(422).json({
            success: false,
            message: "Validation error",
            errors: errors.array(),
        });
    }

    try {

        //update post
        const post = await prisma.post.update({
            where: {
                id: id,
            },
            data: {
                title: req.body.title,
                content: req.body.content,
                updatedAt: new Date(),
            },
        });

        //send response
        res.status(200).send({
            success: true,
            message: 'Post Updated Successfully',
            data: post,
        });

    } catch (error) {
        res.status(500).send({
            success: false,
            message: "Internal server error",
        });
    }
};

//function deletePost
const deletePost = async (req, res) => {

    //get ID from params
    const { id } = req.params;

    try {

        //delete post
        await prisma.post.delete({
            where: {
                id: id,
            },
        });

        //send response
        res.status(200).send({
            success: true,
            message: 'Post Deleted Successfully',
        });

    } catch (error) {
        res.status(500).send({
            success: false,
            message: "Internal server error",
        });
    }

};

//export function
module.exports = {
    findPosts,  
    createPost,
    findPostById,
    updatePost,
    deletePost,
}

Со оваа промена на кодот, додаваме нова функција со името deletePost.

JavaScript:
//function deletePost
const deletePost = async (req, res) => {

    //...
    
}

Внатре во неа, најпрво го издвојуваме (destruct) id што се наоѓа во параметарот на request-от.

JavaScript:
//get ID from params
const { id } = req.params;

Потоа правиме бришење на податоците користејќи Prisma врз основа на ID-то на post-от.

JavaScript:
//delete post
await prisma.post.delete({
    where: {
        id: id,
    },
});

И правиме return во JSON формат со информација дека податоците на post-от се успешно избришани.

JavaScript:
//send response
res.status(200).send({
    success: true,
    message: 'Post Deleted Successfully',
});

На крајот, не заборавајте да ја експортирате функцијата deletePost.

JavaScript:
//export function
module.exports = {
    findPosts,  
    createPost,
    findPostById,
    updatePost,
    deletePost,
}

Чекор 2: Креирање на Route за API Delete Post

Отворете ја датотеката routes/index.js, а потоа сменете го целиот код за да изгледа вака.

JavaScript:
//import express
const express = require('express')

//init express router
const router = express.Router();

//import PostController
const PostController = require('../controllers/PostController');

//import validate post
const { validatePost } = require('../utils/validators');

//define route for posts
router.get('/posts', PostController.findPosts);

//define route for create post
router.post('/posts', validatePost, PostController.createPost);

//define route for get post by id
router.get('/posts/:id', PostController.findPostById);

//define route for update post
router.put('/posts/:id', validatePost, PostController.updatePost);

//define route for delete post
router.delete('/posts/:id', PostController.deletePost);

//export router
module.exports = router

Со оваа промена на кодот, додаваме нов route со методот DELETE што има патека /posts/:id.
JavaScript:
//define route for delete post
router.delete('/posts/:id', PostController.deletePost);

Чекор 3: Тестирање на бришење на податоци за post

Сега отворете ја апликацијата Postman и внесете ја следнава URL адреса http://localhost:3000/api/posts/6a8d325e2ba7fc0404cb7ca3, а за методот изберете DELETE.

Погоре давам пример користејќи post со ID: 6a8d325e2ba7fc0404cb7ca3.

Откако сте готови, кликнете на Send, и ако се помине успешно, ќе добиеме одговор во JSON формат што содржи информации за постот што е избришан

Screenshot_3.jpg

Овозможување на CORS во Express

Што е CORS?


CORS е механизам што овозможува ресурсите од еден origin (домен) да бидат достапни за ресурси од различен origin. На пример, ако нашата frontend апликација е хостирана на http://localhost:5173, а нашето API е хостирано на http://localhost:3000, тогаш треба да дозволиме барања од frontend-от кон нашиот backend користејќи CORS.

Чекор 1: Инсталација на CORS библиотеката

Сега ќе користиме дополнителна библиотека за справување со процесот на CORS во Express проектот. Извршете ја следнава команда во терминалот/CMD и осигурете се дека се наоѓате во Express проектот.

Код:
npm install [email protected] --save

Чекор 2: Конфигурација на CORS

Откако инсталацијата на библиотеката е успешна, сега продолжуваме со конфигурацијата во Express проектот. Отворете ја датотеката index.js, а потоа сменете го кодот за да изгледа вака:

JavaScript:
//import express
const express = require('express')

//import CORS
const cors = require('cors')

//import bodyParser
const bodyParser = require('body-parser')

//import router
const router = require('./routes')

//init app
const app = express()

//use cors
app.use(cors())

//use body parser
app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json
app.use(bodyParser.json())

//define port
const port = 3000;

//route
app.get('/', (req, res) => {
  res.send('Hello World!')
})

//define routes
app.use('/api', router);

//start server
app.listen(port, () => {
    console.log(`Server started on port ${port}`);
})

Со ова додавање на кодот, најпрво ја импортираме CORS библиотеката.

JavaScript:
//import library CORS
const cors = require('cors')

Потоа ја применуваме во Express проектот користејќи го клучниот збор use.

JavaScript:
//use cors
app.use(cors())

Може да се обидете да го користите RESTful API-то во друга апликација, на пример Android, Vue, React, Svelte и други.

Тоа би било тоа, ова е уште еден пример за креирање на RESTful API со друг програмски јазик и друга структура, секако има уште доста усовршување на кодот од погоре пред да се пушти во придукција.

Поздрав.
 
членови онлајн
мислења
теми
членови

Последни теми

Последни огласи

IT.mk/market понуда

Бесплатна достава на 3000 производи
На врв Дно