- Bài 1: Node.js - Giới Thiệu
- Bài 2: Nodejs - Khởi tạo server
- Bài 3: NodeJS - REPL Terminal
- Bài 4: NodeJS - NPM
- Bài 5: NodeJS - Khái niệm callbacks
- Bài 6: Nodejs - Sự kiện lặp
- Bài 7: NodeJS - Sự kiện Emitter
- Bài 8: NodeJs - Buffer
- Bài 9: NodeJS - Streams
- Bài 10: NodeJS - Đọc ghi File
- Bài 11: NodeJS - Biến toàn cục
- Bài 12: NodeJS - Utility Module
- Bài 13: NodeJS - Web Module
- Bài 14: NodeJS - Express Framework
- Bài 15: NodeJS - RESTful API
- Bài 16: NodeJS - Request
- Bài 17: NodeJS - Response
- Bài 18: NodeJS - Scaling Ứng dụng
- Bài 19: NodeJS - Package
Bài 12: NodeJS - Utility Module - NodeJS cơ bản cho người mới bắt đầu
Đăng bởi: Admin | Lượt xem: 1381 | Chuyên mục: NodeJS
Thư viện Node.js Module cung cấp nhiều Utility Module giúp ích bạn rất nhiều trong khi phát triển các ứng dụng về Node.js. Bảng dưới đây liệt kê và miêu tả các Utility Module này.
- os Module : Cung cấp các hàm tiện ích cơ bản liên quan tới hệ điều hành.
- path Module : Cung cấp các tiện ích để xử lý và biến đổi đường dẫn tới file.
- net Module : Hoạt động như là Network Wrapper, biến Server và Client thành các Stream.
- dns Module : Cung cấp các hàm để thực hiện DNS Lookup.
- domain Module : Được sử dụng để can thiệp các lỗi chưa được xử lý
1. OS Module trong Node.js
os Module trong Node.js cung cấp các hàm tiện ích cơ bản liên quan đến hệ điều hành. Module này có thể được import bởi cú pháp sau đây:
var os = require("os")
Phương thức của os Module trong Node.js
- os.tmpdir() : Trả về thư mục mặc định cho các file tạm thời
- os.hostname() : Trả về hostname của Hệ điều hành.
- os.type() : Trả về tên của Hệ điều hành.
- os.platform() : Trả về nền tảng của Hệ điều hành.
- os.arch() : Trả về cấu trúc CPU của Hệ điều hành.
- os.totalmem() : Trả về tổng dung lượng bộ nhớ (đơn vị byte).
- os.freemem() : Trả về tổng dung lượng bộ nhớ chưa dùng đến (đơn vị byte).
- os.cpus() : Trả về mảng đối tượng chứa thông tin về CPU/core: model, speed (giá trị MHz), và thời gian.
- os.networkInterfaces() : Lấy danh sách các Network Interface.
Thuộc tính của os Module trong Node.js
os.EOL: Một hằng số định nghĩa End-Of-Line cho Hệ điều hành.
Ví dụ
Dưới đây là ví dụ minh họa một số phương thức của os Module trong Node.js. Bạn tạo main.js có nội dung sau:
var os = require("os"); // In thong tin ve kieu cua OS
console.log('OS Type la: ' + os.type()); // In thong tin ve OS platform
console.log('OS Platform : ' + os.platform()); // In thong tin ve tong dung luong bo nho
console.log('Tong dung luong bo nho : ' + os.totalmem() + " byte."); // In thong tin ve tong dung luong bo nho roi
console.log('Tong dung luong bo nho roi : ' + os.freemem() + " byte.");
Chạy main.js để xem kết quả::
$ node main.js
Kiểm tra kết quả:
OS Type la : LinuxOS Platform : linuxTong dung luong bo nho : 25103400960 byte.Tong dung luong bo nho roi : 20676710400 byte.
2. Path Module trong Node.js
path Module trong được sử dụng để Resolve và chuyển đổi các đường dẫn tới file. Module này có thể được inport theo cú pháp:
var path = require("path")
Phương thức của path Module trong Node.js
- path.normalize(p) : Chuẩn hóa đường dẫn
- path.join([path1][, path2][, ...]) : Kết hợp tất cả các tham số là đường dẫn với nhau và sau đó chuẩn hóa đường dẫn kết quả tạo ra
- path.resolve([from ...], to) : Resolve một đường dẫn tuyệt đối.
- path.isAbsolute(path) : Xác định xem đó có phải là đường dẫn tuyệt đối không. Một đường dẫn tuyệt đối luôn luôn trỏ đến cùng một vị trí, bất kể thư mục đang làm việc là gì.
- path.relative(from, to) : Resolve một đường dẫn tương đối.
- path.dirname(p) : Trả về tên thư mục của một đường dẫn.
- path.basename(p[, ext]) : Trả về phần cuối cùng của một đường dẫn
- path.extname(p) : Trả về đuôi của đường dẫn (ví dụ txt)
- path.parse(pathString) : Trả về một đối tượng từ một chuỗi biểu diễn đường dẫn
- path.format(pathObject) : Trả về một chuỗi biểu diễn đường dẫn từ một đối tượng, phương thức này trái ngược với phương thức path.parse trên.
Thuộc tính của path Module trong Node.js:
- path.sep : Biểu thị File Separator của nền tảng cụ thể. Nó có thể là '\\' hoặc '/'.
- path.delimiter : iểu thị Path Delimiter của nền tảng cụ thể, có thể là ';' hoặc ':'.
Ví dụ
Ví dụ dưới đây minh họa cách sử dụng một số phương thức và thuộc tính của pathModule trong Node.js. Bạn tạo main.js có nội dung sau:
var path = require("path"); // Chuan hoa duong dan voi phuong thuc normalize()
console.log('Phuong thuc NORMALIZE : ' + path.normalize('/test/test1//2slashes/1slash/tab/..')); // Ket hop cac tham so dau vao de tao mot duong dan
console.log('Phuong thuc JOIN : ' + path.join('/test', 'test1', '2slashes/1slash', 'tab', '..')); // Resolve mot duong dan tuyet doi
console.log('Phuong thuc RESOLVE : ' + path.resolve('main.js')); // Lay thong tin cua duoi duong dan
console.log('Phuong thuc EXTNAME : ' + path.extname('main.js'));
Chạy main.js để xem kết quả::
$ node main.js
Kiểm tra kết quả.
Phuong thuc NORMALIZE : /test/test1/2slashes/1slashPhuong thuc JOIN : /test/test1/2slashes/1slashPhuong thuc RESOLVE : /web/com/1427176256_27423/main.jsPhuong thuc EXTNAME : .js
3. Net Module trong Node.js
net Module trong Node.js được sử dụng để tạo Server và Client. Module này cung cấp một Network Wrapper không đồng bộ và có thể được import với cú pháp:
var net = require("net")
- net.createServer([options][, connectionListener])
Tạo một TCP Server mới. Tham số connectionListener tự động được thiết lập để thành một Listener cho sự kiện 'connection'. - net.connect(options[, connectionListener])
Đây là một phương thức factory, trả về một 'net.Socket' mới và kết nối tới address và port đã cho. - net.createConnection(options[, connectionListener])
Đây là một phương thức factory, trả về một 'net.Socket' mới và kết nối tới address và port đã cho. - net.connect(port[, host][, connectListener])
Tạo một kết nối TCP tới port trên host đã cho. Nếu host không được cung cấp, thì giá trị mặc định là 'localhost'. Tham số connectListener sẽ được thêm vào như là Listener cho sự kiện 'connect'. - net.createConnection(port[, host][, connectListener])
Tạo một kết nối TCP tới port trên host đã cho. Nếu host không được cung cấp, thì giá trị mặc định là 'localhost'. Tham số connectListener sẽ được thêm vào như là Listener cho sự kiện 'connect'. - net.connect(path[, connectListener])
Tạo một kết nối Unix Socket tới đường dẫn đã cho. Tham số connectListener sẽ được thêm vào như là Listener cho sự kiện 'connect'. - net.createConnection(path[, connectListener])
Tạo một kết nối Unix Socket tới đường dẫn đã cho. Tham số connectListener sẽ được thêm vào như là Listener cho sự kiện 'connect'. - net.isIP(input)
Kiểm tra xem input có phải là một địa chỉ IP address không. Trả về giá trị 0 cho một chuỗi không hợp lệ, 4 cho phiên bản địa chỉ IP v4, và trả về 6 cho địa chỉ IP v6. - net.isIPv4(input)
Trả về true nếu input là địa chỉ IP v4, nếu không là false. - net.isIPv6(input)
Trả về true nếu input là địa chỉ IP v6, nếu không là false.
Lớp net.Server trong Node.js
Lớp net.Server được sử dung để tạo một TCP Server hoặc Local Server.
Phương thức của lớp net.Server trong Node.js
- server.listen(port[, host][, backlog][, callback])
Bắt đầu chấp nhận kết nối trên port và host đã cho. Nếu không cung cấp tham số host, Server sẽ chấp nhận các kết nối trực tiếp tới bất kỳ địa chỉ IPv4 nào (INADDR_ANY). Nếu giá trị port là 0 sẽ gán một port ngẫu nhiên. - server.listen(path[, callback])
Khởi động một Local Server để nghe các kết nối trên path đã cho. - server.listen(handle[, callback])
Đối tượng handle có thể được thiết lập cho Server hoặc Socket. Việc này làm cho Server chấp nhận kết nối tới một handle cụ thể. - server.listen(options[, callback])
Tham số options có thể là các thuộc tính port, host, và backlog. Tham số callback là một hàm callback tùy ý mà làm việc như khi gọi tới phương thức server.listen(port, [host], [backlog], [callback]) . - server.close([callback])
Đóng tất cả các kết nối đã kết thúc và Server sinh một sự kiện 'close'. - server.address()
Trả về một địa chỉ bound address và port của Server, như đã được báo cáo bởi Hệ điều hành. - server.unref()
Việc gọi phương thức unref trên một Server sẽ cho phép chương trình thoát ra. - server.ref()
Trái ngược với phương thức unref(), việc gọi phương thức ref() sẽ không cho phép chương trình thoát ra. - server.getConnections(callback)
Lấy số các kết nối đồng thời trên một Server một cách không đồng bộ. Hàm callback nên nhận hai tham số err (để Resolve lỗi) và count (để đếm).
Sự kiện của lớp net.Server trong Node.js
- listening
Xảy ra khi Server đã được gắn kết sau một lời gọi tới server.listen. - connection
Xảy ra khi tạo một kết nối mới - close
Xảy ra khi đóng Server - error
Xảy ra khi xuất hiện bất kỳ lỗi nào. Sự kiện 'close' sẽ trực tiếp được gọi sau sự kiện này.
Lớp net.Socket trong Node.js
Đối tượng này là lớp trừu tượng của TCP hoặc Local Socket. net.Socket kế thừa duplex Stream interface. Chúng có thể được tạo bởi người dùng hoặc bởi một Client (bởi phương thức connect()) hoặc có thể được tạo bởi Node.js và được truyền tới người dùng thông qua sự kiện 'connection' của một Server.
Sự kiện của net.Socket trong Node.js
net.Socket là một eventEmitter và nó sinh các sự kiện sau.
- lookup
Xảy ra sau khi đã Resolve một hostname nhưng trước khi kết nối - connect
Xảy ra khi một kết nối Socket được thiết lập thành công - data
Xảy ra khi dữ liệu đã được nhận. Tham số data sẽ là một Buffer hoặc String. Phần mã hóa của data được thiết lập bởi socket.setEncoding(). - error
Xảy ra khi xuất hiện bất kỳ lỗi nào. Sự kiện 'close' sẽ được gọi trực tiếp sau sự kiện này. - close
Xảy ra khi Socket đã được đóng.
Thuộc tính của net.Socket trong Node.js
net.Socket có nhiều thuộc tính hữu ích giúp bạn điều khiển tốt hơn trong việc tương tác với Socket.
- socket.bufferSize
Thuộc tính này chỉ số lượng ký tự đã được đệm - socket.remoteAddress
Biểu diễn chuỗi của địa chỉ Remote IP. - socket.remoteFamily
Biểu diên chuỗi của Remote IP Family. Đó là 'IPv4' hoặc 'IPv6'. - socket.remotePort
Biểu diễn dạng số của Remote Port. Ví dụ 80 hoặc 21. - socket.localAddress
Biểu diễn chuỗi của địa chỉ Local IP mà một Remote Client kết nối tới. Ví dụ, nếu bạn đang lắng nghe trên '0.0.0.0' và Client kết nối trên '192.168.1.1', thì giá trị sẽ là '192.168.1.1'. - socket.localPort
Biểu diễn dạng số của Local Port. Ví dụ 80 hoặc 21. - socket.bytesRead
Số lượng byte đã nhận được. - socket.bytesWritten
Số lượng byte đã được gửi.
Phương thức của net.Socket trong Node.js
- new net.Socket([options])
Xây dựng một đối tượng Socket mới. - socket.connect(port[, host][, connectListener])
Mở kết nối cho một Socket đã cho. Nếu bạn cung cấp hai tham số port và host, thì khi đó Socket sẽ được mở dưới dạng như là một TCP Socket. Nếu bạn không cung cấp host, thì giá trị mặc định là localhost. Nếu bạn cung cấp tham số path, thì Socket sẽ đươc mở dưới dạng như một Unix Socket tới đường dẫn path đó. - socket.connect(path[, connectListener])
Mở kết nối cho một Socket đã cho. Nếu bạn cung cấp hai tham số port và host, thì khi đó Socket sẽ được mở dưới dạng như là một TCP Socket. Nếu bạn không cung cấp host, thì giá trị mặc định là localhost. Nếu bạn cung cấp tham số path, thì Socket sẽ đươc mở dưới dạng như một Unix Socket tới đường dẫn path đó. - socket.setEncoding([encoding])
Thiết lập mã hóa encoding cho Socket dưới dạng như một Readable Stream. - socket.write(data[, encoding][, callback])
Gửi dữ liệu trên Socket. Tham số thứ hai xác định mã hóa trong trường hợp dữ liệu dạng chuỗi. Mã hóa mặc định là UTF8. - socket.destroy()
Bảo đảm rằng không có bất kỳ hoạt động I/O xảy ra trên Socket này. Phương thức này chỉ cần thiết khi xuất hiện lỗi. - socket.pause()
Tạm dừng việc đọc dữ liệu. Do đó sự kiện 'data' không được sinh - socket.resume()
Tiếp tục việc đọc dữ liệu sau khi đã tạm dừng với phương thức pause().
Ví dụ
Dưới đây là ví dụ minh họa một số phương thức và thuộc tính của net Module trong Node.js.
Tạo server.js có nội dung:
var net = require('net');
var server = net.createServer(function(connection)
{ console.log('Ket noi voi Client');
connection.on('end', function()
{ console.log('Mat ket noi voi Client'); });
connection.write('Hello World!\r\n');
connection.pipe(connection); });
server.listen(8080, function()
{ console.log('Server dang lang nghe'); });
Chạy server.js để xem kết quả:
$ node server.js
Kiểm tra kết quả.
Server dang lang nghe
Tiếp đó, bạn tạo client.js như dưới đây
var net = require('net');
var client = net.connect({port: 8080}, function()
{ console.log('Da ket noi voi Server!'); });
client.on('data', function(data) { console.log(data.toString());
client.end(); }); client.on('end', function()
{ console.log('Mat ket noi voi Server'); });
Chạy client.js trên một màn hình terminal khác để xem kết quả:
$ node client.js
Kiểm tra kết quả.
Da ket noi voi Server!Hello World!Mat ket noi voi Server
Kiểm tra kết quả trên màn hình Terminal đang chạy server.js:
Server dang lang ngheKet noi voi ClientMat ket noi voi Client
4. DNS Module trong Node.js
dns Module trong Node.js được sử dụng để thực hiện DNS Lookup. Module cung cấp một Network Wrapper không đồng bộ và có thể được import với cú pháp.
var dns = require("dns")
- dns.lookup(hostname[, options], callback)
Resolve một hostname (ví dụ 'google.com') vào trong bản ghi A (IPv4) hoặc AAAA (IPv6) đầu tiên được tìm thấy. Tham số options có thể là một đối tượng hoặc một số nguyên. Nếu bạn không cung cấp tham số options, thì các địa chỉ IP v4 và v6 đều hợp lệ. Nếu options là một số nguyên, thì nó phải là 4 hoặc 6. - dns.lookupService(address, port, callback)
Resolve một address và port đã cho vào trong một hostname - dns.resolve(hostname[, rrtype], callback)
Resolve một hostname (ví dụ 'google.com') vào trong một mảng các kiểu bản ghi đã được xác định bởi tham số rrtype. - dns.resolve4(hostname, callback)
Giống như dns.resolve(), nhưng chỉ cho các truy vấn IPv4 (một truy vấn A). - dns.resolve6(hostname, callback)
Giống như dns.resolve4(), nhưng chỉ cho các truy vấn (một truy vấn AAAA). - dns.resolveMx(hostname, callback)
Giống như dns.resolve(), nhưng chỉ cho các truy vấn Mail Exchange. - dns.resolveTxt(hostname, callback)
Giống như dns.resolve(), nhưng chỉ cho các truy vấn Text - dns.resolveSrv(hostname, callback)
Giống như dns.resolve(), nhưng chỉ cho các truy vấn SRV - dns.resolveSoa(hostname, callback)
Giống như dns.resolve(), nhưng chỉ cho các truy vấn SOA - dns.resolveNs(hostname, callback)
Giống như dns.resolve(), nhưng chỉ cho các truy vấn NS - ns.resolveCname(hostname, callback)
Giống như dns.resolve(), nhưng chỉ cho các truy vấn CNAME - dns.reverse(ip, callback)
Đảo ngược việc resolve một địa chỉ IP thành một mảng bao gồm các hostname
Giá trị rrtype của dns Module trong Node.sj
Danh sách dưới liệt kê các giá trị rrtypes được sử dụng bởi phương thức dns.resolve():
A - Giá trị mặc định là các địa chỉ IPV4
AAAA - Các địa chỉ IPV6
MX - Các bản ghi về Mail Exchange
TXT - Các bản ghi về Text
SRV - Các bản ghi về SRV
PTR - Được sử dụng để đảo chiều IP Lookup
NS - Các bản ghi về Name Server
CNAME - Các bản ghi về Canonical Name
SOA - Là viết tắt của Start of Authority Record
Một số Error Code của dns Module trong Node.js
Mỗi truy vẫn DNS có thể trả về một trong các Error Code sau:
dns.NODATA - DNS Server trả về phản hồi mà không bao gồm dữ liệu nào.
dns.FORMERR - DNS Server thông báo truy vấn sai định dạng.
dns.SERVFAIL - DNS Server trả về một lỗi chung.
dns.NOTFOUND - Không tìm thấy tên miền.
dns.NOTIMP - DNS Server không triển khai hoạt động request.
dns.REFUSED - DNS Server từ chối truy vấn.
dns.BADQUERY - Truy vấn sai định dạng.
dns.BADNAME - Hostname sai định dạng.
dns.BADFAMILY - Address Family không được hỗ trợ.
dns.BADRESP - Phản hồi từ DNS sai định dạng.
dns.CONNREFUSED - Không thể kết nối tới DNS Server.
dns.TIMEOUT - Timeout trong khi kết nối tới DNS Server.
dns.EOF - Viết tắt của End of file.
dns.FILE - Xảy ra lỗi trong khi đọc file.
dns.NOMEM - Hết bộ nhớ.
dns.DESTRUCTION - Channel đang bị hủy.
dns.BADSTR - Chuỗi sai định dạng.
dns.BADFLAGS - Các Flag không hợp lệ.
dns.NONAME - Hostname không phải dưới dạng số.
Ví dụ
Ví dụ sau minh họa một số phương thức của dns Module trong Node.js. Bạn tạo main.js có nội dung sau:
var dns = require('dns');
dns.lookup('www.google.com', function onLookup(err, address, family)
{ console.log('Dia chi:', address);
dns.reverse(address, function (err, hostnames)
{ if (err) { console.log(err.stack); }
console.log('Phuong thuc REVERSE cho dia chi: ' + address + ' thanh mang cac hostname: ' + JSON.stringify(hostnames)); }); });
Chạy main.js để xem kết quả::
$ node main.js
Kiểm tra kết quả:
Dia chi: 173.194.46.83Phuong thuc REVERSE cho dia chi 173.194.46.83 thanh mang cac hostname: ["ord08s11-in-f19.1e100.net"]
5. Domain Module trong Node.js
domain Module trong Node.js được sử dụng để can thiệp các lỗi chưa được xử lý. Các lỗi này có thể được can thiệp bằng cách sử dụng Internal Binding hoặc External Binding.
Internal Binding - Error Emmitter đang thực thi phần code của nó bên trong phương thức run của một Domain.
External Binding - Error Emmitter được thêm vào một Domain bởi sử dụng phương thức add.
Để sử dụng domain Module trong Node.js, bạn cần import theo cú pháp sau.
var domain = require("domain")
Lớp Domain của domain Module được sử dụng để cung cấp tính năng định tuyến các Error và Exception tới một đối tượng Domain. Lớp này là lớp con của lớp EventEmitter. Lớp Domain này xử lý các lỗi mà nó bắt được và lắng nghe sự kiện error của nó. Đối tượng này có thể được tạo bởi cú pháp:
var domain = require("domain"); var child = domain.create();
Phương thức của domain Module trong Node.js
- domain.run(function)
Chạy hàm function trong ngữ cảnh của domain, bind tất cả các Event Emitter, Timer, và các Request tầm thấp mà đã được tạo trong ngữ cảnh đó. Đây là cách cơ bản nhất để sử dụng một domain. - domain.add(emitter)
Thêm Emitter tới domain. Nếu có bất kỳ Event Handler nào được gọi bởi Emitter mà ném một Error, thì nó sẽ được định tuyến tới sự kiện error của domain. - domain.remove(emitter)
Trái ngược với phương thức domain.add(emitter). Xóa Emitter nào đó khỏi domain. - domain.exit()
Thoát khỏi domain hiện tại
Thuộc tính của domain Module trong Node.js
domain.members: Một mảng các Timer và Event Emitter đã được thêm tới domain.
Ví dụ
Ví dụ sau minh họa một số phương thức của domain Module trong Node.js. Bạn tạo main.js có nội dung sau:
var EventEmitter = require("events").EventEmitter;
var domain = require("domain");
var emitter1 = new EventEmitter(); // Tao mot domain boi su dung phuong thuc create()
var domain1 = domain.create();
domain1.on('error', function(err)
{ console.log("domain1 se xu ly loi: ("+err.message+")"); });
// Them mot Emitter toi domain boi phuong thuc add()
domain1.add(emitter1);
emitter1.on('error',function(err)
{ console.log("listener se xu ly loi: ("+err.message+")"); });
emitter1.emit('error',new Error('Duoc xu ly boi listener'));
emitter1.removeAllListeners('error');
emitter1.emit('error',new Error('Duoc xu ly boi domain1'));
var domain2 = domain.create(); domain2.on('error', function(err)
{ console.log("domain2 se xu ly loi: ("+err.message+")"); });
// Them mot Emitter toi domain boi phuong thuc run()
domain2.run(function()
{ var emitter2 = new EventEmitter();
emitter2.emit('error',new Error('Duoc xu ly boi domain2')); });
domain1.remove(emitter1);
emitter1.emit('error', new Error('Da chuyen doi thanh Exception. He thong bi pha vo!'));
Chạy main.js để xem kết quả::
$ node main.js
Kiểm tra kết quả:
listener se xu ly loi: (Duoc xu ly boi listener)domain1 se xu ly loi: (Duoc xu ly boi domain1)domain2 se xu ly loi: (Duoc xu ly boi domain2)events.js:72 throw er; // Unhandled 'error' event ^Error: Da chuyen doi thanh Exception. He thong bi pha vo! at Object. (/web/com/1427722220_30772/main.js:40:24) at Module._compile (module.js:456:26) at Object.Module._extensions..js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Function.Module.runMain (module.js:497:10) at startup (node.js:119:16) at node.js:906:3
Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!
- Bài 1: Node.js - Giới Thiệu
- Bài 2: Nodejs - Khởi tạo server
- Bài 3: NodeJS - REPL Terminal
- Bài 4: NodeJS - NPM
- Bài 5: NodeJS - Khái niệm callbacks
- Bài 6: Nodejs - Sự kiện lặp
- Bài 7: NodeJS - Sự kiện Emitter
- Bài 8: NodeJs - Buffer
- Bài 9: NodeJS - Streams
- Bài 10: NodeJS - Đọc ghi File
- Bài 11: NodeJS - Biến toàn cục
- Bài 12: NodeJS - Utility Module
- Bài 13: NodeJS - Web Module
- Bài 14: NodeJS - Express Framework
- Bài 15: NodeJS - RESTful API
- Bài 16: NodeJS - Request
- Bài 17: NodeJS - Response
- Bài 18: NodeJS - Scaling Ứng dụng
- Bài 19: NodeJS - Package