Hướng Dẫn Xây Dựng RESTful CRUD API Với NodeJS, Express và MongoDB

Hướng Dẫn Xây Dựng RESTful CRUD API Với NodeJS, Express  và MongoDB

Giới Thiệu Chung

Hôm nay mình sẽ hường dẫn các bạn xây dựng một Restful CRUD API với nodejs, express và mongodb.
Các bạn cũng đã nghe khá nhiều về rest api hay restful api đúng không nào. Thì hôm nay mình cũng sẽ hướng dẫn các tạo một restful CRUD API.
Để các bạn hiểu rõ hơn mình sẽ giải thích api là gì?, rest là gì?,...

API là gì?

API (application programming interface) là giao diện dùng để tương tác giữa ứng dụng này với ứng dụng khác. API có thể trả về dữ liệu mà bạn cần cho ứng dụng của mình ở những kiểu dữ liệu phổ biến như JSON hay XML. Facebook, google là hai ứng dụng khá quen thuộc. Nó có những API riêng để cho chúng ta sử dụng để nó có thể lấy được thông tin của người dùng.

Rest là gì?

REST là từ viết tắt cho REpresentational State Transfer. REST không phải là một chuẩn hay một giao thức mà nó là một kiểu kiến trúc để viết API. Một web service là một tập hợp các giao thức và được sử dụng cho mục đích trao đổi giữa ứng dụng và hệ thống. Web service dựa trên các kiến trúc REST được biết như RESTful webservice . Những webservice này sử dụng phương thức HTTP để triển khai các định nghĩa kiến trúc REST.

RESTful API là gì?

RESTful API là một tiêu chuẩn dùng trong việc thết kế các API cho các ứng dụng web để quản lý các resource(tài nguyên). RESTful là một trong những kiểu thiết kế API được sử dụng phổ biến nhất ngày nay. Trọng tâm của REST quy định cách sử dụng các HTTP method (như GET, POST, PUT, DELETE...) và cách định dạng các URL cho ứng dụng web để quản lý các resource. RESTful không quy định logic code ứng dụng và không giới hạn bởi ngôn ngữ lập trình ứng dụng.
RESTful hoạt động như thế nào?
Có 4 hoạt động chủ yếu ta có thể kể đến khi làm việc với server: lấy dữ liệu ở một định dạng nào đó (JSON), tạo dữ liệu mới, cập nhật dữ liệu, xóa dữ liệu. REST hoạt động chủ yếu dựa vào giao thức HTTP. Các hoạt động cơ bản nêu trên sẽ sử dụng những phương thức HTTP riêng.

GET: lấy dữ liệu
POST: tạo mới
PUT: cập nhật (thay đổi)
DELETE: Xóa dữ liệu

Những phương thức hay hoạt động này thường được gọi là CRUD tương ứng với Create, Read, Update, Delete – Tạo, Đọc, Sửa, Xóa. Mỗi phương thức trên phải được API gọi thông qua để gửi chỉ thị cho server phải làm gì.

Mục Đích Của Bài Viết

Thì bài viết này mình viết nhằm mục đích là hướng dẫn các bạn viết một RESTful API. Và giới thiệu RESTful API là gì?
Chúng ta sẽ xây dựng một ứng dụng todo list đơn giản. Chúng ta sẽ xây dựng các API còn để tạo, liệt kê, chỉnh sửa và xóa todo list.
Giúp các bạn hiểu rõ hơn về RESTful API, CRUD cũng như ôn lại các kiến thức về NodeJS, Express và MongoDB.
Giới thiệu cho các bạn công cụ Postman dùng để đọc API.
Mình viết bài này khá rõ ràng và tỉ mỉ mình mong các bạn đọc một cách đầy đủ nhất.

Bắt Đầu Thôi Nào

Cài Đặt Và Thiết Lập

