Request & Response Object trong Express
Trong bài viết mình sẽ giới thiệu về 2 objects trong Express đó là Request và Response, tiếp tục series này với một phần khá quan trọng trong Express.
Express.js là module hỗ trợ việc khởi tạo server phổ biến nhất vì nó cung cấp sự trừu tượng hóa thân thiện với nhà phát triển của module http trong Node.js. Nó giống như sử dụng jQuery thay vì document.querySelectorAll vì nó cho phép bạn, nhà phát triển, làm việc hiệu quả hơn.
Khi bạn truy cập vào một trang web thì trình duyệt sẽ request (yêu cầu) đến server làm các tác vụ mà bạn yêu cầu và sau khi xử lý hành động server sẽ phản hồi (response) lại cho người dùng.
1. Request Object trong Express là gì ?
Request Object trong Express.js cho phép bạn kiểm tra mọi khía cạnh về yêu cầu mà người dùng (client) gửi đến server(cho dù bằng trình duyệt, bằng cURL hoặc trình duyệt di động, v.v.). Trong request object bao gồm rất nhiều thứ như url, method, form data, header,...Khi bạn khởi tạo một route khi người dùng (client) truy cập đồng nghĩa với việc người dùng đã gửi cho ứng dụng Express một Request.
Bài viết này được đăng tại [free tuts .net]
Ví dụ khi người dùng đăng nhập, request object lúc này bao gồm dữ liệu như email, mật khẩu,...Việc chúng ta cần làm là lấy các giá trị của object và kiểm tra đăng nhập.
app.get('/login', (req, res) => { //Lấy username và password từ request của nguười dùng let {username, password} = req.param })
Request object là tham số req trong callback function của route. Từ bây giờ trở đi mình sẽ mặc định gọi Request object là req
cho ngắn gọn nha! Bài viết này mình sẽ liệt kê ra các thuộc tính trong req
mà Express cung cấp và chỉ ra các thuộc tính hay dùng trong quá trình khởi tạo ứng dụng Express
Làm việc với Request Object
Như mình đã đề cập ở trên, phần này mình sẽ chia ra thành 2 phần lớn đó là giới thiệu thuộc tính và chia sẻ các thuộc tính hay dùng.
Các thuộc tính có trong Req Object
Đây là một vài thuộc tính có trong req obejct mà Express cung cấp cho chúng ta :
# | Thuộc tính | Miêu tả |
---|---|---|
1. | req.app | Giữ tham chiếu đến đến middleware |
2. | req.baseurl | Hiển thị đường dẫn cụ thể đến route được chỉ định |
3. | req.body | Nó chứa key - value dữ liệu được gửi đến bởi client. Mặc định, nó có giá trị là undefined, và thông thường được gán gía trị khi ta parse body bằng middleware body-parse |
4. | req.cookies | Chứa các giá trị của cookies mà ngươi dùng gửi đến, khi ta sử dụng middleware cookiep-parse thì thuộc tính vào mới có dữ liệu. |
5. | req.fresh | Chỉ định yêu cầu này là mới khởi tạo |
6. | req.hostname | Chứa giá trị của của host trong header |
7. | req.ip | Chứa địa chỉ IP của người dùng khi request |
8. | req.ips | Khi cài đặt proxy tin cậy được bật, thuộc tính này chứa một mảng các IP cụ thể. |
9. | req.originalurl | Cũng giống như req.url, tuy nhiên nó lại chứa nguyên url của request, cho phép bạn có thể sửa đổi req.url một cách tùy ý. |
10. | req.params | Một object chứa các thuộc tính cho việc định danh route. Ví dụ bạn có một route là /posts/:postID, khi truy cập vào đường dẫn /posts/123 thì để lấy giá trị của postID bạn chỉ cần lấy bằng cách req.params.postID |
11. | req.path | Chứa path của URL |
12. | req.protocol | Một chuỗi chứa request protocol, 'http' hoặc 'https' khi request với TLS |
13. | req.query | Một object chứa các parameter của route VD: localhost:3000/user?freetuts=true&laptrinh=nodejs khi này req.query sẽ là bao gồm một object chứa {freetuts: true, laptrinh: 'nodejs' } |
14. | req.route | Một chuỗi chứa route hiện tại |
15. | req.secure | Trả về kiểu boolean có giá trị true nếu kết nối TLS được kích hoạt |
16. | req.signedcookies | Khi sử dụng middleware hỗ trợ việc sign cookie, thuộc tính này chứa cookie đã sign theo yêu cầu, chưa sign và sẵn sàng để sử dụng. |
17. | req.stale | ngược lại với req.fresh |
18. | req.subdomains | Trả về một mảng gía trị của subdomain trong domain chính |
19. | req.xhr | Trả về kiểu Boolean là true nếu trường tiêu đề "x-request-with" của yêu cầu là "xmlhttprequest". |
Một vài thuộc tính thường dùng
Mình sẽ giới thiệu tổng quan và các thuộc tính phổ biến nhất trong quá trình làm việc với Express, các bạn đọc qua các thuộc tính mà mình cung cấp ở phần trên và chú ý đến các thuộc tính phổ biến bên dưới. Mình sẽ gộp lại các phần với nhau tùy theo từng chức năng để tiện theo dõi nhé !
Lấy dữ liệu người dùng gửi đến
Có 3 cách để chúng ta nhận dữ liệu từ người dùng gửi về tùy theo từng trường hợp : req.params, req.query, và req.body
req.params
// GET https://freetuts.com/user/123 app.get('user/:userid', (req, res) => { console.log(req.params.userid) // "123" })
req.query
// GET https://freetuts.com/user?userID=123&action=changeProfile app.get('user/', (req, res) => { console.log(req.query.userID) // "123" console.log(req.query.action) // "changeProfile" })
req.body
// POST https://freetuts.net/login {username: 'admin', password: '1234'} app.get('login/', (req, res) => { console.log(req.body.username) // "admin" console.log(req.body.password) // "1234" })
Lấy các giá trị của URL :
Chúng ta có thể truy cập đến các phần tử lưu giữ các thông tin của URL như protocol, hostname, path, subdomains,.. việc này sẽ hiểu ích trong quá trình làm việc cần xử lý các tác vu liên quan đến URL
// https://freetust.net/search?keyword=nodejs app.get('/search', (req, res) => { console.log(req.protocol) // "https" console.log(req.hostname) // "freetuts.net" console.log(req.path) // "/search" console.log(req.originalUrl) // "/keyword=nodejs" console.log(req.subdomains) // "['']" })
Lấy giá trị của header
Ngoài gửi các dữ liệu và người dùng, trình duyệt còn gửi đi các header chứa các thông tin bổ sung như Connection, Keep-Alive, Proxy-Authenticate,...
app.post('/login', (req, res) => { req.header('Content-Type') // "application/json" req.header('Content-Length') // 75" req.header('user-agent') // "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/82.0.4062.3 Safari/537.36" req.header('Authorization') // "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." })
Lấy gíá trị của cookies
Khi sử dụng các midleware hỗ trợ việc parse cookie như cookie-parse
, object req.cookies
sẽ bao gồm các cookies của người dùng.
app.post('/login', (req, res) => {
req.cookies.isShowPopup; // true
req.cookies.sessionID; //gsnsjfr3j09n02v
})
2. Response Object trong NodeJS
Trong phần chúng ta sẽ cùng nhau đi tìm hiểu về Response Object trong Express. Response object trong Express thường được viết tắt là res, nó cung cấp cho bạn một cách thức đơn giản để phản hồi các yêu cầu HTTP. Trong bài viết này, mình sẽ đề cập đến những phần quan trọng nhất của response object trong Node.js.
Dưới đây là một vài phương thức cơ bản của response object, mà thường hay được sử dụng. Mình sẽ liệt kê ra bên dưới
res.send
res.send
có lẽ là phương thức nổi tiếng nhất được sử dụng trên res. Với res.send () bạn có thể trả lời các yêu cầu HTTP với tất cả các loại dữ liệu:
app.get('/', (req, res) => { res.send({ web: ['freetuts', '.net', 'laptrinh'] }) //Tự động chuyển về dạng json res.send('<h1>Freetuts</h1>') //Trả về html res.send('normal text'') //Trả về text thông thường });
res.json
Phương thức này sẽ phản hồi về dạng json
app.get('/', (req, res) => { res.json({ web: ['freetuts', '.net', 'laptrinh']}) //"{"web":["freetuts",".net","laptrinh"]}" });
res.status
Chỉ định mã phản hồi HTTP, status thể hiện trạng thái của phàn hổi.
app.get('/', (req, res) => { res.status(302) });
Mỗi đầu mã sẽ thể hiện trạng thái phàn hồi khác nhau, dưới đây là các đầu mã và trạng thái của nó:
- 1xx : Thông tin
- 2xx: Thành công
- 3xx: Chuyển hướng
- 4xx: Lỗi ở clients
- 5xx: Lỗi ở server
res.redirect
Bạn có thể chuyển hướng khách hàng đến các route trong ứng dụng hoặc đến các trang web khác nhau:
res.redirect('/home') res.redirect('https://freetuts.net')
res.render
Phương thức này sẽ phàn hồi nội dung của HTML trong file chỉ định về clients, nếu bạn kết hợp Express với các template engine như Pug, EJS,... thì phương thức này sẽ tự động biên dịch các template này sang HTML thông thường và phàn hồi cho clients.
app.get('/home', (req, res) => { res.render('home.html', {name: 'nguyentri'}); });
Ngoài ra, bạn còn có thể truyền tham số vào cho view bằng cách thêm vào một tham số là obejct chứa các giá trị muốn truyền đi.
res.end
Kết thúc phàn hồi đến clients
app.get('/home', (req, res) => { res.send('abc') res.end() });
Trong bài này chúng ta đã cùng nhau đi tìm hiểu về Request và Response Object trong Express, đây là kiến thức rất cơ bản về nó nhưng cũng hết sức quan trọng trong quá trình làm việc với Express. Mong rằng bài viết sẽ giúp ích cho bạn