Hãy cùng khám phá chi tiết trong bài viết dưới đây của Mytour để hiểu rõ hơn về RESTful API trong Node.js là gì và cách tạo RESTful API như thế nào.
Khám phá chi tiết về RESTful API trong Node.js
1. REST là gì?
2. Chuẩn bị
3. Cách tạo RESTful API bằng Node.js
4. Thiết lập Server
5. Thiết lập schema
6. Thiết lập route
7. Thiết lập Controller
8. Kết nối mọi thứ với nhau
9. Kiểm tra thông qua Postman
10. Thêm middleware
1. REST là gì?
REST là từ viết tắt của cụm từ Representational State Transfer, đây là một kiểu cấu trúc web chuẩn và sử dụng giao thức HTTP. Kiểu cấu trúc thiết kế RESTful mô tả 6 ràng buộc ban đầu được Roy Fielding trình bày trong luận án tiến sĩ của ông. Cơ sở của kiểu thiết kế RESTful bao gồm:
1. Giao diện thống nhất
2. Stateless
3. Cache
4. Client - Server (máy khách - máy chủ)
5. Hệ thống phân tầng.
6. Lập trình theo yêu cầu (tùy chọn)
Các ứng dụng RESTful sử dụng request HTTP để thực hiện 4 hoạt động chính được gọi là CRUD , trong đó: C là viết tắt của tạo, R là viết tắt của đọc, U là viết tắt của cập nhật và D là viết tắt của xóa.
RESTful bao gồm các phương thức như URL cơ sở, URL, loại phương tiện, ... . Trong phần tiếp theo, Mytour sẽ hướng dẫn bạn cách tạo RESTful API bằng Node.js.
2. Chuẩn bị
Trước khi bắt đầu quá trình tạo RESTful API, dưới đây là những công cụ mà bạn cần chuẩn bị trước:
- Sử dụng Node.js
- MongoDB
- Trình soạn thảo dòng lệnh (như Atom, Sublime, ...)
- Sử dụng Postman
3. Hướng dẫn tạo RESTful API bằng Node.js
Tiếp theo, chúng ta sẽ thực hiện việc tạo RESTful API. Trong quá trình này, chúng ta sẽ xây dựng danh sách API (gồm các điểm kết thúc để thêm, lấy danh sách hoặc đọc tất cả các nhiệm vụ, đọc một nhiệm vụ cụ thể, xóa một nhiệm vụ và cập nhật một nhiệm vụ).
Giả sử
Assume bạn đã thiết lập môi trường (tức là đã cài đặt Node.js và MongoDB).
Chạy lệnh npm -v và mongo --version để kiểm tra phiên bản của NPM và MongoDB đang sử dụng.
Sau khi cài đặt Node và MongoDB, thực hiện các bước sau để tạo RESTful API bằng Node.js.
Mở Terminal và thực hiện các bước sau đây:
Bước 1: Tạo một thư mục mới và đặt tên là todoListApi , bằng cách chạy lệnh mkdir todoListApi.
Bước 2: Điều hướng đến thư mục gốc của thư mục mới bạn vừa tạo bằng lệnh cd todoListApi.
Bước 3: Sau đó chạy lệnh npm init để tạo một file package.json.
File Package.json chứa thông tin cần thiết cho npm, giúp xác định dự án và xử lý các phụ thuộc của dự án.
npm init đặt câu hỏi về thông tin như tên ứng dụng, mô tả, phiên bản, tác giả, từ khóa.
Màn hình hiển thị như sau:
Nhập Yes và nhấn Enter để hoàn tất tạo package.json. Cấu trúc thư mục sẽ như dưới đây:
Bước 4: Sử dụng lệnh touch server.js để tạo file có tên là server.js.
Trong server này, chúng ta sẽ viết các giao thức để khởi tạo server.
Bước 5: Tạo thư mục api bằng lệnh mkdir api.
Trong thư mục api, tạo 3 thư mục khác có tên là models, routes, và controllers bằng cách chạy lệnh mkdir api/controllers api/models api/routes.
Bước 6: Tạo todoListController.js trong thư mục api/controllers, todoListRoutes.js trong thư mục api/routes và todoListModel trong thư mục api/models bằng cách chạy lệnh touch api/controllers/todoListController.js api/models/todoListModel.js api/routes/todoListRoutes.js.
Cấu trúc thư mục sẽ có dạng như sau:
4. Khởi tạo Server
Bước tiếp theo là cài đặt express và nodemon, express được sử dụng để tạo server và nodemon được sử dụng để theo dõi các thay đổi trong ứng dụng bằng cách xem các file đã thay đổi và tự động khởi động lại server. Sử dụng các lệnh dưới đây:
npm install --save-dev nodemon
npm install express --save
Sau khi thành công cài đặt express và nodmon, file package.json sẽ được chỉnh sửa để thêm 2 package mới.
1. Mở file package.json và thêm công việc sau vào scripts:
'start': 'nodemon server.js'
2. Mở file server.js và thêm đoạn mã sau:
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
app.listen(port);
console.log('Server RESTful API danh sách công việc đã được khởi động trên cổng: ' + port);
3. Trong cửa sổ Terminal, chạy lệnh npm run start để khởi động server. Trên màn hình, bạn sẽ nhìn thấy thông báo như sau:
Server RESTful API danh sách công việc đã được khởi động trên cổng: 3000
5. Xây dựng cấu trúc
Bước đầu tiên là cài đặt mongoose, sử dụng lệnh npm install mongoose --save .
Chúng ta sẽ sử dụng Mongoose để tương tác với một biến thể MongoDB(Database). Sau khi cài đặt xong Mongoose, mở file todoListModel.js trong thư mục api/models, nhập đoạn mã dưới đây vào file và lưu lại:
'use strict';
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var TaskSchema = new Schema({
title: {
kiểu: Chuỗi,
bắt buộc: 'Vui lòng nhập tên công việc'
},
Ngày_tạo: {
kiểu: Ngày,
mặc định: Date.now
},
trạng_thái: {
kiểu: [{
kiểu: Chuỗi,
enum: ['đang chờ', 'đang tiến hành', 'đã hoàn thành']
}],
mặc định: ['đang chờ']
}
});
module.exports = mongoose.model('Công_việc', TaskSchema);
Trong mã nguồn trên, thêm thư viện mongoose vào tệp, sau đó tạo một mô hình mô tả cách hiển thị bảng công việc như thế nào.
Nhìn vào đó, bảng công việc sẽ chứa tên là một chuỗi và ngày tạo, trạng thái công việc được xác định là đang chờ xử lý - giá trị mặc định cho mỗi công việc được tạo.
6. Cài đặt route
Route này quyết định cách ứng dụng xử lý các yêu cầu từ máy khách tại một điểm cuối cụ thể, đó là một URL (hoặc đường dẫn) và một phương thức yêu cầu HTTP cụ thể (GET, POST, ...)
Mỗi route có một hàm xử lý riêng biệt, được thực thi khi route được kết hợp.
Dưới đây là 2 route cơ bản ('/congviec' và '/congviec/idcongviec') với các phương thức khác nhau.
'/congviec' có hai phương thức ('GET' và 'POST'), trong khi '/congviec/idcongviec' có phương thức GET, PUT và DELETE.
Tiếp theo, chúng ta sẽ yêu cầu bộ điều khiển cho mỗi phương thức của route để gọi hàm xử lý tương ứng.
Để thực hiện điều này, mở tệp todoListRoutes.js trong thư mục routes và thêm đoạn mã sau:
'use strict';
module.exports = function(ungdung) {
var danhSachCongViec = require('../controllers/todoListController');
// Các đường dẫn của Danh sách Công việc
ungdung.route('/congviec')
.get(danhSachCongViec.danh_sach_cong_viec)
.post(danhSachCongViec.tao_cong_viec_moi);
ungdung.route('/congviec/:idCongViec')
.get(danhSachCongViec.doc_mot_cong_viec)
.put(danhSachCongViec.cap_nhat_cong_viec)
.delete(danhSachCongViec.xoa_cong_viec);
};
7. Cài đặt Bộ điều khiển
Mở tệp todoListController.js bằng trình soạn thảo dòng lệnh trên máy tính của bạn.
Trong Bộ điều khiển này, chúng ta sẽ viết 5 hàm khác nhau, bao gồm: danh_sach_cong_viec, tao_cong_viec_moi, doc_mot_cong_viec, cap_nhat_cong_viec, xoa_cong_viec. Sau đó sẽ xuất từng hàm để sử dụng trong các route.
Mỗi hàm sẽ sử dụng các phương pháp của mongoose khác nhau, bao gồm find, findById, findOneAndUpdate, save và remove.
'use strict';
var mongoose = require('mongoose'),
CongViec = mongoose.model('CongViec');
exports.danh_sach_cong_viec = function(req, res) {
CongViec.find({}, function(err, congViec) {
if (err)
res.send(err);
res.json(congViec);
});
};
exports.tao_cong_viec_moi = function(req, res) {
var cong_viec_moi = new CongViec(req.body);
cong_viec_moi.save(function(err, congViec) {
if (err)
res.send(err);
res.json(congViec);
});
};
exports.doc_mot_cong_viec = function(req, res) {
CongViec.findById(req.params.idCongViec, function(err, congViec) {
if (err)
res.send(err);
res.json(congViec);
});
};
exports.cap_nhat_cong_viec = function(req, res) {
CongViec.findOneAndUpdate({_id: req.params.idCongViec}, req.body, {new: true}, function(err, congViec) {
if (err)
res.send(err);
res.json(congViec);
});
};
exports.xoa_cong_viec = function(req, res) {
CongViec.remove({
_id: req.params.idCongViec
}, function(err, congViec) {
if (err)
res.send(err);
res.json({ message: 'Công việc đã được xóa thành công' });
});
};
8. Liên kết tất cả với nhau
Trong phần trước, chúng ta đã có mã để cài đặt và chạy server trong tệp server.js. Phần này sẽ kết nối bộ điều khiển, cơ sở dữ liệu, các mô hình đã tạo, bodyparser và các route đã tạo với nhau.
Mở tệp server.js đã tạo trong phần trước và thực hiện theo các bước dưới đây để liên kết tất cả với nhau.
Nhìn chung, chúng ta sẽ thay đổi mã trong tệp server.js của mình bằng đoạn mã snippet.
1. Kết nối đến cơ sở dữ liệu bằng cách thêm URL vào biến kết nối của mongoose.
2. Tải model đã tạo - công việc.
3. Cài đặt bodyParser và sử dụng.
BodyParser phân tích các phần tử yêu cầu trong middleware trước khi đến handler, thông tin được lưu trong thuộc tính req.body.
Tất cả các middleware sẽ điền thuộc tính req.body với dữ liệu từ bodyParser hoặc một đối tượng trống ({}) nếu không có dữ liệu nào để phân tích (hoặc trả về một lỗi).
4. Đăng ký route đã tạo trong server.
var express = require('express'),
ungdung = express(),
cong = process.env.PORT || 3000,
mongoose = require('mongoose'),
CongViec = require('./api/models/todoListModel'), // đây là nơi tải model đã tạo
bodyParser = require('body-parser');
// Kết nối đến URL cơ sở dữ liệu của mongoose
mongoose.Promise = global.Promise;
mongoose.connect('mongodb://localhost/CongViecdb');
ungdung.use(bodyParser.urlencoded({ extended: true }));
ungdung.use(bodyParser.json())
var duongdan = require('./api/routes/todoListRoutes'); //nhập route
duongdan(ungdung); //đăng ký route
ungdung.listen(cong);
console.log('todo list RESTful API server đã bắt đầu tại: ' + cong);
5. Khởi động máy chủ MongoDB.
Mở Terminal và chạy lệnh mongod.
Lệnh trên sẽ khởi động server MongoDB, sau đó server node có thể kết nối với các bản sao MongoDB. Sau khi server MongoDB chạy, khởi động lại server node bằng cách chạy lệnh rs trên cửa sổ Nodemon Terminal.
9. Kiểm tra qua Postman
Sau khi mọi thứ đã được kết nối, thử kiểm tra từng đường dẫn và các phương thức tương ứng.
Mở postman và nhập lệnh dưới đây vào:
1. Nhập http://localhost:3000/congviecs
Lúc này trên màn hình sẽ hiển thị '[]' vì chưa có gì trong cơ sở dữ liệu.
2. Trên cùng địa chỉ, thay đổi phương thức thành GỬI, click chọn nội dung và chọn 'x-www-form-urlencoded'.
Tiếp theo nhập tên trong phần key và nội dung tương ứng trong phần value, click chọn nút Gửi.
10. Thêm middleware
Giả sử nếu bạn nhập 'http://localhost:3000/congviecs
Về cơ bản Middleware chặn các yêu cầu http và bạn có thể sử dụng nó để thực hiện một số hoạt động khác nhau, như xác thực, ... .
Để thực hiện điều này, mở file server.js và dán đoạn mã snippet sau vào:
app.use(function(req, res) {
res.status(404).send({url: req.originalUrl + ' không tìm thấy'})
});
Đoạn mã trên sẽ thực hiện chuyển hướng và phản hồi mỗi khi có lỗi trong route trên trang web.
Đó là bài viết giới thiệu về RESTful API trong Node.js. Bạn cũng có thể tham khảo những bài viết khác trên Mytour để hiểu rõ hơn về Utility Module và Web Module trong Node.js.
