Mình là TUẤN hiện đang là một Full-stack Developer tại Tokyo 😉.
Nếu bạn thấy Blog nà y hay xin hãy cho mình một like và đăng ký để ủng hộ mình nhé 😊.
Route Ä‘á» cáºp đến cách các endpoint
(URI) của ứng dụng phản hồi các request
của client
.
Việc xác định Route
bằng các hà m của đối tượng app Express
sẽ tương ứng với các hà m HTTP; và dụ: app.get()
để xỠlý các request GET
và app.post
để xỠlý các request POST
. Äể có danh sách đầy đủ, hãy xem app.METHOD
. Bạn cũng có thể sỠdụng app.all()
để xỠlý tất cả các hà m HTTP
và app.use()
để chỉ định một hà m middleware
là m function callback
Các hà m Route
nà y chỉ định một hà m callback
(đôi khi được gá»i là “handler functions - hà m xá» lý
â€) được gá»i khi ứng dụng nháºn được request
đến Route được chỉ định (endpoint
) và hà m HTTP
. Nói cách khác, ứng dụng “listens - lắng nghe
†các request
khá»›p vá»›i các Route và các hà m được chỉ định từ trÆ°á»›c, và khi phát hiện thấy khá»›p, ứng dụng sẽ gá»i hà m callback
được chỉ định.
Trên thực tế, các hà m Route
có thể có nhiá»u hÆ¡n má»™t hà m callback
là m đối số. Vá»›i nhiá»u hà m callback
, Ä‘iá»u quan trá»ng là phải cung cấp má»™t hà m next
như một đối số cho hà m callback
và sau đó gá»i next()
bên trong phần thân của hà m để chuyển quyá»n kiểm soát cho lần callback
tiếp theo.
Äoạn code sau đây là má»™t và dụ vá» má»™t route
rất cơ bản.
const express =require('express')const app =express()// Phản hồi lại vá»›i Client bằng Ä‘oạn text "hello world" khi yêu cầu GET được gá»i đến trang chủ
app.get('/',(req, res)=>{
res.send('hello world')})
Route methods
Các hà m Route
có nguồn gốc từ một trong các hà m HTTP
và được Ä‘Ãnh kèm vá»›i má»™t instance
của lớp express
.
Äoạn code
sau là một và dụ vỠcác Route
được xác định cho các hà m GET
và POST
tới thư mục gốc của ứng dụng.
// GET method route
app.get('/',(req, res)=>{
res.send('GET request to the homepage')})// POST method route
app.post('/',(req, res)=>{
res.send('POST request to the homepage')})
Express hỗ trợ các hà m tương ứng với tất cả các hà m request HTTP: get
,, post
v.v. Äể có danh sách đầy đủ, hãy xem app.METHOD
.
Có một hà m Route
đặc biệt là app.all()
, được sỠdụng để tải các function middleware
tại má»™t Ä‘Æ°á»ng dẫn cho tất cả các hà m request HTTP
. Và dụ: trình xỠlý sau được thực thi cho các request
đến Route
“/secret
†cho dù sỠdụng GET
, POST
, PUT
, DELETE
hoặc bất kỳ hà m request HTTP
nà o khác được hỗ trợ trong mô-đun http .
app.all('/secret',(req, res, next)=>{
console.log('Accessing the secret section ...')next()// pass control to the next handler})
Route paths
Các Route paths
, kết hợp với một hà m request
, xác định các endpoint
mà tại đó các request
có thể được thực hiện. Route paths
có thể là string
, string patterns
hoặc regular expressions
.
Các ký tự ?
, +
, *
và ()
là các táºp hợp con của các đối số regular expressions
. Dấu gạch nối (-)
và dấu chấm (.)
được hiểu theo nghÄ©a Ä‘en bằng các Ä‘Æ°á»ng dẫn dá»±a trên string
.
Nếu bạn cần sỠdụng ký tự đô la ($
) trong má»™t Ä‘Æ°á»ng dẫn string
, hãy đặt nó bên trong ([
xxx])
. Và dụ: path string
cho các request
tại “/data/$book
â€, sẽ là “/data/([$])book
â€.
Express
sỠdụng path-to-regexp để khớp với các Route paths
.
Query strings
không phải là một phần của Route paths
.
Dưới đây là một số và dụ vỠRoute paths
dựa trên string
.
Route paths
nà y sẽ khớp với request với Route /
:
app.get('/',(req, res)=>{
res.send('root')})
Route paths
nà y sẽ khớp với các request tới /about
.
app.get('/about',(req, res)=>{
res.send('about')})
Route paths
nà y sẽ khớp với các request tới /random.text
.
app.get('/random.text',(req, res)=>{
res.send('random.text')})
Dưới đây là một số và dụ vỠRoute paths
dựa trên các string patterns
.
Route paths
nà y sẽ phù hợp acd
và abcd
.
app.get('/ab?cd',(req, res)=>{
res.send('ab?cd')})
Route paths
nà y sẽ khớp abcd
, abbcd
, abbbcd
v.v.
app.get('/ab+cd',(req, res)=>{
res.send('ab+cd')})
Route paths
nà y sẽ khớp với abcd
, abxcd
, abRANDOMcd
, ab123cd
v.v.
app.get('/ab*cd',(req, res)=>{
res.send('ab*cd')})
Route paths
nà y sẽ phù hợp /abe
và /abcde
.
app.get('/ab(cd)?e',(req, res)=>{
res.send('ab(cd)?e')})
Và dụ vỠRoute paths
dựa trên regular expressions:
Route paths
nà y sẽ khớp với bất kỳ thứ gì có chữ “a†trong đó.
app.get(/a/,(req, res)=>{
res.send('/a/')})
Route paths nà y sẽ khớp butterfly
và dragonfly
, nhưng không butterflyman
, dragonflyman
v.v.
app.get(/.*fly$/,(req, res)=>{
res.send('/.*fly$/')})
Route parameters (Tham số của route)
Route parameters
(Tham số của route) là các phân đoạn URL
được đặt tên được sá» dụng để truyá»n các giá trị được chỉ định tại vị trà của chúng trong URL
. Các value
đã thu tháºp được Ä‘iá»n và o đối tượng req.params
, với tên của Route parameters
được chỉ định trong Ä‘Æ°á»ng dẫn dÆ°á»›i dạng các khóa tÆ°Æ¡ng ứng của chúng.
Route path: /users/:userId/books/:bookId
Request URL: http://localhost:3000/users/34/books/8989
req.params: { "userId": "34", "bookId": "8989" }
Äể xác định các route
với các tham số của route
, chỉ cần xác định các route parameters
trong Ä‘Æ°á»ng dẫn dÆ°á»›i đây.
app.get('/users/:userId/books/:bookId',(req, res)=>{
res.send(req.params)// kết quả sẽ là { "userId": "...", "bookId": "..." }})
Tên của các Route parameters
phải được tạo thà nh từ các ký tự ([A-Za-z0-9])
.
Vì dấu gạch nối ( -
) và dấu chấm ( .
) được hiểu theo nghĩa đen, chúng có thể được sỠdụng cùng với các Route parameters
cho các mục Ä‘Ãch hữu Ãch.
Route path: /flights/:from-:to
Request URL: http://localhost:3000/flights/LAX-SFO
req.params: { "from": "LAX", "to": "SFO" }
Route path: /plantae/:genus.:species
Request URL: http://localhost:3000/plantae/Prunus.persica
req.params: { "genus": "Prunus", "species": "persica" }
Äể có nhiá»u quyá»n kiểm soát hÆ¡n đối vá»›i string có thể được so khá»›p bởi Route parameters
, bạn có thể thêm một regular expressions
trong dấu ngoặc đơn ( ()
):
Route path: /user/:userId(d+)
Request URL: http://localhost:3000/user/42
req.params: {"userId": "42"}
Vì regular expressions
thÆ°á»ng là má»™t phần của string
, hãy đảm bảo rằng luôn có ký tự và o các ký tự nà o có thêm dấu gạch chéo ngược, chẳng hạn
d+
.
Trong Express 4.x, ký tự *
trong regular expressions
không được diá»…n giải theo cách thông thÆ°á»ng. Giải pháp thay thế, hãy sá» dụng {0,}
thay vì *
. Express 5 Ä‘iá»u nà y đã được khắc phục.
Route handlers
Bạn có thể cung cấp nhiá»u function callback
hoạt động giống như middleware
để xỠlý một request
. Ngoại lệ duy nhất là các lệnh callback
nà y có thể gá»i next('route')
để bỠqua các lệnh callback
còn lại. Bạn có thể sá» dụng cÆ¡ chế nà y để áp đặt các Ä‘iá»u kiện trÆ°á»›c cho má»™t route
, sau đó chuyển quyá»n kiểm soát cho các route
tiếp theo nếu không có lý do gì để tiếp tục với route
hiện tại.
Các trình xỠlý Route
có thể ở dạng một hà m, một array
các hà m hoặc kết hợp cả hai, như trong các và dụ sau.
Một hà m callback
duy nhất có thể xỠlý một route
. Và dụ:
app.get('/example/a',(req, res)=>{
res.send('Hello from A!')})
Nhiá»u hà m callback
có thể xỠlý một route
(đảm bảo bạn chỉ định đối tượng next
). Và dụ:
app.get('/example/b',(req, res, next)=>{
console.log('the response will be sent by the next function ...')next()},(req, res)=>{
res.send('Hello from B!')})
Một mảng các hà m callback
có thể xỠlý một route
. Và dụ:
constcb0=function(req, res, next){
console.log('CB0')next()}constcb1=function(req, res, next){
console.log('CB1')next()}constcb2=function(req, res){
res.send('Hello from C!')}
app.get('/example/c',[cb0, cb1, cb2])
Hoặc kết hợp các hà m Ä‘á»™c láºp và array (hoặc theo bất cứ cách nà o bạn thÃch) cÅ©ng có thể xá» lý má»™t route. Và dụ:
const cb0 = function (req, res,next){
console.log('CB0')next()}
const cb1 = function (req, res,next){
console.log('CB1')next()}
app.get('/example/d',[cb0, cb1],(req, res,next)=>{
console.log('the response will be sent by the next function ...')next()},(req, res)=>{
res.send('Hello from D!')})
Response methods
Các hà m của đối tượng phản hồi (res
) trong bảng sau có thể gá»i phản hồi đến client và chấm dứt chu kỳ request-response
. Nếu không có hà m nà o trong số nà y được gá»i từ trình xá» lý Route
, thì request client
sẽ bị treo.
Hà m | Mô tả |
---|---|
res.download() | Thông báo tệp đã được tải xuống máy client. |
res.end() | Kết thúc quá trình phản hồi. |
res.json() | Gá»i phản hồi vá»›i JSON. |
res.jsonp() | Gá»i phản hồi JSON vá»›i há»— trợ JSONP. |
res.redirect() | Chuyển hướng một request. |
res.render() | Render một template có thể là 1 file HTML. |
res.send() | Gá»i phản hồi của nhiá»u loại khác nhau. (cái nà y là gá»i chung hết thÃch gá»i gì gá»i) |
res.sendFile() | Gá»i tệp dÆ°á»›i dạng octet stream . |
res.sendStatus() | Phản hồi status |
app.route()
Bạn có thể tạo các trình route handlers
có thể Ä‘iá»u khiển được cho má»™t Route paths
bằng cách sỠdụng app.route()
. Bởi vì Ä‘Æ°á»ng dẫn được chỉ định tại má»™t vị trà duy nhất, việc tạo các route
theo mô-đun
rất hữu Ãch, cÅ©ng nhÆ° giảm bá»›t sá»± dÆ° thừa và lá»—i chÃnh tả.
Dưới đây là một và dụ vỠcác route handlers
được xác định bằng cách sỠdụng app.route()
.
app.route('/book').get((req, res)=>{
res.send('Get a random book')}).post((req, res)=>{
res.send('Add a book')}).put((req, res)=>{
res.send('Update the book')})
express.Router
SỠdụng lớp express.Router
để tạo các trình xỠlý Route
có thể xuất theo mô-đun
. Một Instance của Router
là một hệ thống các Route
và middleware
hoà n chỉnh; vì lý do nà y, nó thÆ°á»ng được gá»i là “mini-app
â€. Äại khái nó có thể được coi nhÆ° là má»™t app hoà n chỉnh nhÆ°ng dạng module nhá» trong má»™t app lá»›n.
Và dụ sau tạo một bộ Route
dưới dạng mô-đun
, tải một function middleware
trong đó, xác định một số Route
và sau đo import mô-đun Route
trên má»™t Ä‘Æ°á»ng dẫn trong ứng dụng chÃnh.
Tạo tệp Route
có tên birds.js
trong thư mục của ứng dụng, với nội dung sau:
const express =require('express')const router = express.Router()// middleware that is specific to this router
router.use((req, res, next)=>{
console.log('Time: ', Date.now())next()})// define the home page route
router.get('/',(req, res)=>{
res.send('Birds home page')})// define the about route
router.get('/about',(req, res)=>{
res.send('About birds')})
module.exports = router
Sau đó, import mô-đun Route
trong ứng dụng của chúng ta:
const birds =require('./birds')// ...
app.use('/birds', birds)
GiỠđây, ứng dụng sẽ có thể xỠlý các request đến /birds
và /birds/about
cÅ©ng nhÆ° gá»i hà m middleware
timeLog
cụ thể cho route.
Roundup
NhÆ° má»i khi, mình hy vá»ng bạn thÃch bà i viết nà y và há»c thêm được Ä‘iá»u gì đó má»›i.
Cảm Æ¡n và hẹn gặp lại các bạn trong những bà i viết tiếp theo! ðŸ˜
Nếu bạn thấy Blog nà y hay xin hãy cho mình một like và đăng ký để ủng hộ mình nhé. Thank you.😉
Ref
Nguồn: viblo.asia