Khởi tạo HTTP web server trong Nodejs
Trong bài viết này chúng ta sẽ đi tìm hiểu về cách để khởi tạo một HTTP Web Server trong Nodejs, giới thiệu về module HTTP tích hợp trong Nodejs. HTTP là module giúp chúng ta khởi tạo một HTTP web server trên ứng dụng Nodejs.
1. HTTP là gì ?
HTTP(Hypertext Transport Protocol) là một giao thức ứng dụng cho phép phân phối, trao đổi, chia sẻ giữa các hệ thống thông tin mới nhau. HTTP là nền tảng của Word Wide Web, đây là nơi là các siêu văn bản, bao gồm các siêu liên kết đến các nguồn đươc phép truy cập. Ví dụ như bạn mở trình duyệt mà truy cập một trang web.
HTTP có chức năng là cổng đảm bảo giao thức kết nối giữa các yêu cầu của người dùng và phản hồi của server. Ví dụ như bạn đang trong trình duyệt và truy cập vào một trang web (lúc này bạn sẽ đóng vai trò là client), client gửi dữ liệu đến server xử lý. Sau khi dữ liệu được server xử lý thì sẽ phản hồi lại cho client.
2. Khởi tạo HTTP Web Server trong NodeJS
Để khởi tạo một http web server trong Nodejs chúng ta có thể dùng các thư viện bên thứ ba hoặc sử dụng module HTTP có sẵ trong NodeJS. Vì trong seri này là những kiến thức cơ bản nhất của nodejs nên mình sẽ dùng module http có sẵn trong nodejs để khởi tạo một http web server nhé !
Bài viết này được đăng tại [free tuts .net]
Module HTTP trong NodeJS
HTTP module được NodeJS xây dựng cho phéo Nodejs có thể truyền dữ liệu theo phương thức HTTP (Hypertext Transport Protocol)
Module HTTP là một nền tảng của NodeJS giúp khởi tạo để hỗ trợ các protocol phổ biến mà theo các thông thường rất khó để sử dụng, đặc biệt là các tin nhắn là dữ liệu lớn. Module HTTP được xây dựng để không chiếm quá nhiều vùng nhớ Buffer bằng cách stream data (bạn có thể đọc thêm bài viết về Streams trong Nodejs để hiểu rõ hơn nhé) .
Để sử dụng module này bạ chỉ cần khai báo sử dụng nó trong chương trình của mình :
require('http')
Khởi tạo web server bằng NodeJS sử dụng module HTTP
Module HTTP có thể khởi tạo một web server cái mà lắng nghe trên port các yêu cầu của người dùng và phản hồi lại. Bạn có thể tạo một web server trong module http bằng cách sử dụng phương thức createServer()
:
const http = require("http"); //Sử dụng phương thức createServer http.createServer(function(req, res) { //Phản hồi của server res.write("Hello World !"); //Kết thúc phản hồi res.end(); }).listen(3000); //Sử dụng port 3000 để lắng nghe
Phương thức createServer()
sẽ trả về một callback function, hàm này sẽ được thực thi khi thực hiện truy cập server sử dụng port 3000
. Chúng ta sẽ thấy 2 tham số được trả về ở callback function đó là req
và res
:
- req: biến lưu trữ yêu cầu của clients như header, method, url, data,...
- res: chứa những phương thức và thuộc tính để phản hồi lại clients.
Lưu đoạn code bên trên vào file index.js
và mở terminal và gõ dòng lệnh :
node index
Mở trình duyệt lên và truy cập địa chỉ http://localhost:3000
bạn sẽ thấy trình duyệt hiển thị :
Thêm header vào HTTP Server trong module HTTP
Chúng ta có thể tùy chỉnh header của HTTP server bằng cách thêm phương thức writeHead()
trong biến res
của callback function cái mà được tạo bởi phương thức createServer()
bằng cú pháp :
res.writeHead(statusCode, [header])
chúng ta sẽ có 2 tham số có thể truyền vào :
- statusCode: mã phàn hồi, trình duyệt sẽ dựa vào mã phản hồi để kiểm tra trạng thái của phản hồi.
- header: truyền vào một object chứa các giá trị header mà bạn muốn trả về.
Trong ví dụ này để thể hiện server phản hồi nội dung như là một HTML và mã phản hồi là 200 (thành công và không có lỗi xảy ra) :
const http = require("http"); //Sử dụng phương thức createServer http.createServer(function(req, res) { //Thêm header vào trong response res.writeHead(200, {'Content-Type': 'text/html'}); //Phản hồi của server res.write("Hello World !"); //Kết thúc phản hồi res.end(); }).listen(3000); //Sử dụng port 3000 để lắng nghe
Đọc chuỗi truy vấn từ người dùng
Callback function của phương thức server.createServer()
trả lại cho chúng ta một tham số đó là req
. Như đã đề cập ở trên, đây là một obejct chứa dữ liệu mà client gửi đến server. Nó có chứa một thuộc tính là req.url()
chứa chuỗi truy vấn từ người dùng gửi đến:
const http = require("http"); //Sử dụng phương thức createServer http.createServer(function(req, res) { //Thêm header vào trong response res.writeHead(200, {'Content-Type': 'text/html'}); //Phản hồi của server res.write(req.url); //Kết thúc phản hồi res.end(); }).listen(3000); //Sử dụng port 3000 để lắng nghe
Lưu đoạn code bên trên vào file index,js, mở terminal và chạy dòng lệnh :
node index
Nếu bạn thực hiện đúng các bước trên, khi bạn mở trình duyệt và sẽ thấy điều khác biệt giữa 2 địa chỉ :
Địa chỉ 1: http://localhost:3000/freetuts
Địa chỉ 2: http://localhost:3000/nodejs
Xây dựng HTTP Web server hoàn chỉnh sử dụng module HTTP
Chúng ta sẽ xây dựng một ứng dụng cho phép người dùng điền thông tin cá nhân vào form và sau khi submit form sẽ hiển thị lại giá trị vừa nhập :
Trước tiên, cần require 2 module đó là HTTP và QueryString (dùng để phân tích dữ liệu mà người dùng gửi về)
const http = require("http"); //Sử dụng thư viện querysting để phân tích body const qs = require('querystring');
Ta khởi tạo http web server ở port 3000 sử dụng phương thức createServer()
http.createServer(function(req, res) { }, 3000)
Trong hàm callback chúng ta sẽ phân tích object req
để kiểm tra url và method:
//Kiểm tra URL và method if (req.url === '/' && req.method === 'GET') { } if (req.url === '/' && req.method === 'POST') { }
Trong hàm kiểm tra method GET chúng ta sẽ phản hồi form cho người dùng nhập :
//Hằng số chứa form HTML hiển thị ra trong trường hợp method là GET const formHTML = ` <form method="POST" action="/"> <input type="text" name="fullName" placeholder="Full Name"> <input type="number" name="age" placeholder="Age"> <button type="submit">Send</button> </form> ` //Trả về một form res.write(formHTML) //Kết thúc phản hồi res.end();
Còn hàm kiểm tra là method POST chúng ta sẽ tiến hành xử lý dữ liệu, các bạn nhớ đọc qua về khái niệm Streams trong Nodejs nhé. Module http cũng sử dụng streams rất nhiều đó:
//Biến để chứa body let body = ""; //Bắt sự kiện data trong streams req.on("data", function(data) { body += data; }); //Bắt sự kiện end trong streams req.on("end", function() { //phân tích Body let postData = qs.parse(body); //In ra trong terminal console.log(postData); //Phản hồi lại clients res.write(`Full Name: ${postData.fullName} <br> Age: ${postData.age}`); //Kết thúc phản hồi res.end(); });
Ở đây chúng ta sẽ bắt sự kiện data và end của streams và phân tích, cuối cùng sẽ phản hồi lại clients nội dung. Ghép các đoạn code phía trên ta có đoạn code sau :
const http = require("http"); //Sử dụng thư viện querysting để phân tích body const qs = require('querystring'); //Hằng số chứa form HTML hiển thị ra trong trường hợp method là GET const formHTML = ` <form method="POST" action="/"> <input type="text" name="fullName" placeholder="Full Name"> <input type="number" name="age" placeholder="Age"> <button type="submit">Send</button> </form> ` //Sử dụng phương thức createServer http.createServer(function(req, res) { //Thêm header res.writeHead(200, {'Content-Type': 'text/html'}); //Kiểm tra URL và method if (req.url === '/' && req.method === 'GET') { //Trả về một form res.write(formHTML) //Kết thúc phản hồi res.end(); } //Kiểm tra URL và method if (req.url === '/' && req.method === 'POST') { //Biến để chứa body let body = '' //Bắt sự kiện data trong streams req.on('data', function(data) { body += data }) //Bắt sự kiện end trong streams req.on('end', function() { //phân tích Body let postData = qs.parse(body); //In ra trong terminal console.log(postData) //Phản hồi lại clients res.write(`Full Name: ${postData.fullName} <br> Age: ${postData.age}`) //Kết thúc phản hồi res.end(); }) } }).listen(3000); //Sử dụng port 3000 để lắng nghe
Lưu nó vào file index.js
và mở terminal chạy lệnh sau để khởi tạo http web server :
node index
Truy cập địa chỉ http://localhost:3000/ bạn sẽ thấy form hiển thị ra như sau:
Điền vào form và click Send bạn sẽ thấy server phàn hồi lại dữ liệu bạn vừa nhập:
Ví dụ trên là cách khởi tạo một http web server bằng module HTTP, nhưng trong dự án thực tế không sử dụng cách này bởi các dòng lệnh quá dài dòng và phức tạp. Khi sử dụng cách này việc mở rộng dự án dễ dàng là điều không thể. Bởi vậy, khi muốn tạo một http web server chúng ta thường dùng một framework hỗ trợ việc làm việc dễ dàng hơn đó là ExpressJS.
Trên đây là những kiến thức cơ bản về HTTP Web Server sử dụng module HTTP trong NodeJS. Mong bài viết này có thể giúp ích cho bạn cho việc lập trình với NodeJS, cảm ơn bạn đã quan tâm bài viết này.