Hôm nay mình sẽ tìm hiểu cách để tạo một server siêu đơn giản bằng Nodejs với module HTTP.

HTTP module là gì ??

HTTP, như cái tên của nó, module này giúp chúng ta khởi tạo một kết nối HTTP server và trả kết quả về client.

Để sử dụng bất kì module nào trong Nodejs thì cũng cần phải import nó vào thông qua từ khóa require.

const http = require('http');

Dòng code này, mình hiểu tương đương với import trong Python

import http as http

Khi đã import module rồi, mình cần hai phương thức của http để tạo server, đó là createServer() và listen().

Tạo server ra sao ?

Vậy để khởi tạo một server trên cổng 8080, mình làm như sau.

const http = require('http');

http.createServer().listen(8080);

Có thể hiểu đoạn code trên nghĩa là tạo một server là lắng nghe trên cổng 8080.

Sau khi chạy đoạn code trên, Nodejs sẽ tạo một server nằm trên localhost của máy mình và mở cổng 8080 để lắng nghe.

Mình có thể truy cập thông qua các đường link sau:

<http://localhost:8080>
<http://127.0.0.1:8080>

Hơn nữa, bên trong phương thức createServer sẽ chứa một phương thức ẩn danh (tương tự như hàm ẩn danh) và có hai tham số truyền vào.

req hoặc request là đối tượng chứa các thông số của người dùng gửi lên server

res hoặc response là đối tượng mà server sẽ trả lời cho client

Rồi… server trả lời ra sao ?

Để server có thể trả lời, mình cần một hàm ẩn danh trong phương thức createServer() như bên trên.

const http = require('http');

http.createServer(function (request, response) {
    res.writeHeader(200, {'Content-Type': 'text/html'});
    res.write("<h1 style=\"text-align:center;padding-top:45vh;\">Hello!<h1>");
    res.end();
}).listen(8080);

Trong đoạn code trên, mình thấy có ba phương thức được sử dụng.

writeHead(): Gửi header của response. Có thể tham khảo một header được gửi đi như sau.

HTTP/1.1 200 OK Date: Sun, 05 Sep 2021 13:04:34 GMT
Server: Apache/2.4.18 (Ubuntu)
Last-Modified: Thu, 12 Nov 2015 19:12:19 GMT
ETag: "2cf6-5245cb8c635cb"
Accept-Ranges: bytes
Content-Length: 11510
Vary: Accept-Encoding
Connection: close Content-Type: text/html

Mình không đi sâu vào cái header này, chỗ này mình cần biết sơ sơ về HTTP codes (200 có nghĩa là OK, xem thêm), chỉ quan trọng phần Content-Type, 'text/html' là định dạng dữ liệu trả về cho client (ở đây là dạng HTML).

write(): Trả về một chuỗi cho client, có thể là plain text hoặc html.

Ở phần header, nếu mình có Content-Type là text/plain thì cho dù chuỗi trả về là HTML nhưng browser sẽ không render.

end(): Gửi tín hiệu kết thúc response cho client.

Kết

Vậy thôi đó, đây cách mà mình tạo một HTTP server cơ bản bằng NodeJS với module http. Bài sau mình sẽ học các sử dụng file trong NodeJS để trả về một trang HTML hoàn chỉnh từ tệp tin.


Kunniii