Tổng Quan Node.js

Node.js là gì?

Node.js là một Framework mã nguồn mở, có thể chạy trên nhiều nền tảng (Windows, Linux, Unix, Mac OS X, ...). Từ trước JavaScript chỉ là một ngôn ngữ lập trình phía client chạy trên trình duyệt. Nhưng với Node.js thì điều này không còn đúng nữa. Node.js là một cách để chạy JavaScript trên server. Node.js là một nền tảng chạy trên môi trường V8 JavaScript runtime - một trình thông dịch JavaScript cực nhanh chạy trên trình duyệt Chrome. Bình thường thì bạn cũng có thể tải bộ V8 và nhúng nó vào bất cứ thứ gì; Node.js làm điều đó đối với các web server. JavaScript suy cho cùng cũng chỉ là một ngôn ngữ - vậy thì không có lý do gì để nói nó không thể sử dụng trên môi trường server tốt như là trong trình duyệt của người dùng được. Trong một môi trường server điển hình LAMP (Linux-Apache-MySQL-PHP), bạn có một web server là Apache hoặc NGINX nằm dưới, cùng với PHP chạy trên nó. Mỗi một kết nối tới server sẽ sinh ra một thread mới, và điều này khiến ứng dụng nhanh chóng trở nên chậm chạp hoặc quá tải - cách duy nhất để hỗ trợ nhiều người dùng hơn là bằng cách bổ sung thêm nhiều máy chủ. Đơn giản là nó không có khả năng mở rộng tốt. Nhưng với Node.js thì điều này không phải là vấn đề. Không có một máy chủ Apache lắng nghe các kết nối tới và trả về mã trạng thái HTTP - bạn sẽ phải tự quản lý kiến trúc lõi của máy chủ đó. May mắn thay, có một số module giúp thực hiện điều này được dễ dàng hơn, nhưng công việc này vẫn gây cho bạn một chút khó khăn khi mới bắt đầu. Tuy nhiên, kết quả thu được là một ứng dụng web có tốc độ thực thi cao. JavaScript là một ngôn ngữ dựa trên sự kiện, vì vậy bất cứ thứ gì xảy ra trên server đều tạo ra một sự kiện non-blocking. Mỗi kết nối mới sinh ra một sự kiện; dữ liệu nhận được từ một upload form sinh ra một sự kiện data-received; việc truy vấn dữ liệu từ database cũng sinh ra một sự kiện. Trong thực tế, điều này có nghĩa là một trang web Node.js sẽ chẳng bao giờ bị khóa (lock up) và có thể hỗ trợ cho hàng chục nghìn user truy cập cùng lúc. Node.js đóng vai trò của server - Apache - và thông dịch mã ứng dụng chạy trên nó. Giống như Apache, có rất nhiều module (thư viện) có thể được cài đặt để bổ sung thêm các đặc trưng và chức năng - như lưu trữ dữ liệu, hỗ trợ file Zip, đăng nhập bằng Facebook, hoặc các cổng thanh toán. Dĩ nhiên, nó không có nhiều thư viện như PHP, nhưng Node.js vẫn đang ở trong giai đoạn ban đầu và có một cộng đồng rất mạnh mẽ ở đằng sau nó. Một khái niệm cốt lõi của Node.js đó là các function bất đồng bộ (asynchronous functions) - vì vậy về cơ bản thì mọi thứ chạy trên nền tảng này. Với hầu hết các ngôn ngữ kịch bản máy chủ, chương trình phải đợi mỗi function thực thi xong trước khi có thể tiếp tục chạy tiếp. Với Node.js, bạn xác định các function sẽ chạy để hoàn thành một tác vụ nào đó, trong khi phần còn lại của ứng dụng vẫn chạy đồng thời.

Tại sao lại sử dụng Node.js

Đầu tiên là ưu điểm về tốc độ thực thi và khả năng mở rộng. Node.js có tốc độ rất nhanh. Đây là một điều cực kỳ quan trọng với bất kỳ trang Web nào. Nếu bạn là một trang web nhỏ và vừa bạn cần phải cạnh tranh với các đối thủ, vì vậy một sản phẩm mượt, tốc độ nhanh và khả năng mở rộng cao sẽ là một lợi thế. Đó là chưa kể khi số lượng người dùng ngày càng lớn thì khả năng mở rộng, và tốc độ thực thi để đáp ứng được nhu cầu là rất quan trọng. Node.js có thể xử lý hàng ngàn kết nối đồng thời trong khi với PHP thì cực kì khó khăn. Bên cạnh đó Node.js phát triển dựa trên JavaScript(Ngôn ngữ cực kỳ quen thuộc với bất kỳ developer nào) cho nên việc có nền tảng JavaScript rồi thì việc học Node.js cũng sẽ dễ dàng hơn. Đương nhiên sử dụng Node.js cũng có nhược điểm của nó. Cũng giống hầu hết các công nghệ mới việc triển khai Node.js trên host không phải là việc dễ dàng. Nếu bạn có một web hosting xài chung, bạn không thể đơn giản tải lên một ứng dụng Node.js và mong chờ nó hoạt động tốt. VPS và dedicated server là một sự lựa chọn tốt hơn - bạn có thể cài đặt Node.js trên chúng. Thậm chí dễ hơn là sử dụng một dịch vụ có khả năng mở rộng như là Heroku, và bạn có thể hoàn toàn an tâm để phát triển trang web của mình trên đó - bạn chỉ cần trả tiền khi cần thêm nhiều tài nguyên hơn. Và Node.js vẫn đang trong giai đoạn đầu phát triển nên sẽ có nhiều thay đổi trong các phiên bản tiếp theo.

