Часть 2. Создание конечных точек API для публикации или получения данных

В этой статье вы узнаете, как создаются конечные точки для выполнения операции CRUD (создание, чтение, обновление, удаление) с данными, хранящимися в базе данных MongoDB Atlas, с использованием Rest-API.



В приведенной выше статье мы увидели, как настроить проект Node.js и подключить нашу базу данных MongoDB к Node.js. Теперь мы начнем с создания конечных точек api.

1. Сначала мы должны создать схему того типа данных, который мы хотим в нашем API, мы создадим схему для продуктов в магазине.

Создайте папку в главном каталоге с именами модели и создайте файл с именем Products.js и следующий код.

const mongoose = require('mongoose') // required to make the schema
const ProductSchema = mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  price: {
   type: Number,
   required: true,
  },
})
// we are exporting our schema for table Products.
module.exports = mongoose.model('Products', ProductSchema)

2. Мы должны определить маршруты для получения данных и публикации данных.

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

Перейдите к app.js в главном каталоге и напишите код входа для маршрута продукта, как показано ниже, перед кодом подключения mongodb:

// making the /products route for our product
const ProductRoute = require('./Routes/Product');
app.use('/products', ProductRoute)

Перейдите к файлу product.js в папке routes, чтобы начать создание маршрута получения и отправки, как описано ниже:

// we are making express router to handle different kinds of request like get/post/patch/delete
const express = require('express')
const router = express.Router()
// We will me making this file in next step which will handle all our logic 
const ProductController = require('../controllers/product')
// All these routes are there for our products like this: 
// (http://localhost:5000/products/get) for getting all product
// (http://localhost:5000/products/post) for posting a product
router.get('/get', ProductController.get_all_product);
router.post('/post',ProductController.create_product)
router.get('/:productId', ProductController.get_single_product)
router.patch('/:productId',ProductController.patch_product_details)
router.delete('/:productId',ProductController.delete_product)
module.exports = router

3. Заставить контроллер обрабатывать всю логику маршрутов.

Перейдите в основной каталог проекта и создайте папку с именем контроллер и создайте внутри нее файл с именем product.js.

Теперь в этом файле будет вся логика маршрута, как показано ниже.

Для / получения запроса:

// schema of the product table
const Product = require('../models/Product')
// Logic for the get request to get all the products
exports.get_all_product = async (req, res) => {
  try {
    // finding all the product in the table
    const products = await Product.find()
    // To check in the console 
    console.log(products)
    res.send(products)
   }catch (err) {
      res.send({ message: err })
   }
}
// Logic for the get request to get the single product
exports.get_single_product = (req, res) => {
    const id = req.params.productId; //get the productid from params
    Product.findById(id)
      .then(result => {
          res.send(result) // if product is found then returned
      })
      .catch(err => {
         res.send({message: err}) //gives error if product not found
      })
}

для / post запрос

exports.create_product = async (req, res) => {
   console.log(req.file)
   
   // retrieving data from json body of post request
   const product = new Product({
      name: req.body.name,
      price: req.body.price,
     });
   product.save()
    .then(result => {
       res.status(200).send({
        _id: result._id,
        name: result.name,
        price: result.price,
        request: {
           type: 'GET',
           url: 'http://localhost:5000/products/' + result._id
          }
        })
      })
   .catch(err => {
      res.send({ message: err })
    })
}

для запроса / патча

exports.patch_product_details = (req, res) => {
   const id = req.params.productId; // get product ID from params
   const update = {}
   // checks for the value to be updated in item
   for (const ops of req.body) {
       update[ops.propName] = ops.value;
   }
   Product.update({ _id: id }, { $set: update })
   .exec()
   .then(result => {
       res.send(result)
    })
   .catch(err => {
      res.send(err)
    })
}

для запроса / удаления

exports.delete_product = (req, res) => {
   const id = req.params.productId; //checks for productId to delete
   Product.remove({ _id: id }) // removes product from table
     .exec()
     .then(result => {
         res.send(result)  //sends the result back
      })
     .catch(err => {
        res.send(err)    // sends error if product is not updated
      })
}

Мы выполнили все маршруты и логику, необходимые для работы API, вы можете проверить свой API, попробовав любые инструменты тестирования API, такие как Postman.

Пропустили часть 1? Посмотрите это ниже



Возникла ошибка? Без проблем! Оставьте комментарий и я обязательно постараюсь его решить.

Больше контента на plainenglish.io