Blog#28: Routing trong Nodejs Express – [Express Tutorial – Part 1/10] 😊 (Series: Bí kíp Javascript – PHẦN 23)

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

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,, postv.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 /abevà /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, dragonflymanv.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 middlewaretimeLog 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

Bài viết liên quan

Thay đổi Package Name của Android Studio dể dàng với plugin APR

Nếu bạn đang gặp khó khăn hoặc bế tắc trong việc thay đổi package name trong And

Lỗi không Update Meta_Value Khi thay thế hình ảnh cũ bằng hình ảnh mới trong WordPress

Mã dÆ°á»›i đây hoạt Ä‘á»™ng tốt có 1 lá»—i không update được postmeta ” meta_key=

Bài 1 – React Native DevOps các khái niệm và các cài đặt căn bản

HÆ°á»›ng dẫn setup jenkins agent để bắt đầu build mobile bằng jenkins cho devloper an tÃ

Chuyển đổi từ monolith sang microservices qua ví dụ

1. Why microservices? Microservices là kiến trúc hệ thống phần má»m hÆ°á»›ng dịch vụ,