Mẫu khởi động plug-and-play có thể giúp bạn bắt đầu phát triển API ứng dụng web của mình
Trong bài viết này, chúng ta sẽ xây dựng một mẫu khởi động cơ bản [hoặc bản soạn sẵn] có thể được sử dụng để xây dựng các API REST mạnh mẽ và an toàn bằng cách sử dụng Node, Express và Mongoose. Nó có thể được sử dụng cho bất kỳ loại dự án nào bất kể logic và yêu cầu
Bạn có thể hỏi rằng có nhiều mẫu dành cho người mới bắt đầu và tại sao tôi lại phát minh lại bánh xe. Tất cả các mẫu hiện có đều tuyệt vời, nhưng tôi cảm thấy rằng tôi phải phát triển một mẫu theo phong cách của mình để một số nhà phát triển ngoài kia có phong cách phát triển tương tự có thể thích và được hưởng lợi từ nó
Đã nói rằng, chúng ta hãy bắt đầu
điều kiện tiên quyết
Bắt đầu 🚀️
Tạo một thư mục mới có tên là “node-boilerplate” và điều hướng đến thư mục
mkdir node-boilerplate && cd node-boilerplate
Khởi tạo một dự án mới bằng lệnh
0npm i express mongoose dotenv uuid mongo-sanitize morgan --save
Bạn sẽ được hỏi một loạt câu hỏi về dự án
Sau khi trả lời những câu hỏi đó, hãy xác minh thông tin chi tiết và nhấn “Enter”. Bạn có thể tìm thấy một tệp mới có tên là “gói. json” được tạo trong thư mục gốc dự án của bạn
Đây giống như một tệp cấu hình cho ứng dụng của bạn
Bây giờ, chúng tôi sẽ cài đặt tất cả các phụ thuộc mà tôi sẽ sử dụng phổ biến trong khi xây dựng API REST bằng Node, Express và MongoDB
npm i express mongoose dotenv uuid mongo-sanitize morgan --save
Sử dụng sudo nếu cần
Bây giờ chúng ta hãy đi qua từng mô-đun để hiểu mục đích của nó
Thể hiện. Express là một khung web nhanh, thiết yếu và nổi tiếng nhất của Node. js, được thiết kế để xây dựng các ứng dụng web và API. Nó đã được gọi là khung máy chủ tiêu chuẩn thực tế cho Node. js
cầy mangut. Mongoose là thư viện Mô hình hóa dữ liệu đối tượng [ODM] cho MongoDB và Node. js. Nó quản lý các mối quan hệ giữa dữ liệu, cung cấp xác thực lược đồ và được sử dụng để dịch giữa các đối tượng trong mã và biểu diễn của các đối tượng đó trong MongoDB
dotenv. Trong các hệ thống sản xuất, chúng ta không nên mã hóa cứng dữ liệu nhạy cảm như Khóa API, Mã thông báo bí mật, v.v. trực tiếp trong cơ sở mã [dựa trên phương pháp Ứng dụng mười hai yếu tố]. Chúng tôi sẽ chuyển chúng dưới dạng biến môi trường. Mô-đun này giúp chúng tôi tải các biến môi trường từ một. tập tin env vào
UUID. Chúng tôi cần tạo một id duy nhất cho một số nội dung, bất kể ứng dụng là gì. Bất kể logic cốt lõi có thể là gì, chúng tôi sẽ cần tạo các id duy nhất trong ứng dụng của mình như “userId”, “ordered”, “articleId”, v.v. Vì vậy, đây là gói phổ biến để tạo id duy nhất ngẫu nhiên trong ứng dụng của chúng tôi
Mongo-vệ sinh. Mô-đun này được sử dụng để bảo mật ứng dụng của chúng tôi khỏi các cuộc tấn công đưa vào bộ chọn truy vấn. Chức năng khử trùng sẽ loại bỏ bất kỳ khóa nào bắt đầu bằng '$' trong đầu vào, vì vậy chúng tôi có thể chuyển nó sang MongoDB mà không phải lo lắng về việc người dùng độc hại ghi đè bộ chọn truy vấn
Morgan. Nó là một phần mềm trung gian ghi nhật ký yêu cầu HTTP. Chúng tôi sẽ sử dụng gói này để ghi lại các yêu cầu tấn công máy chủ của chúng tôi. Mô-đun này hỗ trợ các tùy chọn khác nhau
Sau khi cài đặt tất cả các mô-đun, bạn phải thấy dòng sau ở cuối thiết bị đầu cuối của mình
Nếu có bất kỳ lỗ hổng nào, hãy nâng cấp ngay mô-đun có lỗ hổng lên phiên bản mới nhất hoặc sử dụng lệnh
1 để giảm thiểu sự cốnpm i express mongoose dotenv uuid mongo-sanitize morgan --save
Tuy nhiên, lỗ hổng vẫn tồn tại?
Người mới bắt đầu học
Khi tất cả các phụ thuộc được cài đặt, hãy tạo một ứng dụng tệp. js trong thư mục cấp cao nhất của dự án
Thêm các nội dung sau vào nó
const express = require["express"];
const morgan = require["morgan"];
app.get["/ping", [req, res] => {
console.log["Server started listening on port : ", PORT];
Bây giờ hãy lưu tệp và chạy lệnh
2 trong thiết bị đầu cuối của bạn. Nếu mọi thứ đều ổn, thì bạn phải xemnpm i express mongoose dotenv uuid mongo-sanitize morgan --save
Server started listening on port: 5000
Từ giai đoạn này, chúng tôi sẽ thêm nhiều nội dung mới vào dự án của chúng tôi. Vì vậy, thật khó chịu khi khởi động lại máy chủ phát triển bất cứ khi nào chúng tôi thực hiện thay đổi
Vì vậy, chúng tôi có thể sử dụng thư viện có tên là gật đầu, giúp giảm rất nhiều thời gian phát triển bằng cách tự động khởi động lại ứng dụng của chúng tôi bất cứ khi nào bất kỳ tệp nào liên quan đến dự án của chúng tôi bị thay đổi và lưu lại
Hãy tiếp tục và cài đặt nó
Bạn có thể nhận thấy rằng chúng tôi sử dụng cờ
3, có nghĩa là chúng tôi lưu mô-đun dưới dạng phụ thuộc phát triểnnpm i express mongoose dotenv uuid mongo-sanitize morgan --save
Chúng ta không nên sử dụng gật đầu trên sản xuất
Bây giờ hãy để chúng tôi thực hiện một số thay đổi đối với gói của chúng tôi. tập tin json
Thay thế phần
4 bằng mã saunpm i express mongoose dotenv uuid mongo-sanitize morgan --save
Lưu gói của bạn. json và chạy lệnh sau
Bạn sẽ thấy đầu ra sau trong thiết bị đầu cuối của mình
Bạn có thể nhận thấy rằng nó nói “đang xem tiện ích mở rộng. js,mjs,json”. Trong trường hợp nếu bạn có các loại tệp khác, thì mặc định các thay đổi trong các tệp đó sẽ không được theo dõi bởi nodemon. Bạn có thể định cấu hình nhiều tiện ích mở rộng hơn bằng cách sử dụng tệp cấu hình gật đầu. Bạn có thể đọc thêm về nó trong tài liệu
Bây giờ hãy thử thực hiện một số thay đổi trong ứng dụng. js, nodemon sẽ tự động khởi động lại máy chủ cho chúng tôi
Điều đó thật tuyệt, phải không?
Kết nối với cơ sở dữ liệu
Bây giờ chúng ta có thể kết nối ứng dụng của mình với cơ sở dữ liệu bằng cầy mangut
Có hai lựa chọn. Chúng tôi có thể sử dụng MongoDB Atlas hoặc sử dụng máy chủ cộng đồng MongoDB cục bộ
Tôi thích đám mây MongoDB hơn cho sản xuất. Vì vậy, hãy đăng ký MongoDB Atlas, tạo một cụm và lấy chuỗi kết nối
Tạo một. env trong thư mục gốc của dự án. Đó là nơi chúng tôi sẽ lưu trữ tất cả các biến môi trường. Tất cả các biến môi trường sẽ được tải vào ứng dụng của chúng tôi bằng cách sử dụng mô-đun “dotenv” như đã thảo luận ở trên
Thêm chuỗi kết nối mongodb của bạn vào tệp
5 và lưu nónpm i express mongoose dotenv uuid mongo-sanitize morgan --save
MONGO_URL =
Bây giờ hãy thêm các nội dung sau vào tệp
6npm i express mongoose dotenv uuid mongo-sanitize morgan --save
const express = require["express"];
.connect[process.env.MONGO_URL]
console.log["Database connection Success!"];
console.error["Mongo Connection Error", err];
const PORT = process.env.PORT || 5000;
app.post["/ping", [req, res] => {
status: "Server is up and running",
console.log["Server started listening on port : ", PORT];
Lưu các tập tin
Đầu ra của bạn có thể chứa một số cảnh báo không dùng nữa từ 'mongoose'
[node:29440] DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option`{ useNewUrlParser: true }` to MongoClient.connect
[node:29440] DeprecationWarning: current Server Discovery and Monitoring engine is
deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option `{ useUnifiedTopology: true }` to the MongoClient constructor.
Bao gồm các tùy chọn đó trong khi kết nối với cơ sở dữ liệu
.connect[process.env.MONGO_URL, {
console.log[“Database connection Success!”];
console.error[“MongoDB Connection Error”, err];
Bây giờ nếu bạn lưu ứng dụng. js, bạn sẽ không thấy những cảnh báo đó
Cho phép Ping
Đã đến lúc kiểm tra máy chủ của chúng tôi bằng Postman. Hãy để chúng tôi thử gửi yêu cầu “ping” đến máy chủ của chúng tôi bằng cách nhấn vào điểm cuối
7npm i express mongoose dotenv uuid mongo-sanitize morgan --save
BÙM 🎉 Nó hoạt động. Nếu bạn ping nhiều lần và nhìn vào thiết bị đầu cuối của mình, bạn có thể thấy việc sử dụng thư viện 'morgan'
Bạn sẽ thấy một cái gì đó như thế này
Phân tích nhật ký Morgan
8. Phương thức yêu cầu HTTP [như GET, POST, PUT…]npm i express mongoose dotenv uuid mongo-sanitize morgan --save
9. Đường dẫn tài nguyên mà chúng tôi cố gắng truy cậpnpm i express mongoose dotenv uuid mongo-sanitize morgan --save
0. Đó là mã trạng thái phản hồiconst express = require["express"];
const morgan = require["morgan"];
app.get["/ping", [req, res] => {
console.log["Server started listening on port : ", PORT];
1. Thời gian phản hồi tính bằng msconst express = require["express"];
const morgan = require["morgan"];
app.get["/ping", [req, res] => {
console.log["Server started listening on port : ", PORT];
2. Độ dài nội dung phản hồi tính bằng byteconst express = require["express"];
const morgan = require["morgan"];
app.get["/ping", [req, res] => {
console.log["Server started listening on port : ", PORT];
Thêm phần mềm trung gian bảo mật
Tạo một thư mục
3 trong thư mục gốc của dự án. Bên trong thư mục tạo một tệp có tênconst express = require["express"];
const morgan = require["morgan"];
app.get["/ping", [req, res] => {
console.log["Server started listening on port : ", PORT];
4 chứa đoạn mã sauconst express = require["express"];
const morgan = require["morgan"];
app.get["/ping", [req, res] => {
console.log["Server started listening on port : ", PORT];
Như đã thảo luận ở trên, bạn nên làm sạch yêu cầu trước khi sử dụng chúng trong truy vấn cầy mangut
Ngoài ra, API ứng dụng của chúng tôi chỉ được truy cập từ các miền cụ thể để chúng tôi có thể tránh được nhiều lỗ hổng bảo mật
Để đạt được điều đó, chúng ta cần tạo một phần mềm trung gian và plugin khác cho phần mềm trung gian cấp tốc. Vì vậy, tất cả các yêu cầu sẽ được kiểm tra đối với các miền trong danh sách trắng
Tạo một tệp có tên
5 bên trong thư mục phần mềm trung gianconst express = require["express"];
const morgan = require["morgan"];
app.get["/ping", [req, res] => {
console.log["Server started listening on port : ", PORT];
module.exports = [req, res, next] => {
let isDomainAllowed = allowedOrigins.indexOf[req.hostname] !== -1;
return res.status[403].json[{
message: "Access Restricted"
Lưu tệp, nhập tệp trong ứng dụng. js và sử dụng nó
Thêm dòng sau vào tệp
6npm i express mongoose dotenv uuid mongo-sanitize morgan --save
+ app.use[restrictOrigin];
Lưu ứng dụng. tập tin js
Trong dự án này, tên miền được phép là localhost. Thay đổi nó trong khi sử dụng nó trong dự án của bạn
Thật tuyệt💫 Bản soạn sẵn của chúng tôi gần như đã sẵn sàng
Hãy xem cấu trúc dự án của chúng tôi
Cấu trúc thư mục
Đây là cấu trúc của bản soạn sẵn của chúng tôi
Ở đây các thư mục bình luận, bài đăng và bạn bè chỉ được thêm vào chẳng hạn. Nó sẽ thay đổi tùy theo yêu cầu của dự án
Logic cốt lõi của ứng dụng của bạn phải được triển khai bên trong thư mục src. Tạo thư mục bên trong thư mục src dựa trên các tính năng. Bạn có thể tạo nhiều thư mục con như helpers, models, v.v. , bên trong mỗi thư mục tính năng
Tất cả các điểm cuối sẽ được xác định bên trong thư mục tuyến đường. Logic sẽ được xử lý bởi các tập tin điều khiển. Bạn có thể xác định các tùy chọn cấu hình cơ bản trong phần cấu hình. tập tin js
Các chức năng khác có thể được xác định trong thư mục misc
Bạn có thể sử dụng mẫu này để xây dựng dịch vụ xác thực người dùng an toàn như thế này
Phần kết luận
Vâng, như đã đề cập ở trên, đây là một mẫu bắt đầu rất cơ bản nhưng nó sẽ rất hữu ích khi chúng ta quen với nó. Hãy tin tôi, bằng cách tạo bản soạn sẵn của riêng mình, chúng ta có thể tiết kiệm rất nhiều thời gian và năng lượng khi bắt đầu thực hiện mọi dự án mới. Hãy cho tôi biết nếu bạn có bất cứ điều gì để thảo luận với tôi. tôi sẽ rất vui khi được nghe