Hướng dẫn xây dựng một webserver RESTful API cực easy bằng Nodejs , Express.js và MongoDB (P.2)

273

Xin chào các bạn! Ở bài trước mình đã có hướng dẫn các bạn cách để setup một project Nodejs xây dựng một webserver RESTful API cực easy bằng Nodejs , Express.js và MongoDB. Hôm nay, chúng ta sẽ cùng nhau đi tiếp phần còn lại trong series này nhé!

Lưu ý: Bạn nào chưa có xem bài trước trong series xây dựng một webserver RESTful API cực easy bằng Nodejs , Express.js và MongoDB (P.1) thì nhấp vào link ở phần bôi đen nhé!”

# Những nội dung có trong bài này là gì?

  1. Tạo API có các phương thức POST, GET, PUT, DELETE (Tạo – Lấy – Update – Xoá) dữ liệu.
  2. Test API trên Postman.

OK! Không luyên thuyên nói nhiều nữa. Bắt đầu vào code thôi nào ^^.

#1 Tạo API có các phương thức POST, GET, PUT, DELETE.

Ở bài trước mình mình có giới thiệu sẽ đi xây dựng một ứng dụng TicketCar đơn giản. Nhưng vì ứng dụng khá rộng nên mình sẽ chọn phần Stations (bến xe) trong project này để làm nhé!

Bắt đầu phân tích bài toán thôi!

Đầu vào dữ liệu của một Bến Xe thì cần có các thông tin cơ bản như sau:

// Stations 
{
name: "", // tên bến xe
address: "" , // địa chỉ của bến xe,
province: "" , // thuộc địa phần Tỉnh, TP ?,
phone: "", // phone của bến xe,
createdAt: "" , // ngày tạo 
}

OK! Chúng đa đã biết được cấu trúc dữ liệu của một Bến Xe nó như thế nào rồi đúng không nè?

Tạo models

Các bạn tạo một file station.js ở thư mục models nhé! Chúng ta sẽ đi định nghĩa Schema Station trong Models. Tham khảo code của mình bên dưới nhé!

const mongoose = require('mongoose');
const stationSchema = new mongoose.Schema({
  name: { type: String, required: true },
  address: { type: String, required: true },
  province: { type: String, required: true },
  phone: {type: String , required: true},
  createdAt: { type: Number, default: Date.now }
});
module.exports = mongoose.model('Station', stationSchema, 'Station');

Bắt đầu viết phương thức đầu tiên. Các bạn ở file index.js trong thư mục routes và viết phương thức trong file này luôn nhé. Code thôi nè!

Phương thức POST

Nghiệp vụ của mình là lấy dữ liệu ở req.body (gửi dữ liệu từ client lên server), lưu vào Database.

File index.js

const express = require('express'),
router = express.Router(),
Station = require("../models/stations");

// POST
router.post("/station/create", async (req, res) => { 
    const {name, address, phone, province} = req.body;  // => const name = req.body.name
    await Station.findOne({name})
    .then(station => { 
        if(station) { 
           Promise.reject({messenger: "Station is already exist"}) 
        }
        const newStation = new Station({
            name,   // => name : req.body.name
            province,
            phone,
            address
        });
        newStation.save();
        return res.status(200).json({station: newStation})
    })
    .catch(error => { 
        return res.status(500).json(error)
    })
});

module.exports = router;

Phương thức GET

Ở phương thức GET sẽ có 2 kiểu GET dữ liệu:

  • GET tất cả dữ liệu trong database (GET ALL)
  • GET lấy dữ liệu theo ID item

#1 GET tất cả dữ liệu

const express = require('express'),
router = express.Router(),
Station = require("../models/stations");

//  GET ALL
router.get("/stations", async (req, res) => { 
    await Station.find()
    .then(stations => { 
        return res.status(200).json({stations: stations})
    })
    .catch(error => { 
        return res.status(500).json(error)
    })
});
module.exports = router;

#2 GET lấy dữ liệu theo ID item

Mỗi khi POST (Tạo) một Station (Bến Xe) thì dữ liệu sẽ tự động tạo ra ID cho mỗi Station đó. Chúng ta sẽ dựa vào ID để GET thằng mà mình muốn lấy.

const express = require('express'),
router = express.Router(),
Station = require("../models/stations");

//  GET PARAMS ID 
router.get("/station/:id", async (req, res) => {
    const {id} = req.params; // => id : lấy id 
    await Station.findById(id)
    .then(station => { 
        return res.status(200).json({station: station})
    })
    .catch(error => { 
        return res.status(500).json(error)
    })
});
module.exports = router;

Phương thức PUT

Với phương thức PUT thì chúng ta cũng sẽ chỉ update theo ID item. Tìm ID và update theo dữ liệu mà người dùng thay đổi => lưu vào database.

const express = require('express'),
router = express.Router(),
Station = require("../models/stations");

// PUT - UPDATE
router.put("/station/:id", async (req, res) => {
  const { id } = req.params; // => id : lấy id
  const { name, address, phone, province } = req.body; // => const name = req.body.name
  await Station.findById(id)
    .then((station) => {
      if (!station) {
        Promise.reject({ messenger: "Station does not exist!" });
      }
      const data = { 
        name,
        address, 
        province,
        phone
      };
      Station.findByIdAndUpdate(id, data, (err) => { 
        if(err) { 
            Promise.reject({messenger: err})
        }
        return res.status(200).json({stationUpdate: data})
      })
    })
    .catch((error) => {
      return res.status(500).json(error);
    });
});
module.exports = router;