Cài đặt và thực thi Node.js

Với Node.js thì việc cài đặt khá là dễ dàng Việc hướng dẫn cài đặt đã được trang web chính thức của Node.js mô tả cụ thể https://nodejs.org. Công việc của chúng ta chỉ là tải về và cài đặt theo hướng dẫn. Sau khi cài đặt Node.js trên máy tính bây giờ chúng ta cùng tạo ra một file Node.js tên là helloword.js với nội dung

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end('Hello World!');
}).listen(8080);

Và sau đó lưu lại C:\Users\Your Name\helloword.js Bây giờ muốn chạy thì chúng ta sẽ sử dụng command line Chuyển đến thư mục chưa file helloword.js

C:\Users\Your Name>_

Khởi động Node.js file File Node.js phải được khởi động trước khi có bất kỳ hoạt động nào.

C:/Users/Your Name>node helloword.js

Và bây giờ máy tính đã làm việc giống như một server với cổng 8080. Truy cập vào server với địa chỉ sau http://localhost:8080

Node.js Modules

Thế nào là Module trong Node.js

Cũng tương tự như trong thư việc JavaScript thì Module được hiểu như là một tập hợp các chức năng mà chúng ta muốn sử dụng trong ứng dụng.

Built-in Modules

Node.js đã xây dựng sẵn một tập các built-in Module chúng ta có thể sử dụng ngay mà không cần thêm bất kỳ sự cài đặt nào nữa. Có thể tham khỏa danh sách built-in Module tại https://www.w3schools.com/nodejs/ref_modules.asp Việc sử dụng built-in Module khá đơn giản nếu bạn muốn sử dụng module nào thì chỉ cẩn sử dụng từ khóa require() ví dụ: var http = require('http'); và bây giờ chúng ta có thể sử dụng HTTP module

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end('Hello World!');
}).listen(8080);

Tạo Module riêng

Module thực ra cũng là một tập các function cho nên nếu chúng ta muốn tạo ra các chức năng do mình tự viết, thì chúng ta có thể xây dựng các Module riêng Với từ khóa exports dùng để tạo các thuộc tính và chức năng cho Module đó

exports.myDateTime = function () {
    return Date();
};

như vậy là chúng ta vừa tạo ra một module cho việc lấy ngày hiện tại. Sau khi tạo module riêng thì chúng ta phải nhúng vào luồng xử lý chính. Cũng với chính từ khóa require()

var http = require('http');
var dt = require('./myfirstmodule');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write("The date and time are currently: " + dt.myDateTime());
    res.end();
}).listen(8080);

Ở đây chúng ta sử dụng đánh dấu vị trí của module như là tham số truyền vào. ./ là để đánh dấu rằng module này đang nằm cùng thư mục với Node.js file.

Node.js HTTP Module

ở đây chúng ta sẽ nó đến Module quan trọng nhất là HTTP Module HTTP Module có thể tạo ra một HTTP Server mà có thể lắng nghe tới cổng đã định sẵn để phản hồi lại kết quả và dữ liệu cho Client.

var http = require('http');

//create a server object:
http.createServer(function (req, res) {
  res.write('Hello World!'); //write a response to the client
  res.end(); //end the response
}).listen(8080); //the server object listens on port 8080

Nếu respond từ HTTP Server trả về trang HTML thì phải set chính xác phần header với content type như sau

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write('Hello World!');
  res.end();
}).listen(8080);

Một URL từ phía Client gửi tới sẽ có phần parametter truyền kèm theo. Để lấy các giá trị từ URL thì chúng ta sẽ sử dụng url module

var http = require('http');
var url = require('url');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  var q = url.parse(req.url, true).query;
  var txt = q.name + " live in " + q.address ;
  res.end(txt);
}).listen(8080);

Nếu địa chỉ truy cập là http://localhost:8080/?name=tam&address=DN thì sẽ hiển thị kết quả là tam live in DN

Kết luận

Việc sử dụng Node.js là một xu hướng mới đáng để học hỏi. Với rất nhiều lợi thế thì Node.js sẽ được sử dụng trong rất nhiều dự án trong tương lai. Bài viết tiếp theo sẽ mô tả cụ thể hơn các thành phần demo example.