Node.js cũng cung cấp một thư viên phong phú gồm nhiềumô-đun JavaScript khác nhau giúp đơn giản hóa việc pháttriển các ứng dụng web bằng cách sử dụng Node.js đến mộtmức độ lớn... Node.js
Trang 1Node.js - Giới thiệu
Node.js là một nền tảng phía máy chủ được xây dựng trênCông cụ JavaScript của Google Chrome (V8 Engine) Node.jsđược phát triển bởi Ryan Dahl trong năm 2009 và phiênbản mới nhất của nó là v0.10.36 Định nghĩa của Node.jsđược cung cấp bởi https://nodejs.org :
Node.js là môi trường thời gian chạy đa nền tảng nguồn mở
để phát triển các ứng dụng mạng và phía máy chủ Các ứngdụng Node.js được viết bằng JavaScript và có thể chạy trên
OS X, Microsoft Windows và Linux
Node.js cũng cung cấp một thư viên phong phú gồm nhiềumô-đun JavaScript khác nhau giúp đơn giản hóa việc pháttriển các ứng dụng web bằng cách sử dụng Node.js đến mộtmức độ lớn
Node.js = Runtime Environment + JavaScript Library
Trang 2Các tính năng của Node.js
• Không đồng bộ và điều khiển sự kiện - Tất cả các API của thư viện
Node.js là không đồng bộ, nghĩa là, không bị chặn Về cơ bản nó có nghĩa là một máy chủ dựa trên Node.js không bao giờ chờ đợi một API để trả về dữ liệu Máy chủ chuyển sang API tiếp theo sau khi gọi nó và cơ chế thông báo của Sự kiện của Node.js giúp máy chủ nhận được phản hồi từ cuộc gọi API trước đó.
• Rất nhanh - Được xây dựng trên Công cụ JavaScript V8 của Google
Chrome, thư viện Node.js rất nhanh trong việc thực thi mã.
• Single Threaded nhưng Highly Scalable - Node.js sử dụng một mô
hình luồng đơn với vòng lặp sự kiện Cơ chế sự kiện giúp máy chủ phản hồi theo cách không chặn và làm cho máy chủ có khả năng
mở rộng cao hơn so với các máy chủ truyền thống tạo ra các chuỗi giới hạn để xử lý các yêu cầu Node.js sử dụng một chương trình luồng đơn và cùng một chương trình có thể cung cấp dịch vụ cho một số lượng lớn các yêu cầu hơn các máy chủ truyền thống như Apache HTTP Server.
• Không đệm - Các ứng dụng Node.js không bao giờ đệm bất kỳ dữ
liệu nào Các ứng dụng này đơn giản xuất dữ liệu theo khối.
• Giấy phép - Node.js được phát hành theo giấy phép MIT
Trang 4Nơi nào để sử dụng Node.js?
Sau đây là các lĩnh vực mà Node.js đang chứng tỏ mình làmột đối tác công nghệ hoàn hảo
• Ứng dụng nhập/xuất
• Ứng dụng truyền dữ liệu
• Ứng dụng thời gian thực dữ liệu chuyên sâu (DIRT)
• Các ứng dụng dựa trên API JSON
• Ứng dụng trang đơn (Single Page Applications)
Nơi nào không sử dụng Node.js?
Không nên sử dụng Node.js cho các ứng dụng chuyên sâucủa CPU
Trang 5Node.js - Thiết lập môi trường
Thiết lập môi trường cục bộ
Cần hai phần mềm sau đây có sẵn trên máy tính là (a) Trìnhsoạn thảo văn bản và (b) File cài đặt nhị Node.js
Trình chỉnh sửa văn bản
Điều này sẽ được sử dụng để nhập chương trình của bạn Ví
dụ về một vài trình soạn thảo như Atom, Sublime, Bracket,
Visual Studio Code.
Các tệp bạn tạo bằng trình chỉnh sửa của bạn được gọi làtệp nguồn và chứa mã nguồn của chương trình Các tệpnguồn cho các chương trình Node.js thường được đặt tênvới phần mở rộng ".js"
Trang 6The Node.js Runtime
Mã nguồn được viết trong tệp nguồn chỉ đơn giản làjavascript Trình thông dịch Node.js sẽ được sử dụng đểdiễn giải và thực thi mã javascript của bạn
Tải xuống kho lưu trữ Node.js
Tải xuống phiên bản mới nhất của tệp lưu trữ có thể cài đặt
Node.js từ http://nodejs.org/download/ Tại thời điểm viếthướng dẫn này, có các phiên bản như sau
Windows node-v6.3.1-x64.msi Linux node-v6.3.1-linux-x86.tar.gz Mac node-v6.3.1-darwin-x86.tar.gz SunOS node-v6.3.1-sunos-x86.tar.gz
Trang 7Cài đặt trên Windows
Sử dụng tệp MSI và làm theo lời nhắc để cài đặt Node.js.Theo mặc định, trình cài đặt sử dụng phân phối Node.jstrong C:\Program Files\nodejs Trình cài đặt nên đặt thưmục C:\Program Files\nodejs\bin trong biến môi trườngPATH của cửa sổ Khởi động lại mọi lời nhắc lệnh mở đểthay đổi có hiệu lực
Xác minh cài đặt: Thực thi tệp
Tạo tệp js có tên main.js trên máy của bạn (Windows hoặcLinux) có mã sau
/*Hello, World! program in node.js */
console.log("Hello, World!")
Bây giờ hãy chạy tệp main.js bằng cách sử dụng trình thôngdịch Node.js để xem kết quả:
$ node main.js
Nếu mọi thứ đều ổn với cài đặt của bạn, ta có kết quả sau:
Hello, World!
Trang 8Node.js - Ứng dụng đầu tiên
Trước khi tạo "Hello, World!” sử dụng Node.js, hãy xem cácthành phần của ứng dụng Node.js Một ứng dụng Node.jsbao gồm ba thành phần quan trọng sau:
•Nhập module cần - Chúng tôi sử dụng đòi hỏi chỉ để tải cácmodule Node.js
•Tạo máy chủ - Máy chủ sẽ lắng nghe các yêu cầu của máykhách tương tự như Máy chủ HTTP Apache
•Đọc yêu cầu và trả về phản hồi - Máy chủ được tạo trongbước trước sẽ đọc yêu cầu HTTP do ứng dụng khách thựchiện có thể là trình duyệt hoặc bảng điều khiển và trả vềphản hồi
Trang 9Node.js - Ứng dụng đầu tiên (t.t)
Bước 1 - Nhập mô-đun bắt buộc
Sử dụng chỉ thị require để tải mô-đun http và lưu trữ vô thể hiện HTTP trả về:
var http = require("http");
Bước 2 - Tạo máy chủ
Chúng tôi sử dụng cá thể http đã tạo và gọi phương thức http.createServer ()
để tạo một cá thể máy chủ và sau đó chúng ta liên kết nó tại cổng 8081 bằng cách sử dụng phương thức nghe được liên kết với cá thể máy chủ Chuyển cho nó một hàm với các tham số yêu cầu và đáp ứng Viết triển khai mẫu để luôn trả về "Hello World".
http createServer ( function ( request , response ) {
// Send the HTTP header // HTTP Status: 200 : OK // Content Type: text/plain response writeHead (200, { 'Content-Type' : 'text/plain' });
// Send the response body as "Hello World"
response end ( 'Hello World\n’ );
}) listen (8081);
// Console will print the message
console log ( 'Server running at http://127.0.0.1:8081/' );
Đoạn mã trên là đủ để tạo
ra một máy chủ HTTP mà lắng nghe, nghĩa là, chờ đợi một yêu cầu trên cổng
8081 của máy cục bộ.
Bước 3 - Yêu cầu và phản hồi thử nghiệm
Hãy đặt code ở bước 1 và 2 vào trong một tệp có tên main.js và khởi động máy chủ HTTP như sau $ node main js
Trang 10Node.js - Ứng dụng đầu tiên (t.t)
Xác minh đầu ra Máy chủ đã bắt đầu
Server running at http://127.0.0.1:8081/
Thực hiện một yêu cầu đến máy chủ Node.js
Mở http://127.0.0.1:8081/ trong mọi trình duyệt và quan sát kết quả sau
Xin chúc mừng, bạn đã khởi động và chạy máy chủ HTTP đầu tiên của mình, ứng dụng này đang phản hồi tất cả các yêu cầu HTTP tại cổng 8081.
Trang 11Node.js - Thiết bị đầu cuối REPL
REPL là viết tắt của Read Eval Print Loop và nó đại diện cho
một môi trường máy tính như Windows console hoặc Unix/ Linux shell, nơi một lệnh được nhập vào và hệ thống đápứng với một đầu ra trong một chế độ tương tác Node.js
hoặc Node đi kèm với một môi trường REPL Nó thực hiện
các tác vụ sau
•Read (Đọc) - Đọc đầu vào của người dùng, phân tích cú
pháp đầu vào thành cấu trúc dữ liệu JavaScript và lưu trữtrong bộ nhớ
•Eval (ước lượng) - Đưa ra và ước lượng cấu trúc dữ liệu.
•Print (In) - In kết quả.
•Loop (Vòng lặp) - Vòng lệnh trên cho đến khi người dùng
nhấn ctrl-c hai lần
Tính năng REPL của Node rất hữu ích trong việc thử nghiệmvới các mã Node.js và để gỡ lỗi các mã JavaScript
Trang 12Thiết bị đầu cuối REPL trực tuyến
Bắt đầu REPL
REPL có thể được bắt đầu bằng cách chạy nút trên shell / console
mà không có bất kỳ đối số nào như sau $ node
Bạn sẽ thấy dấu nhắc lệnh REPL> nơi bạn có thể gõ bất kỳ lệnh Node.js nào $ node
>
Biểu thức đơn giản
Hãy thử một toán học đơn giản tại dấu nhắc lệnh Node.js REPL
Trang 13Sử dụng Biến (Variables)
Bạn có thể sử dụng các biến để lưu trữ các giá trị và in saunày giống như bất kỳ tập lệnh thông thường nào Nếu từkhóa var không được sử dụng, thì giá trị được lưu trữ trong
biến và biến được in Trong khi nếu dùng từ khóa var, thì giá
trị được lưu trữ nhưng biến không được in Bạn có thể incác biến bằng cách sử dụng console.log ()
Trang 14Biểu thức trên nhiều dòng (Multiline Expression)
Node REPL hỗ trợ nhiều biểu thức tương tự như JavaScript.Hãy kiểm tra vòng lặp do-while sau đây đang hoạt động -
Trang 16.break - thoát khỏi biểu thức nhiều dòng.
.clear - thoát khỏi biểu thức nhiều dòng.
.save filename - lưu phiên Node REPL hiện tại vào một tập
tin
.load filename - tải nội dung tập tin trong phiên Node REPL
hiện tại
Trang 18Chạy code NodeJS từ dòng lệnh
Ta code trực tiếp trên console hoặc viết code tron file js rồi gọi chạy
Trang 19Chạy code NodeJS từ file JS đã có
Trang 20Khái niệm cơ bản
Node.js hỗ trợ JavaScript Vì vậy, cú pháp JavaScript trên Node.js tương tự như cú pháp JavaScript của trình duyệt.
Trang 21Các loại nguyên thủy
Node.js bao gồm các kiểu nguyên thủy sau: Chuỗi (String)
Trang 23Khai báo biến
Trang 24Ép kiểu các biến để dùng
Trang 25Truyền theo tham trị
Trang 26Vd truyền theo tham trị
Trang 27Truyền theo tham chiếu
Trang 28Vd truyền theo tham chiếu
Trang 29Cấu trúc rẽ nhánh - if
Trang 30Vòng lặp - for , while
Trang 31Khai báo mảng
Trang 33Khai báo hàm - function
Trang 34Hàm làm tham số cho hàm
Trang 35Một biến đại diện cho hàm
Trang 36Scope
Trang 37Ví dụ dùng hàm không tên
Chương trình sẽ bị lỗi, không chạy được,
để sửa lỗi ta bọc lại hết bằng ngoặc đơn
Trang 38Ví dụ về phạm vi (scope)
Code 2 bên chạy bình thường mặc dù không khai báo tên hàm, và kết quả Hoa Mai, JS hiểu biến firstName trong từng phạm vi tương ứng, nên kết quả ra giống nhau
Trang 39Truyền tham số cho hàm để biết
phạm vi truy cập hàm
Kết quả sau khi chạy sẽ là
Hoa Phượng Mai
Trang 41Thao tác với thuộc tính của Object
Giả sử ta có một object literal, ta xuất ra màn hình có nhiều cách như sau
Trang 42Lời gọi function, array
Các lời gọi hàm cũng chính là event emitter trong NodeJS
Trang 43OOP trong Node
Trang 44Sự kế thừa trong JS
Trang 45Kế thừa Prototype
Trang 46Hàm khởi tạo
Trang 47Mở rộng phương thức của Person
Trang 48Mở rộng thuộc tính của Person
Person.prototype.level = “admin”
Trang 49Tạo đối tượng User kế thừa mọi thứ từ Prototype từ Person
Prototype của User đã được mở rộng từ Person
Và User sẽ có phương thức getName, getPassword và thuộc tính level, nhưng password không có giá trị vì ta không khởi tạo password
Trang 50Kết quả khi chạy chương trình
Trang 51Mở rộng đối tượng sẵn có trong JS thông qua kế thừa Prototype
Trang 52Tạo hàm trong OOP
Trang 53Hàm call và apply giúp thay đổi ngữ cảnh của this
Kết quả ra giống nhau ở call và
apply, 2 hàm giúp ta đổi ngữ
cảnh biến name tham số
Trang 54call và apply khác nhau ở kiểu tham số dạng danh sách hay dạng mảng
Trang 55Để sử dụng được class từ NodeJS 4.x trở lên
Ta dùng từ khóa
‘use strict’;
Tại dòng đầu tiên của tập tin JS trước khi khai báo class
Trang 56Xét ví dụ chưa dùng class mà chỉ dùng function và dùng prototype để mở rộng
Trang 57Ta sử dụng class
Trang 58Dùng prototype để so sánh 2 đối tượng xem có cùng kiểu hay không ?
Trang 59Module trong Node.JS
Mô-đun trong Node.js là một hàm đơn giản hoặc phức tạp được tổ chức trong một hoặc nhiều tệp JavaScript có thể được sử dụng
lại trong suốt ứng dụng Node.js.
Mỗi mô-đun trong Node.js có ngữ cảnh
riêng của nó, và nó không được ảnh hưởng vào các mô-đun khác hoặc gây ảnh hưởng đến toàn ứng dụng Mỗi mô-đun có thể
được đặt trong một tệp js riêng biệt trong
một thư mục riêng biệt.
Trang 61Core Modules trong Node.JS
Các mô-đun chính này được biên dịch thành nhị phân và
ta cần import nó trước khi dùng
Core Module Mô tả
http gồm các lớp, phương thức và sự kiện để tạo máy chủ http
Nodejs.
url gồm các phương thức để phân giải và phân tích cú pháp
URL.
querystring gồm các phương thức để xử lý chuỗi truy vấn.
path gồm các phương thức để xử lý đường dẫn tệp.
fs gồm các lớp, phương thức và sự kiện để làm việc
nhập/xuất tập tin.
util gồm các hàm tiện ích giúp cho các lập trình viên.
Trang 62Mặc định là cục bộ
JavaScript của Node khác với JavaScript của trình duyệt khi nói đến phạm vi toàn cục Trong JavaScript của trình duyệt, các biến được khai báo mà không có từ khóa var trở thành toàn cục Trong Node.js, mọi thứ trở thành cục bộ theo mặc định.
Trang 63Phạm vi truy cập toàn cục
Trong một trình duyệt, phạm vi toàn cục là đối tượng
window Trong Node.js, đối tượng global đại diện cho
phạm vi toàn cục
Để thêm một cái gì đó vào phạm vi toàn cục, ta cần
module.export Và để nhập mô-đun/đối tượng từ toàn
cục vô dùng ta dùng hàm require().
Ví dụ, để xuất một đối tượng trong Node.js, sử dụng
hàm exports.name = object
Trang 64var name = 'Hello my name is MrTeacherLong' ;
Ví dụ: dùng Export để xuất thông tin 1 file cần dùng nhiều lần ra để dùng khi cần thiết
Bước 1: tạo 1 file cần export (vd: hello.js )
var ten = require ( './hello.js' );
Bước 2: tạo 1 file khác gọi sử dụng file đã export
Trang 66Tải một core module
var module = require ('module_name');
Ta import module cần dùng bằng hàm require () như sau
Theo cú pháp trên, chỉ định tên mô-đun trong hàm require() Hàm require() sẽ trả về một object, function, property hoặc bất kỳ loại JavaScript nào khác, tùy thuộc vào mô đun được chỉ định trả về.
Trang 67Ví dụ tải một core module http
var http = require( 'http' );
var server = http.createServer(
function (req, res){
//write code here
} );
server.listen(5000);
Trong ví dụ trên, hàm require() trả về một đối tượng vì
mô đun http trả về hàm ở dạng đối tượng, khi đó ta có thể sử dụng các thuộc tính và phương thức của nó bằng cách sử dụng ký pháp chấm, ví dụ:
http.createServer()
Trang 68Tải một core module
Trang 69Local Module
• Local Module (Mô-đun cục bộ) là các mô-đun
được tạo cục bộ trong ứng dụng Node của bạn
• Các mô-đun này bao gồm các chức năng khác
nhau của ứng dụng trong các tệp và thư mụcriêng biệt
• Ta cũng có thể đóng gói và phân phối nó thông
qua NPM, để cộng đồng Node có thể sử dụngnó
• Ví dụ, nếu cần kết nối với MongoDB và tìm nạp
dữ liệu thì có thể tạo một mô-đun cho nó, có thể được tái sử dụng trong ứng dụng.
Trang 70Viết mô-đun đơn giản
• Bước 1:
• Viết mô-đun đơn giản là ghi nhật ký thông tin,
cảnh báo hoặc lỗi vào console
• Trong Node, mô-đun phải được đặt trong một
tệp JavaScript riêng biệt Vì vậy, ta sẽ tạo một tệp Log.js và viết mã vào nó
• Bước 2: xuất mô-đun ra để bên ngoài dùng
Trang 71Bước 1: Tạo local module
Export gián tiếp
Export trực tiếp
Trong Node.js, mô-đun phải được đặt trong một tệp JavaScript riêng biệt.
Trang 72Bước 2: sử dụng module đã export
Nếu export function thì gọi sử dụng như sau
Nếu export đối tượng thì gọi sử dụng như sau
• Ứng dụng module như
một library để dùng chung cho các hàm
• Ta cũng có thể để local
module trong thư mục khác và gọi đúng đường dẫn để dùng
Đây cũng được gọi là
import một module vô
để dùng
Trang 73Giải thích cách dùng Local Module
Trong ví dụ trên, main.js đang sử dụng mô đun log Đầutiên, nó tải mô đun log bằng hàm require() và đường dẫn
cụ thể nơi lưu trữ mô-đun được lưu trữ Mô-đun log chứatrong tệp Log.js trong thư mục gốc Vì vậy, ta chỉ địnhđường dẫn './Log.js' trong hàm require() Ký hiệu '.’ thể
hiện cho một thư mục gốc
Hàm require() trả về một đối tượng log vì mô đun đượctìm thấy trong Log.js nhờ sử dụng module.exports Vì vậy,
bây giờ ta có thể sử dụng mô-đun log làm đối tượng và gọi
bất kỳ hàm nào của nó bằng cách sử dụng ký hiệu chấm, ví
dụ logger.info() hoặc logger.warning() hoặc logger.error()
Trang 74Cách thức xuất module
tượng đặc biệt được bao gồm trong mọi tệp
JS trong ứng dụng Node.js theo mặc định.
và export là một đối tượng sẽ được tìm ra dưới dạng mô-đun Vì vậy, bất cứ gì gán vô
module.exports hoặc exports, sẽ được trình
bày như mô-đun.
Trang 75Export Literals
Như đã đề cập ở trên, exports là một đối tượng Vì vậy, nó sẽ
phơi bày ra bất cứ gì ta gán cho nó như một mô-đun Chẳng
hạn, nếu ta gán một chuỗi ký tự thì nó sẽ phơi bày chuỗi ký tự
đó ở dạng mô-đun Ví dụ sau ta xuất chuỗi thành dạng mô-đun trong Message.js.
module.exports = 'Hello world' ;
//hoặc
exports = 'Hello world' ;
Sau đó ta import mô-đun vào file app.js và dùng như sau.
var msg = require( './Messages.js’ );
console.log(msg);
Lưu ý: phải chỉ định './' làm đường dẫn của thư mục gốc để nhập mô-đun cục bộ Và
không cần chỉ định đường dẫn để nhập core hoặc NPM mô-đun
Messages.js