Giáo trình Phát triển mã nguồn mở với NodeJS giúp cung cấp cho người học những kiến thức cơ bản về lập trình NodeJS cũng như kỹ năng lập trình cơ sở dữ liệu MySQL bằng ngôn ngữ NodeJS. Mời các bạn cùng tham khảo để biết thêm các nội dung chi tiết.
Trang 1ỦY BAN NHÂN DÂN TỈNH LÂM ĐỒNG TRƯỜNG CAO ĐẲNG NGHỀ ĐÀ LẠT
GIÁO TRÌNH MÔN HỌC/ MÔ ĐUN: PHÁT TRIỂN MÃ NGUỒN MỞ VỚI
NODEJS NGÀNH/ NGHỀ: THIẾT KẾ TRANG WEB
TRÌNH ĐỘ: CAO ĐẲNG
Ban hành kèm theo Quyết định số: 1157/QĐ-CĐNĐL ngày 11 tháng 12 năm
2019 của Hiệu trưởng Trường Cao đẳng Nghề Đà Lạt
(LƯU HÀNH NỘI BỘ)
Lâm Đồng, năm 2019
Trang 3Phạm Đình Nam – Trường Cao đẳng nghề Đà Lạt Trang 1
Trang 4LỜI GIỚI THIỆU
Vài nét về xuất xứ giáo trình:
Giáo trình này được viết theo căn cứ Thông tư số 03/2017/TT-BLĐTBXH ngày
01 tháng 03 năm 2017 của Bộ Lao động – Thương binh và Xã hội về việc Quy định về quy trình xây dựng, thẩm định và ban hành chương trình; tổ chức biên soạn, lựa chọn, thẩm định giáo trình đào tạo trình độ trung cấp, trình độ cao đẳng
Quá trình biên soạn:
Giáo trình này được biên soạn có sự tham gia tích cực của các giáo viên có kinh nghiệm, cùng với những ý kiến đóng góp quý báu của các chuyên gia về lĩnh vực công nghệ thông tin
Mối quan hệ của tài liệu với chương trình, mô đun/môn học:
Căn cứ vào chương trình đào tạo nghề Thiết kế trang web, giáo trình giúp cung cấp cho người học những kiến thức cơ bản về lập trình NodeJS cũng như kỹ năng lập trình cơ sở dữ liệu MySQL bằng ngôn ngữ NodeJS
Để học được mô đun này người học cần có kiến thức cơ bản về HTML và cơ sở
dữ liệu
Cấu trúc chung của giáo trình này bao gồm 4 bài:
Bài 1 Tổng quan về nodejs
Bài 2 Các Module trong NodeJS
Bài 3 Làm việc với MySQL Database Server trong NodeJS
Bài 4 Socket
Lời cảm ơn
Giáo trình được biên soạn trên cơ sở các văn bản quy định của Nhà nước và tham khảo nhiều tài liệu liên quan có giá trị Song chắc hẳn quá trình biên soạn không tránh khỏi những thiếu sót nhất định Ban biên soạn mong muốn và thực sự cảm ơn những ý kiến nhận xét, đánh giá của các chuyên gia, các thầy cô đóng góp cho việc chỉnh sửa
để giáo trình ngày một hoàn thiện hơn
Lâm Đồng, ngày 10 tháng 12 năm 2019
Tham gia biên soạn
1 Phạm Đình Nam
2 Ngô Thiên Hoàng
3 Nguyễn Quỳnh Nguyên
4 Phan Ngọc Bảo
Trang 5Phạm Đình Nam – Trường Cao đẳng nghề Đà Lạt Trang 3
MỤC LỤC
BÀI 1 TỔNG QUAN VỀ NODEJS 6
1 Giới thiệu về NodeJS 6
2 Thiết lập môi trường 6
3 Module trong Node.js 7
4 Tìm hiểu về NPM 8
Bài 2 Các Module trong NodeJS 11
1 Module HTTP 11
1.1 Xây dựng máy chủ HTTP cơ bản 11
1.2 Phân tích máy chủ HTTP 11
1.3 Truyền hàm cho máy chủ hoạt động 12
1.4 Phương thức writeHead 12
1.5 Phương thức write 12
1.6 Phương thức end 13
2 Làm việc với file trong Node.js 13
2.1 Đọc nội dung file 13
2.2 Ghi nội dung vào file 15
2.3 Xóa file 16
3 Module URL 17
3.1 Giới thiệu 17
3.2 Phân tích URL 18
4 Module Path 19
5 Event Emitter 24
5.1 Lập trình hướng sự kiện 24
5.2 EventEmitter 24
5.3 Xóa sự kiện 25
6 Đối tượng Global và Process 25
6.1 Đối tượng Global trong Node.js 25
6.2 Đối tượng Process trong Node.js 26
7 Express Framework 26
7.1 Giới thiệu Express 26
7.2 Cài đặt và sử dụng Express 27
7.3 Router trong Express Framework 28
7.3.1 Router là gì? 28
7.3.2 Sử dụng Router 28
Trang 67.3.3 Tham số router 29
7.4 Template Engine trong Express 30
7.4.1 Template Engine là gì ? 30
7.4.2 Danh sách các loại template engine 30
7.4.3 Ưu điểm khi sử dụng Template Engine 30
7.4.4 Sử dụng Template Engine trong Express 30
7.4.5 Kết hợp EJS template với Express 31
7.5 Middleware Express 32
7.5.1 Middleware trong ứng dụng web 32
7.5.2 Middleware trong Express 32
7.5.3 Cấu trúc middleware trong express 33
7.5.4 Sử dụng middleware trong express 34
7.5.5 Truy cập file tĩnh trong express 38
7.5.6 Làm việc với Form trong express 41
8 Sử dụng cookies 44
8.1 Cài đặt cookie-parser 44
8.2 Sử dụng cookie-parser 44
8.3 Đặt thời gian sống cho cookie 45
8.4 Xóa cookie hiện tại 46
9 Sử dụng session 46
9.1 Định nghĩa về Session 46
9.2 Lý do session ra đời 46
9.3 Phân biệt session của các trình duyệt khác nhau 46
9.4 Sử dụng session trong node.js 47
Bài 3 Làm việc với MySQL Database Server trong NodeJS 48
1 Kết nối với MySQL Database Server 48
1.1 Cài đặt package mysql cho Node.js 48
1.2 Kết nối với MySQL Database Server bằng Node.js 48
1.3 Đóng kết nối cơ sở dữ liệu 49
2 Tạo bảng trong MySQL bằng Node.js 49
3 Thêm dữ liệu vào bảng từ Node.js 51
4 Truy vấn dữ liệu trong CSDL MySQL từ Node.js 53
4.1 Thực thi câu truy vấn đơn giản 53
4.2 Chuyển dữ liệu vào câu truy vấn 54
5 Cập nhật dữ liệu trong cơ sở dữ liệu MySQL bằng Node.js 54
Trang 7Phạm Đình Nam – Trường Cao đẳng nghề Đà Lạt Trang 5
6 Xóa dữ liệu trong MySQL từ Node.js 55
Bài 4 Socket 57
1 Tổng quan về Socket.io 57
2 Cài đặt Socket.IO 57
3 Xử lý sự kiện trong Socket.IO 60
3.1 Tổng quan module Events trong Node.js 60
3.2 Sử dụng module Events 61
3.3 Viết một module khác kế thừa module Events 63
3.4 Phân biệt events với socket.io 65
4 Socket.IO Broadcasting 65
5 Socket.IO Namspace 68
Trang 8BÀI 1 TỔNG QUAN VỀ NODEJS
1 Giới thiệu về NodeJS
Mặc dù Nodejs mới ra đời năm 2009 nhưng được rất nhiều chuyên gia lập trình
quan tâm và được sử dụng rộng rãi trong tất cả các lĩnh vực, chạy trên hầu hết các hệ điều hành Đây là một nền tảng của Server và được xây dựng dựa trên Javascript Engine
Nếu bạn thực sự đam mê với lập trình web thì bạn nên học Nodejs, vì nó sẽ là một trong những ngôn ngữ chiếm ưu thế trong tương lai Hiện tại xu hướng năm 2017
đang là học lập trình Nodejs, hi vọng bộ giáo trình video bài học lập trình Nodejs
cơ bản dưới đây sẽ giúp ích các bạn rất nhiều trong con đường trở thành lập trình viên
2 Thiết lập môi trường
Các đoạn code node.js thực chất là các đoạn mã Javascript Node.js sẽ được sử dung để thông dịch và thực thi các đoạn code Javascript
Node.js phân phối dưới dạng các bản cài đặt cho các hệ điều hành Linux, Mac
OS X và Windown với các phiên bản 32 bit và 64 bit
Để cài đặt Node.js các bạn có thể truy cập vào kho lưu trữ của Node.js và tải xuống bản cài đặt phù hợp với hệ điều hành mình đang sử dụng
Cài đặt trên Windows
Tải tệp cài đặt với định dạng msi trên trang chủ download của Node.js
Chạy tệp cài đăt với định dạng msi mà bạn đã tiến hành tải xuống trước đó
Làm theo hướng dẫn trong trình cài đặt
Khởi động lại máy tính: Bạn sẽ không thể nào chạy được Node.js nếu không khởi động lại máy tính sau khi cài đặt
Cài đặt trên MacOs
Tải tệp cài đặt với định dạng pkg trên trang chủ Node.Js
Mở tệp cài đặt với định dạng pkg mà bạn vừa tải xuống
Làm theo các bước của hướng dẫn của bộ cài đặt
Cài đặt trên Linux
Với các máy chạy hệ điều hành Linux các bạn có thể cài đặt bằng cách tải xuống
và giải nén các tệp lưu trữ tar.gz , sau đó chuyển các tệp được giải nén vào thư mục /usr/local/nodejs
Tải tệp lưu trữ tar.gz
Tạo thư mục /usr/local/nodejs
Để tạo thư mục các bạn chạy command với lệnh sausudo mkdir -p /usr/local/nodejs giải nén tệp tar.gz mà bạn vừa tải về để giải nén các bạn đi vào thư mục dowload Node.js trước đó và chạy command với lệnhtar xvfz filename.tar.gzVí
dụ ở đây tôi đang tải về phiên bản 10.13.0 với tên file là node-v10.13.0.tar.gz
Di chuyển file tất cả các file vừa giải nén vào thư mục /usr/local/nodejs
Trang 9Phạm Đình Nam – Trường Cao đẳng nghề Đà Lạt Trang 7
Các bạn dùng command với lệnh sau để di chuyển file
sudo mv node-v10.10.0/* /usr/local/nodejs
Sau khi các chạy xong lệnh để kiểm tra xem đã chuyển thành công nodejs vào /usr/local/nodejs hay chưa các bạn chạy thêm các lệnh sau
cd /usr/local/nodejs
ls
Nếu như hiện thị danh dách file như thế này tức là các bạn đã di chuyển thành công
Thêm biến môi trường node vào PATH
Để thêm biến môi trường node vào PATH các bạn chạy command với lệnh sauexport PATH=$PATH:/usr/local/nodejs/bin
Kiểm tra Node.js
Sau khi cài đặt xong để chắc chắn là Node.js đã được cài đặt trên máy của bạn Các bạn chạy lệnh command sau để kiểm tra
node -v
3 Module trong Node.js
Khi các bạn viết một ứng dụng Node.js bạn có thể đặt tất cả code của bạn vào một tệp nào đó, cho dù ứng dụng của bạn có lớn hay phức tạp đến như thế nào Trình thông dịch nodejs sẽ không quan tâm đến vấn đề đấy
Nhưng về mặt tổ chức code bạn sẽ rất khó khăn để có thể quản lý các đoạn code của mình Vì vậy, như một thói quen các bạn nên quan tâm nhiều hơn về cấu trúc code của mình Đây là lý do mà module được đưa vào Node.js
Bạn có thể nghĩ đơn giản về các module Node.js như các thư viện Javascript hay một phần nào đó trong code của bạn (ví dụ tập hợp các hàm) mà bạn muốn giữ lại để
có thể tái sử dụng nó sau này
Ở Node.js các bạn sẽ gặp 3 loại Module
Module tích hợp : là loại module được Node.js tích hợp sẵn cho các bạn khi cài Node.js Các bạn có thể xem danh sách module được tích hợp sẵn
Module bên ngoài: các module này được chia sẻ từ các lập trình viên khác nhau trên thế giới thông qua một kho quản lý ở bên ngoài Cụ thể ở đây là NPM
Module tạo riêng của các bạn: Các module tích hợp và module bên ngoài được cung cấp bởi những người khác, nhưng bạn có thể tạo ra các module Node.js của riêng bạn
Tạo module của bạn
Ví dụ sau sẽ hướng dẫn các bạn tự tao ra một module myRandom cung cấp một hàm trợ giúp trả về số ngẫu nhiên từ 1 đến 10
Trước tiên các bạn tạo một tệp Javascript mới Ở đây tôi sẽ tạo một tệp với
tên myRandom.js
Ở trong tệp myRandom.js các bạn viết nội dung sau
Trang 10function getRandom(min, max) {
return Mapath.random() * (max - min) + min;
Tiếp theo các bạn tạo thêm tệp mới để có thể nhận chức năng đã được exports ra bên trong myRandom.js
Các bạn tạo tệp index.js và thêm nội dung sau vào
var myRandom = require('./myRandom');
Vậy thì làm thế nào chúng ta có thể biết được các module được chia sẻ ở đâu, và
sử dụng module đó như thế nào Trong phần này chúng ta sẽ tìm hiểu cách sử dụng NPM để quản lý các module bên ngoài
NPM là gì?
NPM là từ viết tắt của cụm từ (Node Package Manager)
NPM cung cấp cho chúng ta 2 chức năng sau:
o Kho lưu trữ module trực tuyến cho Node.js
o Tiện ích dòng lệnh (command) để cài đặt các module, package Node.js quản lý phiên bản và sự phụ thuộc của các package node.js
Trang 11Phạm Đình Nam – Trường Cao đẳng nghề Đà Lạt Trang 9
Cài đặt và cấu hình NPM
Cài đặt NPM
Mặc định NPM sẽ đi kèm với trình cài đặt Node.js vì thế các bạn sẽ không cần phải cài đặt NPM
Sau khi cài đặt NPM và Node.js các bạn có thể kiểm tra và cập nhật NPM lên
phiên bản mới bằng command:
npm install npm@lastest -g
Cấu hình package
Các cấu hình package của Node.js được chứa trong một tệp có tên package.json
mà bạn có thể tìm thấy thư mục gốc của các dự án hoặc các module
Bạn có thể tạo tệp thiết lập mới bằng các chạy command
npm init
Bạn sẽ phải điiền vào một số thông tin ví dụ như:
package name: Tên gói của bạn (npm sẽ lấy mặc định là tên thư mục của bạn)
version: phiên bản của gói (mặc định 1.0.0)
description: Mô tả về gói của bạn
npm install <package name>
Ví dụ: Tôi muốn cài đặt một package mang tên express (đây là web framework basic của Node.js)
– Để cài đặt các bạn đi vào thư mục gốc của project Sau đó mở command với npm chúng ta sẽ chủ yếu thao tác với Command line nhé
Sau khi cài đặt xong các bạn sẽ thấy project của các bạn xuất hiện thêm một thư
1 với tên "node_modules" Đây là thư mục chứa các module được cài đặt từ npm
Trang 12Đồng thời ở file package.json sẽ thêm vào dependencies tên thư viện mà các bạn vừa cài
Ngoài các bạn có thể cài các package với nhiều tùy chọn khác nhau
npm install -g <package name> //Cài toàn cục
npm install save-dev <packeage name> //cài đặt chỉ phục vụ cho việc
npm uninstall <package name>
Ví dụ tôi muốn xóa bỏ package express vừa cài ở trên
Sau khi gỡ xong thì file package.json cũng thay đổi theo
Update package
Khi muốn nâng cấp một gói nào đó các bạn có thể sử dụng command lệnh sau npm update <package name>
Trang 13Phạm Đình Nam – Trường Cao đẳng nghề Đà Lạt Trang 11
Bài 2 Các Module trong NodeJS
1 Module HTTP
Với Node.js để có thể tạo ra web application chúng ta không phải chỉ có việc triển khai ứng dụng của mình là được, mà chúng ta phải triển khai toàn bộ máy chủ HTTP
Vì vậy Module HTTP cho phép chúng ta có thể tạo ra các máy chủ HTTP trong ứng dụng của mình
1.1 Xây dựng máy chủ HTTP cơ bản
Trước tiên để bắt đầu tìm hiểu về module HTTP hoạt động như thế nào thì chúng
ta cùng chạy 1 ví dụ đơn giản
Ở đây tôi có 1 đoạn code đơn giản dùng để tạo server cơ bản ở trong Node.js
var http = require('http');
var server = http.createServer(function(request, response) {
response.writeHead(200, {"Content-Type": "text/plain; charset=UTF-8"});
response.write("Chào mừng bạn đến với Học viện công nghệ VietPro");
1.2 Phân tích máy chủ HTTP
Ở dòng đầu tiên của đoạn code trên, tôi yêu cầu module HTTP của Node.js và làm cho nó có thể truy cập được thông qua biến http
Trang 14Sau đó tôi gọi một trong những chức năng mà module này cung cấp: createServer Hàm này trả về một đối tượng, đối tượng này có 1 phương thức là listen, và nhận vào tham số là cổng mà máy chủ HTTP sẽ lắng nghe
tham số thứ nhất: request chứa những thông tin của người dùng gửi lên
tham số thứ hai: response chứa những thông tin mà chúng ta muốn trả về để đáp
ứng yêu cầu của request đó
var http = require('http');
var server = http.createServer(function(request, response) {
});
server.listen(8000);
1.3 Truyền hàm cho máy chủ hoạt động
Bên trong hàm ẩn danh sẽ có 2 tham số là resquest (đại diện cho các thông tin của người dùng gửi lên) còn response (đại diện cho thông tin server trả về)
Nhìn vào ví dụ đầu tiên các bạn sẽ thấy response tôi có sử dụng 2 phương 3 phương thức đó là writeHead, write, end
statusCode : Mã trạng thái phản hồi, mã trạng thái tham khảo <Number>
statusMessage: Lời nhắn của trạng thái <String>
headers: là các tiêu đề phản hồi của máy chủ, các bạn có thể tìm hiểu thêm về HTTP header tại đây <Object>
1.5 Phương thức write
Phương thức này thiết lập nội dung mà server muốn trả về cho trình duyệt, nội dụng này có thể là text đơn thuần hoặc code HTML
Trang 15Phạm Đình Nam – Trường Cao đẳng nghề Đà Lạt Trang 13
Cú pháp:
response.write(content, encoding);
Trong đó:
content: Nội dung muốn trả về trình duyệt
encoding: Loại mã hóa ký tự Mặc định UTF-8
Ví dụ: trả về trình duyệt nội dung “Chào mừng các bạn đến với Node.js của học
viện công nghệ VietPro” và được bao trong thẻ <b>
resonse.write("<b>Chào mừng các bạn đến với Node.js của học
viện công nghệ VietPro</b>")
1.6 Phương thức end
Phương thức này thông báo tất cả phản hồi đã được gửi và phương thức này phải được gọi trên mỗi response
2 Làm việc với file trong Node.js
Node.js cung cấp module fs để có thể truy cập hệ thống file Module fs chịu trách nhiệm cho tất cả các hoạt động I/O (Input / Output) đồng bộ hoặc không đồng bộ
Với module fs tôi sẽ yêu cầu nó và sẽ gán vào biến fs để có thể truy cập module này nhé
pathfile: Đường dẫn đầy đủ và tên của file dưới dạng chuỗi
options: Tham số tùy chọn có thể là đối tượng hoặc chuối bào gồm mã hóa và cờ
hiệu Mã hóa mặc định là utf8 và cờ mặc định là “r”
callback: Hàm gọi lại khi thao tác đọc file hoàn thành, hàm có 2 tham số là error
và data
Ví dụ: Có một file mẫu demo.txt với nội dung "Chào bạn đến với học viện công
nghệ VietPro" bây giờ tôi sẽ dùng phương thức đọc file không đồng bộ của module fs để đọc nội dụng file này
File demo.txt
Trang 16Chào bạn đến với học viện công nghệ VietPro
fs.readFile("demo.txt", function(error, data) {
if (error) throw error;
Mặc định data sẽ có kiểu dữ liệu là Buffer vì thế tôi đã dùng toString() để chuyển
nó về kiểu String thông thường
Đọc file đồng bộ
Sử dụng phương thức fs.readFileSync() để đọc file đồng bộ
Khác với đọc file không đồng bộ là kết quả trả về sẽ được xử lý trong hàm callback còn với đọc file đồng bộ thì kết quả sẽ được trả về trực tiếp sau khi mà chương trình đọc xong
Cú pháp
fs.readFileSync(pathfile, options);
Mô tả tham số:
pathfile: Đường dẫn đầy đủ và tên của file dưới dạng chuỗi
options: Tham số tùy chọn có thể là đối tượng hoặc chuối bào gồm mã hóa và cờ
hiệu Mã hóa mặc định là utf8 và cờ mặc định là “r”
Ví dụ: Tương tự với ví dụ ở đọc file không đồng bộ thì tôi sẽ thực hiện bằng cú
pháp của đọc file đồng bộ
Chỉnh nội dung file index.js thành
var fs = require('fs'); //Gọi module fs
Trang 17Phạm Đình Nam – Trường Cao đẳng nghề Đà Lạt Trang 15
2.2 Ghi nội dung vào file
Ghi file không đồng bộ
Sử dụng fs.writeFile() để ghi file không đồng bộ
Cú pháp:
1 fs.writeFile(pathfile, content[,options], callback);
Mô tả tham số:
pathfile: Đường dẫn tuyệt đối của file, hoặc tên file
content: Nội dung muốn ghi vào file
options: Tham số tùy chọn có thể là đối tượng hoặc chuối bào gồm mã hóa và cờ hiệu Mã hóa mặc định là utf8 và cờ mặc định là “r”
callback: Hàm gọi lại khi thao tác ghi nội dung vào file hoàn thành
Ví dụ: Ghi vào file writeDemo.txt với nội dung "Học lập trình node.js tại học
viện công nghệ VietPro"
Tạo file mới với tên writeFile.js và đưa nội dung bên dưới vào
var fs = require('fs'); //Gọi module fs
Trang 18if (error) throw error;
console.log("Nội dung đã được ghi thành công")
pathfile: Đường dẫn tuyệt đối của file, hoặc tên file
content: Nội dung muốn ghi vào file
options: Tham số tùy chọn có thể là đối tượng hoặc chuối bào gồm mã hóa và cờ hiệu Mã hóa mặc định là utf8 và cờ mặc định là “r”
Ví dụ: Tượng tự với vị dụ phần ghi file không đồng bộ thay thế cú pháp ghi file
không đồng bộ bằng cú pháp ghi file đồng bộ
var fs = require('fs'); //Gọi module fs
/**
* Thực hiện viết nội dung vào file demo.txt
* */
var error = fs.writeFileSync("writeDemo.txt", "Học lập trình Node.js
tại học viện công nghệ VietPro");
if (error) return;
console.log("Nội dung đã được ghi thành công");
Chạy lại command với lệnh
Trang 19Phạm Đình Nam – Trường Cao đẳng nghề Đà Lạt Trang 17
Sử dụng fs.unlink() để xóa file không đồng bộ
Cú pháp:
fs.unlink(pathfile, callback);
Mô tả tham số
pathfile: đường dẫn tuyệt đối file hoặc tên file muốn xóa
callback: Hàm gọi lại khi thao tác xóa file hoàn thành
Ví dụ: Xóa file demo.txt ở ví dụ phần đọc file Tạo file removeFile.js và đưa nội
dung phía dưới vào
var fs = require('fs');
fs.unlink('demo.txt', function(error) {
if (error) throw error;
console.log("File đã được xóa thành công");
Trang 20Module URL là một trong các module đi kèm với Node.js sử dụng để phân tích URL và các thuộc tính khác của URL
Bằng cách sử dụng module URL nó cung cấp cho chúng ta rất nhiều thuộc tính
để làm việc với đường dẫn
.href Cung cấp một đường dẫn URL hoàn chỉnh
.host Cung cấp tên máy chủ lưu trữ và cổng
.hostname Tên của máy chủ
.pathname Cung cấp tên máy chủ , cổng và tên đường dẫn
.protocol Giao thức được sử dụng cho việc gửi yêu cầu
.search Trả về chuỗ truy vấn được đính kèm với URL
Trang 21Phạm Đình Nam – Trường Cao đẳng nghề Đà Lạt Trang 19
var queryString = url.parse(urlQuery);
console.log("Đây là href:" + queryString.href);
console.log("Đây là path:" + queryString.path);
console.log("Đây là pathname:" + queryString.pathname);
console.log("Đây là port:" + queryString.port);
console.log("Đây là protocol:" + queryString.protocol);
console.log("Đây là host:" + queryString.host);
console.log("Đây là hostname:" + queryString.hostname);
console.log("Đây là query:" + queryString.query);
console.log("Đây là auth:" + queryString.auth);
console.log("Đây là search:" + queryString.search);
Chạy node với lệnh
var path = require('path')
Module path.sep cung tự động phân tách đường dẫn (\ trên Windows và / trên Linux/MacOs) và path.delimiter cung cấp dấu phân tách đường dẫn (; trên Windows
Trang 22Ví dụ Lấy phần cuối cùng của đường dẫn /path1/somthing.js
Tạo file: index.js
/**
* Ví dụ với path.basename()
* Lấy phần cuối cùng của đường dẫn /path1/something.js
*/
var path = require('path')
var pathString = "/path1/something.js";
var result = path.basename(pathString);
var filterExt = path.basename(pathString, '.js');
Trang 23Phạm Đình Nam – Trường Cao đẳng nghề Đà Lạt Trang 21
tạo file index.js
/**
* Ví dụ với path.dirname()
* Lấy thư mục của đường dẫn /path1/something.js
*/
var path = require('path')
var pathString = "/path1/something.js";
var result = path.dirname(pathString);
path : đường dẫn file muốn kiểm tra
Ví dụ: Kiểm tra phần mở rộng của tệp tin "path/something.js"
Tạo file index.js
/**
* Ví dụ với path.extname()
* Lấy định dạng của file/path /path1/something.js
*/
var path = require('path')
var pathString = "/path1/something.js";
var result = path.extname(pathString);
console.log(result);
Chạy command với lệnh
node index
Kết quả bạn sẽ nhận được là :
Trang 24.js
path.isAbsolute()
Kiểm tra xem đường dẫn có phải là đường dẫn tuyệt đối hay không Kết quả trả
về thuộc kiểu boolean
Cú pháp
path.extname(path)
Mô tả tham số
path : đường dẫn file muốn kiểm tra
Ví dụ: Kiểm tra xem 2 đường dẫn dưới đây có phải là đường dẫn tuyệt đối hay
var path = require('path')
var pathString1 = "/path1/something.js";
var pathString2 = "./path1/something.js";
var result1 = path.isAbsolute(pathString1);
var result2 = path.isAbsolute(pathString2);
Trang 25Phạm Đình Nam – Trường Cao đẳng nghề Đà Lạt Trang 23
Tạo ra đường dẫn từ các tham số
/**
* Ví dụ với path.join()
* Tạo ra đường dẫn từ các tham số
*/
var path = require('path')
var result = path.join('path1', 'path2', 'path3', 'file.txt');
console.log(result);
Kết quả:
Trên Linux/MacOS: path1/path2/path3/file.txt
Trên Window: path1\path2\path3\file.txt
pathname: đường dẫn muốn phân tích
Ví dụ: Phân tích đường dẫn: "/folder/file.txt"
Tạo file index.js
/**
* Ví dụ với path.parse()
* Phân tích đường dẫn "/folder/file.txt"
*/
var path = require('path')
var result = path.parse('/folder/file.txt');
console.log(result);
Chạy command với lệnh
node index
Bạn sẽ nhận được kết quả
Trang 26Một Event Handler là một callback function sẽ được gọi khi một sự kiện được kích hoạt
Một vòng lặp chính lắng nghe các trình kích hoạt sự kiện và gọi trình xử lý sự kiện được liên kết cho sự kiện đó
5.2 EventEmitter
Node.js cung cấp cho chúng ta một module hữu ích được gọi là EventEmitter cho phép chúng ta có thể bắt đầu kết hợp lập trình hướng sự kiện trong các dự án của mình
Chúng ta có thể truy cập lớp EventEmitter thông qua module events được cung cấp sẵn trong Node.js
Khi được yêu cầu module, chúng ta sẽ cần phải tạo một đối tượng mới từ class để
có thể sử dụng nó
Khởi tạo lắng nghe sự kiện
Cú pháp
var events = require('events');
var eventEmitter = new events.EventEmitter;
Cú pháp tích hợp một eventHandler với một event
eventEmitter.on('eventName', eventHandler)
Cú pháp để kích hoạt sự kiện
eventEmitter.emit('eventName')
Trang 27Phạm Đình Nam – Trường Cao đẳng nghề Đà Lạt Trang 25
Ví dụ:
Tạo file index.js với nội dung sau
// Import và Khởi tạo đối tượng event
var events = require('events');
var eventEmitter = new events.EventEmitter;
6 Đối tượng Global và Process
6.1 Đối tượng Global trong Node.js
Để tìm hiểu về đối tượng toàn cục global trong chúng ta cùng đi xét một ví dụ sau
Các bạn hãy hình dung chúng ta có 2 file index.js là file chạy chính của ứng dụng và hello.js là module đơn giản mà chúng ta tự viết ra
Và module hello.js sẽ có nội dung như sau
module.exports = function(name){
return config.loichao + " " +name;
}
Trang 28Đoạn mã trên chỉ đơn giản là nhận vào một cái tên nào đó và trả về một lời chào Tiếp theo, tiến hành gọi module hello.js vào trong index.js
index.js sẽ có nội dung như sau
var hello = require('./hello');
console.log(hello("VietPro"));
Lúc này hello.js sẽ đọc loichao trong đối tượng config vì thế chúng ta phải chỉnh lại index.js như sau
var hello = require('./hello');
var config = {loichao: "Xin chào"};
console.log(hello("VietPro"));
Tiếp theo các bạn chạy index.js với lệnh
node index
bạn sẽ nhận được kết quả lỗi
Điều này là do mỗi module trong Node.js mặc định sẽ có phạm vi riêng của
nó Để cho một biến nào đó thuộc phạm vi toàn cầu bạn phải sử dụng đối tượng global Bây giờ thay đổi index.js bằng cách sử dụng global
Chình index.js thành
var hello = require('./hello');
global.config = {loichao: "Xin chào"}
console.log(hello("VietPro"));
Cuối cùng bạn chạy lại file index.js
6.2 Đối tượng Process trong Node.js
Đối tượng process là một đối tượng toàn cục và có thể được truy tập từ bất cứ đâu
7 Express Framework
7.1 Giới thiệu Express
Express là một framework web Node.js phổ biến nhất và là thư viện cơ bản cho một số framework Node.js phổ biến khác Express cung cấp các cơ chế
Viết trình xử lý cho các yêu cầu (request) với các phương thức HTTP khác nhau tại các đường dẫn URL khác nhau (router)
Tích hợp công cụ hiện thị “view” để tạo các phản hồi bằng cách chèn dữ liệu vào các view
Trang 29Phạm Đình Nam – Trường Cao đẳng nghề Đà Lạt Trang 27
Thêm các yêu cầu xử lý trung gian “middleware” tại bất kỳ điểm nào luồng xử lý yêu cầu
7.2 Cài đặt và sử dụng Express
Express được cài đặt thông qua trình quản lý package của Node Để cài đặt express chạy command với lệnh sau
npm install express
Câu lệnh trên sẽ yêu cầu trình quản lý package tải xuống module được yêu cầu
Để sử dụng express chúng ta cùng đi qua một ví dụ sau Chúng ta sẽ tạo ra một ứng dụng đơn giản, đó là một server sẽ nghe trên cổng 3000
Tạo file server.js
var express = require('express'); //1
var app = express(); // 2
app.get('/', function(request, response){ // 3
response.send("Học viện công nghệ VietPro, Xin chào các bạn"); //4
});
app.listen(3000) //5
Tôi sẽ giải thích qua cho các bạn về đoạn code ở trên
Trong dòng code đầu tiên, chúng tôi sử dụng hàm require để import module vào
Ở dòng code số 2 , trước khi bắt đầu sử dụng express chúng tôi phải tạo một đối tượng thể hiện module express
Ở dòng code số 3, Từ đối tượng thể hiện của module express chúng tôi sử dụng một hàm callback Hàm này sẽ được gọi thi có một người nào đó truy cập vào đường dẫn http://localhost:3000 Hàm gọi lại sẽ dùng để phản hồi các nội dung cho máy khách
Ở dòng code số 4, Tham số response ở trong hàm callback được sử dụng để trả
về nội dung cho phía máy khách
Ở dòng code số 5, Cuối cùng chúng ta phương thức listen để lắng nghe các yêu cầu của máy khách trên cống 3000
Tiếp theo chúng ta tiến hành chạy server bằng command lệnh
node server
Khi lệnh được thực thi thành công Các bạn truy cập vào đường dẫn http://localhost:3000 ở trên trình duyệt
Trang 307.3 Router trong Express Framework
7.3.1 Router là gì?
Router là cách để máy chủ xác định và đáp ứng yêu cầu của máy khách Mỗi router có thể có một hoặc nhiều hàm điều khiển, được thực thi khi các yêu cầu trùng khớp
Ví dụ có một máy khách gửi yêu cầu bằng phương thức GET, POST, PUT hoặc DELETE cho các đường dẫn khác nhau, chẳng hạn như một URL được hiện thị bên dưới
path là một đường dẫn trên máy chủ
callback_handler là hàm được thực thi khi router khớp với path
Ví dụ
Tạo ra 3 router để đáp ứng yêu cầu sau
1 router với path là /user sẽ hiện thị nội dung “Đây là trang thành viên“
1 router với path là /admin sẽ hiện thị nội dung “Đây là trang quản trị“
1 router với path là / sẽ hiện thị nội dung “Đây là trang chủ“
Tạo file server.js với nội dung
var express = require('express');
var app = express();
app.get('/', function(request, response){
response.send("Đây là trang chủ");
});
Trang 31Phạm Đình Nam – Trường Cao đẳng nghề Đà Lạt Trang 29
app.get('/user', function(request, response){
response.send("Đây là trang thành viên");
});
app.get('/admin', function(request, response){
response.send("Đây là trang quản trị");
Ở đoạn code trên các bạn có thể thấy tối dùng app.get để truyền xử lý yêu cầu của các router /, /admin, /user thì get ở đây chính là phương thức dùng để xử lý các yêu cầu HTTP GET Ngoài ra các bạn có thể dùng post, put, delete … hoặc các phương thức khác để xử lý các yêu cầu HTTP tương ứng
7.3.3 Tham số router
Tham số router là các phân đoạn URL được sử dụng để nắm bắt các giá trị được chỉ định tại vị trí của chúng trong URL Các giá trị sẽ được chuyển đổi trong đối tượng request.params , với tên của tham số router được chỉ định trong đường dẫn router
Cú pháp
app.METHOD('/:param1/:param2 /:paramN, callback_handler);
Ví dụ: Với đường dẫn users/Id trong đó Id là một tham số động của đường dẫn
Tạo file server.js với nội dung sau
var express = require('express');
var app = express();
app.get('/user/:Id', function(request, response){
Trang 32Lúc này bạn vào đường dẫn http://localhost:3000/user/15 để kiểm tra hoặc bạn
Hiện nay có rất nhiều template engine cho Node.js Mỗi template engine sử dụng các ngôn ngữ , cú pháp khác nhau để xác định các HTML templte và đưa dữ liệu vào
7.4.2 Danh sách các loại template engine
7.4.3 Ưu điểm khi sử dụng Template Engine
Cải thiện năng suất của các lập trình viên
Cải thiện khả năng đọc, bảo trì code
Hiêu suất nhanh hơn
Tối đa hóa cho xử lý phía khách hàng
Một template có thể dùng trong nhiều trang
7.4.4 Sử dụng Template Engine trong Express
Để hiện thị các tệp template engine chúng ta phải thiết lập trong ứng dụng của chúng ta 2 thành phần
Đường dẫn chứa tệp template
Khai báo loại template engine muốn sử dụng
Để thiết lập trong ứng dụng chúng ta sẽ có phương thức app.set() của đối tượng app
Cú pháp:
Thiết lập đường dẫn chứa tệp template:
app.set('views', folder)
Trang 33Phạm Đình Nam – Trường Cao đẳng nghề Đà Lạt Trang 31
Trong đó:
views là từ khóa được quy đinh để thiết lập đường dẫn chứa template
folder là một chuỗi dùng để cung cấp đường dẫn thư mục chứa file template
Mặc định là “./views”
Thiết lập loại tempalate engine
app.set('view engine', template_engine_name)
Trong đó
view engine là từ khóa quy định để thiết lập loại template engine muốn sử dụng template_engine_name tên loại template enigne sẽ sử dụng
7.4.5 Kết hợp EJS template với Express
Như đã liệt kê ở phần đầu, trong node.js có rất nhiều loại template engine có thể kết hợp, và một trong số đó là EJS
var express = require('express');
var app = express();
app.get('demoejs', function(request, response){
response.send('chào mừng các bạn đến với học viện công nghệ
Bây giờ chúng ta sẽ kết hợp EJS vào Express
Trước tiên các bạn tạo cho tôi một file với tên demo.ejs ở trong thư mục views với nội dung
<h1>Chào mừng bạn đến với học viện công nghệ VietPro</h1>
Trang 34Bây giờ bạn chỉnh lại file server.js như sau
var express = require('express');
var app = express();
app.set('views', './views'); //1
app.set('view engine', 'ejs'); //2
app.get('/', function(request, response){
response.render('demo'); //3
});
app.listen(3000)
Lúc này bạn sẽ thấy tôi có chỉnh và thêm vài dòng code
Dòng thứ 1, Đây là đoạn code dùng để thiết lập thư mục chứa template
Dòng thứ 2, Đây là đoạn code dùng để thiết lập loại template engine muốn sử dụng
Dòng thứ 3, Dòng code này sẽ dùng để biên dịch một file templte engine để chuyển thành mã HTML
Bây giờ các bạn tiến hành chạy thử ứng dụng lên bằng command lệnh
node server
và truy cập vào đường dẫn http://localhost:3000
Các bạn sẽ nhận được nội dung từ file template engine được biên dịch sang mã HTML
7.5 Middleware Express
Trong ngành công nghiệp phần mềm, middleware là một thuật ngữ dùng để mô
tả một lớp phần mềm nằm giữa các ứng dụng và hệ điều hành Nhằm cung cấp dịch vụ cho các ứng dụng phần mềm ngoài những ứng dụng có sẵn từ hệ điều hành…
7.5.1 Middleware trong ứng dụng web
Trong lập trình web middleware đóng vai trò trung gian giữa yêu cầu của người dùng và phản hồi của máy chủ (request và response)
Ở trong các freamwork của các ngôn ngữ lập trình middleware là các hàm dùng
để xử lý các request trước khi đưa vào xử lý logic của ứng dụng web
7.5.2 Middleware trong Express
Ở trong express middleware là các hàm thực thi trong suốt vòng đời của một yêu cầu (request) tới máy chủ Express Mỗi middleware đều có quyền truy cập vào request và response của mỗi router được gắn vào
Middleware trong express sẽ thực hiện 4 công việc sau
Thực hiện bất kỳ dòng code nào như một hàm thông thường
Trang 35Phạm Đình Nam – Trường Cao đẳng nghề Đà Lạt Trang 33
Thực hiện thay đổi đối với request và response
Kết thúc chu kỳ request-reponse
Gọi middleware tiếp theo
7.5.3 Cấu trúc middleware trong express
Một middleware trong express sẽ như thế nào?
Bên dưới là cấu trúc của một middleware ở trong express
function middlewareExample(request, response, next){
Ví dụ
Tôi sẽ ví dụ cho các bạn một middleware đơn giản sau đó chúng ta sẽ tìm hiểu các cách sử dụng middleware
File server.js
var express = require('express');
var app = express();
function myLogger(request, response, next){
console.log(`Có 1 client truy cập vào đường dẫn: ${request.url}` );
Hàm myLogger sẽ có chức năng là in ra đường dẫn mà client đang truy cập tới
Để sử dụng middleware tôi sử dụng app.use() của express và chỉ đinh các chức năng của middleware, cụ thể ở đây là chức năng myLogger
Bây giờ các bạn hãy chạy thử ví dụ trên bằng lệnh
Trang 36node server
sau đó thử truy cập đường dẫn:
http://localhost:3000/abc, http://localhost:3000/xyz, http://localhost:3000 và thử kiểm tra hoạt động của middleware
7.5.4 Sử dụng middleware trong express
Sử dụng middleware ở cấp ứng dụng
Khi bạn khởi tạo một ứng dụng Web với Express một đối tượng đại diện cho ứng dụng của chúng ta đó là app (tùi theo mỗi người mà tên đối tượng này có thể sẽ khác) Chúng ta có thể sử dụng đối tượng này để khai báo middleware thông qua các hàm app.use() hoặc app.METHOD METHOD ở đây chính là các phương thức của request
Ví dụ với middleware khi không có đường dẫn Với kiểu khai báo như thế này thì mỗi khi có yêu cầu tới middleware sẽ được thực thi
File server.js
var express = require('express');
var app = express();
app.use(function(request, response, next){
console.log('Time:' + Date.now())
next();
});
app.get('/', function(request, response){
response.send('Chào mừng các bạn đến với học viện công nghệ
var express = require('express');
var app = express();
app.use('/user/:id', function(request, response, next){
console.log('Time:' + Date.now())
next();
});