Viết API đầu tiên của bạn bằng Node.js và Express: Thiết lập Server
() translation by (you can also view the original English article)
Cách thiết lập Server Express API trong Node.js
Trong bài hướng dẫn trước, chúng ta đã đi tìm hiểu về kiến trúc REST là gì, sáu hướng dẫn ràng buộc của REST, tìm hiểu các phương thức yêu cầu HTTP và code phản hồi của chúng và giải phẫu endpoint của RESTful API.
Trong hướng dẫn này, chúng ta sẽ thiết lập một server cài đặt API của chúng ta. Bạn có thể xây dựng API với bất kỳ ngôn ngữ lập trình và phần mềm server nào, nhưng chúng ta sẽ sử dụng Node.js, đây là cài đặt back-end của JavaScript và Express, một framework đơn giản, phổ biến cho Node.
Cài đặt
Yêu cầu đầu tiên của chúng ta là đảm bảo Node.js và npm được cài đặt toàn cục trên máy tính. Chúng ta có thể kiểm tra cả hai bằng cách sử dụng cờ -v
, sẽ hiển thị phiên bản của chúng. Mở công cụ dòng lệnh của bạn và gõ như sau.
1 |
node -v && npm -v |
1 |
v10.8.0 |
2 |
6.2.0 |
Phiên bản của bạn có thể hơi khác so với của tôi, nhưng miễn là có thì chúng ta có thể bắt đầu.
Hãy tạo một thư mục dự án gọi là express-api
và di chuyển đến nó.
1 |
mkdir express-api && cd express-api |
Bây giờ chúng ta đang ở trong thư mục mới của mình, chúng ta có thể khởi tạo dự án bằng lệnh init.
1 |
npm init |
Lệnh này sẽ nhắc bạn trả lời một số câu hỏi về dự án mà bạn có thể điền vào hoặc không. Một khi thiết lập đã hoàn tất, bạn sẽ có một tập tin package.json trông như thế này:
1 |
{
|
2 |
"name": "express-api", |
3 |
"version": "1.0.0", |
4 |
"description": "Node.js and Express REST API", |
5 |
"main": "index.js", |
6 |
"scripts": { |
7 |
"test": "echo \"Error: no test specified\" && exit 1" |
8 |
},
|
9 |
"author": "Tania Rascia", |
10 |
"license": "MIT" |
11 |
}
|
Bây giờ chúng ta đã có package.json, chúng ta có thể cài đặt các phụ thuộc cần thiết cho dự án. May mắn là chúng ta không yêu cầu quá nhiều phụ thuộc, chỉ có bốn thứ được liệt kê dưới đây.
- body-parser: Middleware dùng để phân tích body.
- express: Một framework đơn giản mà chúng ta sẽ sử dụng cho máy chủ của chúng ta.
- mysql: Một MySQL driver.
- request (không bắt buộc): Một cách đơn giản để thực hiện yêu cầu HTTP.
Chúng ta sẽ sử dụng lệnh install
theo sau mỗi phụ thuộc để hoàn tất thiết lập dự án của chúng ta.
1 |
npm install body-parser express mysql request
|
Điều này sẽ tạo ra một tập tin package-lock.json và một thư mục node_modules, và package.json của chúng ta sẽ được cập nhật để trông giống như thế này:
1 |
{
|
2 |
"name": "express-api", |
3 |
"version": "1.0.0", |
4 |
"description": "Node.js and Express REST API", |
5 |
"main": "index.js", |
6 |
"scripts": { |
7 |
"test": "echo \"Error: no test specified\" && exit 1" |
8 |
},
|
9 |
"author": "Tania Rascia", |
10 |
"license": "MIT", |
11 |
"dependencies": { |
12 |
"dependencies": { |
13 |
"body-parser": "^1.18.3", |
14 |
"express": "^4.16.3", |
15 |
"mysql": "^2.16.0", |
16 |
"request": "^2.88.0" |
17 |
}
|
18 |
}
|
Thiết lập HTTP Server
Trước khi bắt đầu thiết lập máy chủ Express, chúng ta sẽ nhanh chóng thiết lập một HTTP server với mô-đun http
tích hợp của Node, để tìm hiểu về cách máy chủ đơn giản hoạt động như thế nào.
Tạo một tập tin có tên hello-server.js. Load mô-đun http
, thiết lập số cổng (Tôi chọn 3001
) và tạo server bằng phương thức createServer()
.
1 |
// Build a server with Node's HTTP module
|
2 |
const http = require('http'); |
3 |
const port = 3001; |
4 |
const server = http.createServer(); |
Trong bài viết giới thiệu về REST, chúng ta đã thảo luận về các yêu cầu và phản hồi liên quan đến một HTTP server. Chúng ta sẽ thiết lập server của chúng ta để xử lý một yêu cầu và hiển thị URL yêu cầu ở phía server và hiển thị thông điệp Hello, server! cho client.
1 |
server**on('request'** (request, response) => { |
2 |
console.log(`URL: ${request.url}`); |
3 |
response.end('Hello, server!') |
4 |
})
|
Cuối cùng, chúng ta sẽ báo cho server biết cổng nào để lắng nghe và hiển thị lỗi nếu có.
1 |
// Start the server
|
2 |
server.listen(port, (error) => { |
3 |
if (error) return console.log(`Error: ${error}`); |
4 |
|
5 |
console.log(`Server is listening on port ${port}`) |
6 |
})
|
Bây giờ, chúng ta có thể khởi động server với lệnh node
theo sau là tên tập tin.
1 |
node hello-server.js |
Bạn sẽ thấy phản hồi này trong terminal:
1 |
Server is listening on port 3001 |
Để kiểm tra xem server có thực sự đang chạy hay không, hãy truy cập https://localhost:3001/
trên thanh địa chỉ trình duyệt của bạn. Nếu tất cả đều hoạt động bình thường, bạn sẽ thấy Hello, server! trên trang. Trong terminal của bạn, bạn cũng sẽ thấy URL được yêu cầu.
1 |
URL: / |
2 |
URL: /favicon.ico |
Nếu bạn trỏ đến http://localhost:3001/hello
, bạn sẽ thấy URL: /hello
.
Chúng ta cũng có thể sử dụng cURL trên local server của mình, nó sẽ cho chúng ta thấy header và body được trả về.
1 |
curl -i http://localhost:3001
|
1 |
HTTP/1.1 200 OK |
2 |
Date: Wed, 15 Aug 2018 22:14:23 GMT |
3 |
Connection: keep-alive |
4 |
Content-Length: 14 |
5 |
|
6 |
Hello, server! |
Nếu bạn đóng cửa sổ terminal bất cứ lúc nào, máy chủ sẽ biến mất.
Bây giờ chúng ta đã hiểu về cách server, yêu cầu và phản hồi hoạt động cùng nhau như thế nào, chúng ta có thể viết lại điều này trong Express, có một giao diện đơn giản hơn và các tính năng mở rộng.
Thiết lập một Express Server
Chúng ta sẽ tạo một tập tin mới, app.js, đây sẽ là điểm khởi đầu cho dự án của chúng ta. Cũng giống như với http server ban đầu, chúng ta sẽ yêu cầu một mô-đun và thiết lập một cổng để bắt đầu.
Tạo một tập tin app.js và đặt đoạn code sau vào đó.
1 |
// Require packages and set the port
|
2 |
const express = require('express'); |
3 |
const port = 3002; |
4 |
const app = express(); |
Bây giờ, thay vì tìm kiếm tất cả các yêu cầu, chúng ta sẽ nói rõ rằng chúng ta đang tìm kiếm một yêu cầu GET
trên thư mục gốc của server (/
). Khi /
nhận được yêu cầu, chúng ta sẽ hiển thị URL yêu cầu và thông điệp "Hello, Server!".
1 |
app.get('/', (request, response) => { |
2 |
console.log(`URL: ${request.url}`); |
3 |
response.send('Hello, Server!'); |
4 |
});
|
Sau cùng, chúng ta sẽ khởi động máy chủ trên cổng 3002
bằng phương thức listen()
.
1 |
// Start the server
|
2 |
const server = app.listen(port, (error) => { |
3 |
if (error) return console.log(`Error: ${error}`); |
4 |
|
5 |
console.log(`Server listening on port ${server.address().port}`); |
6 |
});
|
Chúng ta có thể khởi động server với node app.js
như chúng ta đã làm trước đây, nhưng chúng ta cũng có thể sửa đổi thuộc tính script
trong package.json để tự động chạy lệnh này.
1 |
"scripts": { |
2 |
"start": "node app.js" |
3 |
},
|
Bây giờ chúng ta có thể sử dụng npm start
để khởi động server và chúng ta sẽ thấy thông báo của server trong terminal.
1 |
Server listening on port 3002 |
Nếu chúng ta chạy curl -i
trên URL đó, chúng ta sẽ thấy rằng, lúc này nó được cung cấp bởi Express và có một số header bổ sung như Content-Type
.
1 |
curl -i http://localhost:3002
|
1 |
HTTP/1.1 200 OK |
2 |
X-Powered-By: Express |
3 |
Content-Type: text/html; charset=utf-8 |
4 |
Content-Length: 14 |
5 |
ETag: W/"e-gaHDsc0MZK+LfDiTM4ruVL4pUqI" |
6 |
Date: Wed, 15 Aug 2018 22:38:45 GMT |
7 |
Connection: keep-alive |
8 |
|
9 |
Hello, Server! |
Thêm Middleware Body Parsing
Để dễ dàng xử lý các yêu cầu POST
và PUT
cho API của chúng ta, chúng ta sẽ thêm middleware body parsing. Đây là nơi mô-đun body-parser
của chúng ta phát huy tác dụng. body-parser
sẽ trích xuất toàn bộ phần body của một yêu cầu đến và phân tích nó thành một đối tượng JSON mà chúng ta có thể làm việc với nó.
Chúng ta chỉ cần yêu cầu mô-đun ở đầu tập tin của chúng ta. Thêm câu lệnh require
sau vào đầu tập tin app.js của bạn.
1 |
const bodyParser = require('body-parser'); |
2 |
...
|
Sau đó chúng ta nói với ứng dụng Express sử dụng body-parser
, và tìm kiếm JSON.
1 |
// Use Node.js body parsing middleware
|
2 |
app.use(bodyParser.json()); |
3 |
app.use(bodyParser.urlencoded({ |
4 |
extended: true, |
5 |
}));
|
Ngoài ra, hãy thay đổi thông điệp của chúng ta để gửi một đối tượng JSON dưới dạng một phản hồi thay vì văn bản thuần túy.
1 |
response.send({message: 'Node.js and Express REST API'}); |
Sau đây là tập tin app.json đầy đủ của chúng ta.
1 |
// Require packages and set the port
|
2 |
const express = require('express'); |
3 |
const port = 3002; |
4 |
const bodyParser = require('body-parser'); |
5 |
const app = express(); |
6 |
|
7 |
// Use Node.js body parsing middleware
|
8 |
app.use(bodyParser.json()); |
9 |
app.use(bodyParser.urlencoded({ |
10 |
extended: true, |
11 |
}));
|
12 |
|
13 |
app.get('/', (request, response) => { |
14 |
response.send({ |
15 |
message: 'Node.js and Express REST API'} |
16 |
);
|
17 |
});
|
18 |
|
19 |
// Start the server
|
20 |
const server = app.listen(port, (error) => { |
21 |
if (error) return console.log(`Error: ${error}`); |
22 |
|
23 |
console.log(`Server listening on port ${server.address().port}`); |
24 |
});
|
Nếu bạn gửi curl -i
đến server, bạn sẽ thấy rằng header hiện trả về Content-Type: application/json;charset=utf-8
.
Định tuyến
Đến lúc này, chúng ta chỉ có một tuyến GET
đến thư mục gốc (/
), nhưng API của chúng ta sẽ có thể xử lý tất cả bốn phương thức yêu cầu HTTP chính trên nhiều URL. Chúng ta sẽ thiết lập một bộ định tuyến và tạo một số dữ liệu giả để hiển thị.
Hãy tạo một thư mục mới gọi là routes và một tập tin bên trong có tên là routes.js. Chúng ta sẽ liên kết với nó ở đầu của app.js.
1 |
const routes = require('./routes/routes'); |
Lưu ý rằng phần mở rộng .js
là không cần thiết trong yêu cầu. Bây giờ chúng ta sẽ di chuyển listener GET
của ứng dụng sang routes.js. Nhập code sau vào routes.js.
1 |
const router = app => { |
2 |
app.get('/', (request, response) => { |
3 |
response.send({ |
4 |
message: 'Node.js and Express REST API' |
5 |
});
|
6 |
});
|
7 |
}
|
Cuối cùng, export router
để chúng ta có thể sử dụng nó trong tập tin app.js.
1 |
// Export the router
|
2 |
module.exports = router; |
Trong app.js, thay thế code app.get()
mà bạn đã có trước đó bằng lệnh gọi tới routes()
:
1 |
routes(app); |
Bây giờ bạn có thể truy cập http://localhost:3002
và sẽ thấy tương tự như trước. (Đừng quên khởi động lại server!)
Khi tất cả đã được thiết lập và hoạt động, chúng ta sẽ cung cấp một số dữ liệu JSON với một tuyến khác. Bây giờ chúng ta chỉ sử dụng dữ liệu giả vì cơ sở dữ liệu của chúng ta chưa được thiết lập.
Hãy tạo một biến users
trong routes.js, với một số dữ liệu người dùng giả trong định dạng JSON.
1 |
const users = [{ |
2 |
id: 1, |
3 |
name: "Richard Hendricks", |
4 |
email: "richard@piedpiper.com", |
5 |
},
|
6 |
{
|
7 |
id: 2, |
8 |
name: "Bertram Gilfoyle", |
9 |
email: "gilfoyle@piedpiper.com", |
10 |
},
|
11 |
];
|
Chúng ta sẽ thêm một tuyến GET
khác vào bộ định tuyến, /users
và gửi dữ liệu người dùng thông qua nó.
1 |
app.get('/users', (request, response) => { |
2 |
response.send(users); |
3 |
});
|
Sau khi khởi động lại server, bây giờ bạn có thể truy cập http://localhost:3002/users
và bạn sẽ thấy tất cả dữ liệu của chúng ta được hiển thị.
Lưu ý: Nếu bạn không có tiện ích để xem JSON trên trình duyệt, tôi khuyên bạn nên tải về một cái, chẳng hạn như JSONView cho Chrome. Nó sẽ làm cho dữ liệu dễ đọc hơn nhiều!
Truy cập GitHub Repo của chúng tôi để xem code đầy đủ cho bài viết này và so sánh nó với code của bạn.
Phần tóm lược
Trong bài hướng dẫn này, chúng ta đã học cách thiết lập một máy chủ HTTP tích hợp và máy chủ Express trong Node, yêu cầu thông qua bộ định tuyến và URL và sử dụng dữ liệu JSON với các yêu cầu GET.
Trong phần cuối cùng của loạt bài RESTful API, chúng ta sẽ kết nối server Express của chúng ta với MySQL để tạo, xem, cập nhật và xóa người dùng trong cơ sở dữ liệu, hoàn thiện chức năng của API.