Phương thức DELETE

Tương tự như GET thì phương thức DELETE cũng sẽ có 2 kiểu DELETE là:

  • DELETE tất cả dữ liệu trong collection (Delete all)
  • DELETE theo ID

#1 DELETE tất cả dữ liệu trong collection (Delete all)

const express = require('express'),
router = express.Router(),
Station = require("../models/stations");
// DELETE ALL
router.delete("/stations/", async (req, res) => {
  await Station.deleteMany()
    .then(() => {
      return res
        .status(200)
        .json({
          messenger: "Delete successfuly!",
        });
    })
    .catch((error) => {
      return res.status(500).json(error);
    });
});
module.exports = router;

#2 DELETE theo ID item

const express = require('express'),
router = express.Router(),
Station = require("../models/stations");
// DELETE ID
router.delete("/station/:id", async (req, res) => {
    const { id } = req.params; // => id : lấy id
    await Station.findById(id)
      .then((station) => {
        if (!station) {
          Promise.reject({ messenger: "Station does not exist!" });
        }
        station.deleteOne();
        return res.status(200).json({messenger: "Delete successfuly!"})
      })
      .catch((error) => {
        return res.status(500).json(error);
      });
});
module.exports = router;

Full code file server.js

const express = require("express"),
  router = express.Router(),
  Station = require("../models/stations");

// POST
router.post("/station/create", async (req, res) => {
  const { name, address, phone, province } = req.body; // => const name = req.body.name
  await Station.findOne({ name })
    .then((station) => {
      if (station) {
        Promise.reject({ messenger: "Station is already exist" });
      }
      const newStation = new Station({
        name, // => name : req.body.name
        province,
        phone,
        address,
      });
      newStation.save();
      return res.status(200).json({ station: newStation });
    })
    .catch((error) => {
      return res.status(500).json(error);
    });
});

// GET ALL
router.get("/stations", async (req, res) => {
  await Station.find()
    .then((stations) => {
      return res.status(200).json({ stations: stations });
    })
    .catch((error) => {
      return res.status(500).json(error);
    });
});

// GET ALL
router.get("/station/:id", async (req, res) => {
  const { id } = req.params; // => id : lấy id
  await Station.findById(id)
    .then((station) => {
      return res.status(200).json({ station: station });
    })
    .catch((error) => {
      return res.status(500).json(error);
    });
});

// PUT - UPDATE
router.put("/station/:id", async (req, res) => {
  const { id } = req.params; // => id : lấy id
  const { name, address, phone, province } = req.body; // => const name = req.body.name
  await Station.findById(id)
    .then((station) => {
      if (!station) {
        Promise.reject({ messenger: "Station does not exist!" });
      }
      const data = {
        name,
        address,
        province,
        phone,
      };
      Station.findByIdAndUpdate(id, data, (err) => {
        if (err) {
          Promise.reject({ messenger: err });
        }
        return res.status(200).json({ stationUpdate: data });
      });
    })
    .catch((error) => {
      return res.status(500).json(error);
    });
});

// DELETE ALL
router.delete("/stations/", async (req, res) => {
    await Station.deleteMany()
      .then(() => {
        return res
          .status(200)
          .json({
            messenger: "Delete successfuly!",
          });
      })
      .catch((error) => {
        return res.status(500).json(error);
      });
  });

//DELETE ID 
router.delete("/station/:id", async (req, res) => {
    const { id } = req.params; // => id : lấy id
    await Station.findById(id)
      .then((station) => {
        if (!station) {
          Promise.reject({ messenger: "Station does not exist!" });
        }
        station.deleteOne();
        return res.status(200).json({messenger: "Delete successfuly!"})
      })
      .catch((error) => {
        return res.status(500).json(error);
      });
});

module.exports = router;

Vậy là chúng mình đã viết được RESTful API đơn giản rồi nè^^. Full source code mình để tại link github nhé !

Link github: https://github.com/bestkakarot1996/thejsdoor-api-ticket

#2 Test API trên Postman

Code mà! phải có bug thôi đúng không nè ^^. Nên phải test cho chắc chắn nhé. Mình sử dụng Postman để test xem API chạy có đúng hay không. Link tải và cài đặt postman tại đây!

  • Test phương thức POST
Tạo dữ liệu thành công
  • Test phương thức GET
GET theo ID
GET all
  • Test phương thức PUT
Update dữ liệu
Update thành công ở DB
  • Test phương thức DELETE
Delete thành công

OK! Vậy là chúng ta đã xây dựng được một ứng web server RETSful API đơn giản bằng Nodejs, Express, MongoDB rồi. Bạn nào có thắc mắc gì cứ comment dưới phần cuối bài nhé!

Tham khảo bài trước : https://thejsdoor.com/lap-trinh-backend/lap-trinh-nodejs/huong-dan-xay-dung-mot-web-restful-api-ky-easy-bang-nodejs-express-js-va-mongodb-p-1/

Chúc bạn thành công nhé!