Trước tiên các bạn tạo cho mình một folder trong folder đó là nơi chứa các thư mục và chương trình mà chúng ta viết cho các API.
Cài đặt các module để thiết lập chương trình như:
Để mà cài các module trước hết các bạn phải download nodejs.

  • npm install --save express-generator
    Module này nó sẽ giúp chúng ta tạo nhanh khung sườn cho ứng dụng.
  • express --view=pug
    Nó sẽ tạo cho các bạn phần view engine và được setup là Pug.
  • npm install nodemon --save
    Tự động reload lại server khi bạn thay đổi code. Để khởi chạy server các bạn thêm "devStart": "nodemon app.js"vào file package.json nha. Các bạn mở terminal lên sau đó gõ npm run devStart để khởi chạy server nha.
  • npm install mongoose --save
    Mongoose là một Object Document Mapper (ODM). Điều này có nghĩa là Mongoose cho phép bạn định nghĩa các object (đối tượng) với một schema được định nghĩa rõ ràng.
  • npm install dotenv --save
    Dotenv là một module tải các biến môi trường từ tệp .env vào process.env. Lưu trữ cấu hình trong .env tách biệt với code để bảo mật thông tin.

Bắt Đầu Code Thôi Nào

Thiết lập Web Server

Trong file app.js các bạn bỏ cho mình router user và tạo cổng port cho web server. Trong folder routes các bạn cũng bỏ cho mình file user.js nha, đó là các file mặc định khi mình chạy npm install --save express-generator không cần thiết thì mình bỏ thôi nha

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var port = 5000;
var indexRouter = require('./routes/index');
var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// setup router
app.use('/', indexRouter);

// catch 404 and forward to error handler
.........
.........
.........

// error handler
.........
.........
.........
app.listen(port,function(){
  console.log("Server listening connect port" + port)
})
module.exports = app;

Trong thư mục router có file index.js, các bạn tạo cho nó một Route handlers và thử chạy sever xem sau. Mục đích để các bạn test thử server có chạy không nha.

router.get('/',function(req, res, next){
res.send('Hello World')
})

Thiết Lập Database

Cài đặt mongodb download tại đây, các bạn tạo cho mình một file .env. Trong file này các bạn tạo cho mình một đường dẫn MONGOURL=mongodb://localhost/todolist
Trong file app.js các bạn khai báo module dotenv với module mongoose và tạo đường dẫn mongodb
// path database
mongoose.connect(process.env.MONGOURL,{useNewUrlParser:true, useUnifiedTopology: true });
Bây giờ mà các bạn bạn muốn chạy được server thì phải chạy database nha.

Định Nghĩa Schema TodoList Trong Mongoose

Các bạn tạo cho mình thư mục modal bên trong thư mục gốc của ứng dụng.
Bên trong thư mục modal thì mình sẽ tạo một file todo.modal.js. Đây cũng là phần quan trọng nhất trong topic này, các bạn nhớ đọc cho kĩ nha.

var mongoose = require('mongoose')
var todo = new mongoose.Schema({
    todolist:{ type:String, required:true}
  });
 module.exports = mongoose.model('todolist', todo);

Trong file todo.modal.js chúng ta sẽ khai báo module mongoose và chúng ta sẽ tạo cho nó một schema để chứa fields todolist.

Định Nghĩa Router Cho TodoList

Trong file index.js nằm bên trong thư mục routes, tạo các phương thức để xử lý các hoạt động CRUD. Các bạn khai báo cho mình modal của Todo List nha.
var Todo = require('../modal/todo.modal')

Tạo Và Lưu Các Todo List

Cũng trong file index.js thì các bạn tạo cho mình phương thức Post(gửi dữ liệu từ client lên server). Nó sẽ tạo một object rộng, chứa các todo list được truyền vào. Rồi lưu nó vào database đã được khởi tạo.

// Create TodoList
router.post('/', function(req,res,next){
  var newTodo = new Todo()
  newTodo.todolist =  req.body.todolist;
  newTodo.save(function(err,TodoList ){
    if (err)  console.log(err);
    res.json(TodoList)
  })
})

Đọc Tất Cả Các Todo List

Cũng tương tự như ở trên mà thay đổi ở chỗ là thay Get bằng Post thôi. Thì khi sử dụng get(đọc dữ liệu từ server trả về cho client). Chúng ta sẽ tìm trong database todolist có bao nhiêu dữ liệu thì sẽ trả về bấy nhiêu dữ liệu mà tìm được trong database.

