CHƯƠNG 1: CƠ SỞ LÝ THUYẾT
1.3. Ngôn ngữ lập trình Back-end
1.3.2. Lập trình web bằng Node JS
1.3.2.1. Tìm hiểu Node Js
Node.js là một mã nguồn mở, một môi trường cho các máy chủ và ứng dụng mạng.
21 Node.js sử dụng Google V8 JavaScript engine để thực thi mã, và một tỷ lệ lớn các mô-đun cơ bản được viết bằng JavaScript. Các ứng dụng node.js thì được viết bằng JavaScript.
Node.js chứa một thư viện built-in cho phép các ứng dụng hoạt động như một Webserver mà không cần phần mềm như Nginx, Apache HTTP hoặc IIS.
Node.js cung cấp kiến trúc hướng sự kiện (event-driven) và non-blocking I/O API, tối ưu hóa thông lượng của ứng dụng và có khả năng mở rộng cao.
Mọi hàm trong Node.js là không đồng bộ (asynchronous). Do đó, các tác vụ đều được xử lý và thực thi ở chế độ nền (background processing).
Ưu điểm NodeJS
- Đặc điểm nổi bật của Node.js là nó nhận và xử lý nhiều kết nối chỉ với một single- thread. Điều này giúp hệ thống tốn ít RAM nhất và chạy nhanh nhất khi không phải tạo thread mới cho mỗi truy vấn giống PHP. Ngoài ra, tận dụng ưu điểm non-blocking I/O của Javascript mà Node.js tận dụng tối đa tài nguyên của server mà không tạo ra độ trễ như PHP.
- JSON APIs Với cơ chế event-driven, non-blocking I/O(Input/Output) và mô hình kết hợp với Javascript là sự lựa chọn tuyệt vời cho các dịch vụ Webs làm bằng JSON.
- Ứng dụng trên 1 trang (Single page Application) Nếu chúng ta định viết 1 ứng dụng thể hiện trên 1 trang (Gmail?) NodeJS rất phù hợp để làm. Với khả năng xử lý nhiều Request/s đồng thời thời gian phản hồi nhanh. Các ứng dụng chúng ta định viết không muốn nó tải lại trang, gồm rất nhiều request từ người dùng cần sự hoạt động nhanh để thể hiện sự chuyên nghiệp thì NodeJS sẽ là sự lựa chọn tốt. - Shelling tools unix NodeJS sẽ tận dụng tối đa Unix để hoạt động. Tức là NodeJS có thể xử lý hàng nghìn Process và trả ra 1 luồng khiến cho hiệu xuất hoạt động đạt mức tối đa nhất và tuyệt vời nhất.
- Streamming Data (Luồng dữ liệu) Các web thông thường gửi HTTP request và nhận phản hồi lại (Luồng dữ liệu). Giả xử sẽ cần xử lý 1 luồng giữ liệu cực lớn, NodeJS sẽ xây dựng các Proxy phân vùng các luồng dữ liệu để đảm bảo tối đa hoạt động cho các luồng dữ liệu khác.
22 - Ứng dụng Web thời gian thực Với sự ra đời của các ứng dụng di động & HTML5 nên
Node.js rất hiệu quả khi xây dựng những ứng dụng thời gian thực (real-time applications) như ứng dụng chat, các dịch vụ mạng xã hội như Facebook,
Twitter…
Nhược điểm NodeJS
- Ứng dụng lớn tốn tài nguyên, nếu chúng ta cần xử lý các ứng dụng tốn tài nguyên CPU như encoding video, convert file, decoding encryption… hoặc các ứng dụng tương tự như vậy thì không nên dùng NodeJS (Lý do: NodeJS được viết bằng C++ &
Javascript, nên phải thông qua thêm 1 trình biên dịch của NodeJS sẽ lâu hơn 1 chút).
Trường hợp này chúng ta hãy viết 1 Addon C++ để tích hợp với NodeJS để tăng hiệu suất tối đa!
- NodeJS và ngôn ngữ khác NodeJS, PHP, Ruby, Python .NET …thì việc cuối cùng là phát triển các App Web. Nhưng với NodeJS chúng ta có thể có 1 ứng dụng như mong đợi, điều đó là chắc chắn!
Cơ chế của Node js Application
Node js Application xử lý Model như sau:
- Client gửi request đến Web Server.
- Node js Web Service duy trì trong nội bộ một luồng giới hạn để cung cấp dịch vụ cho Client Request.
- Node js Web Service nhận tất cả các request và đặt chúng vào một trong Queue.
Nó được gọi là một Event Queue.
- Node js Web Service nội bộ có một thành phần được gọi là "Event Loop".
- Event Loop chỉ sử dụng một luồng đơn để xử lý Model.
- Event Loop kiểm tra tất cả các Request đặt trong Event Queue. Nếu không có request nào thì chờ request đến vô thời hạn.
- Nếu có request thì sẽ lấy một request từ Event Queue.
- Khởi động quá trình xử lý tiến trình từ client request.
23 - Nếu Client Request không chứa nhiều Blocking I/O thì xử lý tất cả mọi thứ và chuẩn
bị cho quá trình gửi lại phản hồi cho phía client.
- Nếu Client Request chứa nhiều Blocking I/O như việc tương tác với cơ sở dữ liệu, tập tin hệ thống, dịch vụ mở rộng, thì nó sẽ thực hiện theo các phương pháp tiếp cận khác nhau.
- Kiểm tra các luồng sẵn có từ nội bộ bên trong của request gửi lên.
- Chọn một luồng và chỉ định cho client request tương ứng với luồng đó. - Luồng đó phải có trách nhiệm với reuqest đó, xử lý nó, thực thi các hoạt động Blocking I/O, chuẩn bị các phản hồi và gửi lại cho Event Loop.
- Event Loop gửi lại phản hồi tương ứng cho client.
Module Node.js
Module được xem như là thư viện JavaScript chứa tập các hàm chúng ta muốn thêm vào ứng dụng của chúng ta. Node.js có 1 tập module tích hợp mà chúng ta có thể sử dụng mà không cần cài đặt gì thêm.
Nhúng module: Để nhúng module, chúng ta có thể dùng hàm require() với tên của module.
Trong ví dụ trên, chúng ta đã nhúng module HTTP để tạo các yêu cầu (request) đến server. Ngoài ra, có nhiều module khác tích hợp trong Node.js.
Các sự kiện trong Node.js
Node.js hỗ trợ các sự kiện trong các ứng dụng rất hoàn hảo. Các hành động trong máy tính được gọi là 1 sự kiện (event), chẳng hạn như mở tập tin là 1 sự kiện. Các đối tượng trong Node.js có thể phát sinh sự kiện, như đối tượng readStream phát sinh các sự kiện khi mở và đóng một tập tin.
24
1.3.2.2. Framework Express
Express là một module hay nói theo cách thường được nhắc đến thì nó là một framework trong node.js. Express framework cung cấp cho chúng ta đầy đủ tiện ích để có thể xây dựng một ứng dụng web hay một API.
Và đây là các ưu điểm các chúng ta sẽ nhìn thấy được khi sử dụng express framework:
Express hỗ trợ chúng ta phát triển ứng dụng theo mô hình MVC.
Cho phép định nghĩa các middleware.
Định nghĩa rõ ràng các request methods trong route.
Hỗ trợ mạnh về REST API…
Cài đặt Express.
Do Express framework không được tích hợp sẵn vào trong node.js nên khi muốn sử dụng nó chúng ta phải tải nó về máy với sử dụng được. Và để cải đặt nó chúng ta sử dụng cú pháp của npm.
Sau khi cài đặt xong thì trong thư mục dự án của chúng ta sẽ có thêm một thư mục node_modules - đây là thư mục chứa các package download từ npm.
Cấu trúc của express Root:
- App.js chứa các thông tin về cấu hình, khai báo, các định nghĩa... để ứng dụng của chúng ta chạy ok.
- Package.json chứa các package cho ứng dụng chạy. Nếu chúng ta nào làm với PHP hoặc RoR rồi thì file này có chức năng tương tự như composer.json hoặc Gemfile - Folder routes: chứa các route có trong ứng dụng
- Folder view: chứa view/template cho ứng dụng
25 - Folder public chứa các file css, js, images,...cho ứng dụng Router trong Express
Router là một Object nó là một instance riêng của middleware và routes Chính vì nó là một instance của middleware và route nên nó có các chức năng của cả hai.
Chúng ta có thể gọi nó là một mini-application
Các Application dùng ExpressJS làm core đều có phần Router được tích hợp sẵn trong đó.
Router hoạt động như một middleware nên chúng ta có thể dùng nó như một arguments. Hoặc dùng nó như một arguments cho route khác.
Ví dụ:
Chúng ta cũng có thể sử dụng Router để chia route.
Router.METHOD(): Router.METHOD() cung cấp cho chúng ta chức năng Routing trong ExpressJS. Cụ thể METHOD() ở đây là các HTTP method mà chúng ta thường xuyên sử dụng. Chẳng hạn GET, POST, PUT...
Ví dụ:
26