// Read TodoList
router.get('/', function(req, res, next) {
  Todo.find(function(err, TodoList){
         if(err) console.log(err)
        res.json(TodoList)
  })
});

Đọc Một Todo List

Thì ở trên của chúng ta là trả về tất cả các todo list thì bây giờ chúng ta sẽ trả về 1 todo list mà thôi. Chúng ta cũng sử dụng phương thức Get để đọc dữ liệu về mà thôi, nhưng khác ở chỗ là chỉ đọc 1 todo list mà mỗi todo list khi được tạo thì sẽ có một id riêng chúng ta sẽ dựa vào id để Get dữ liệu của từng todo list nha.

Ví dụ: Khi chúng ta Get/121312(id) thì nó sẽ tìm todo list trong database có id nào mà giống id mà router đã get không. Nếu giống thì sẽ trả về kết quả dưới dạng json, còn không giống thì sẽ log ra lỗi.

router.get('/:id', function(req, res, next){
  Todo.findById(req.params.id, function(err, TodoList){
    if (err) console.log(err);
    res.json(TodoList)
  })
})

Cập Nhật Các Todo List

Muốn cập nhật todo list các bạn sử dụng method Put nhé, thì Put có nghĩa là ghi đè(toàn bộ) hoặc tạo mới 1 resource(tài nguyên). Thì cách hoạt động của thằng này cũng dựa trên id mà thôi.
Khi chúng ta sử dụng truy vấn là findByIdAndUpdate() thì nó sẽ tìm trong database xem thử có thằng todo list nào cùng id mà router đã Put không. Nếu có thì bạn phải sẽ thay đổi các giá trị mới và lưu nó lại thành một todo list mới.

// Update TodoList
router.put('/:id', function(req, res, next){
  var data = {
    todolist:req.body.todolist
}
  Todo.findByIdAndUpdate(req.params.id, data, function(err, TodoList){
    if (err) return next(err);
    res.json(TodoList)
  })
})

Xóa Các Todo List

Thì xóa nó cũng tương tự như cập nhật thôi nhưng khác ở chỗ cập nhật là Put còn xóa là Delete. Thì phương thức xóa nó cũng dựa vào id mà xóa, nó cũng tìm id của todo list nào trong database trùng với id mà router đã delete. Nếu trùng thì xóa còn không thì log ra lỗi.

// Delete TodoList
router.delete('/:id', function(req,res,next){
  Todo.findByIdAndRemove(req.params.id, function (err, TodoList ) {
    if (err) console.log(err);
    res.json(TodoList)
   });
})

Test Các RESTful API

Muốn test các RESTful API thì chúng ta sử dụng postman nha.

Tạo Và Lưu Các Todo List Sử Dụng Post / API

Và các bạn có thể tự tạo cho mình những todo list mới nha.

Các bạn xem thử trong database đã thêm todo list mà mình đã tạo chưa nha.

Đọc Tất Cả Các Todo List Sử Dụng Get / API

Đọc Một Todo List Sử Dụng Get /:id API

Cập Nhật Todo List Sử Dụng Put /:id API

Để biết nó có thay đổi hay không các bạn sử dụng Get /:id để xem thử todo list có thay đổi hay không nha.

Xóa Todo List Sử Dụng Delete /:id API

Để xem nó đã xóa hay chưa các bạn sử dụng Get / để nó hiển thị tất cả các todo list. Nếu nó đã xóa rồi thì chỉ hiển thị một todo list mà thôi.

Vậy là xong rồi nha, các bạn có thể tham khảo code mà mình đã push lên github tại đây nha

Lời Kết

Vậy Là Xong bài Hướng Dẫn Xây Dựng RETSful CRUD API Với NodeJS, Express và MongoDB rồi nhé. Mình mong muốn sau bài topic này các bạn có thể nắm vững thêm về NodeJS, Express và MongoDB và biết thêm cũng như hiểu rõ hơn về RESTful API.

Nếu các bạn cảm thấy bài viết của mình hay thì các bạn có thể ủng hộ mình để mình có thêm động lực để ra những bài topic hay và chất lượng hơn ủng hộ mình tại đây nha.

Chúc Các Bạn Thành Công!!