Ứng Dụng Đầu Tiên - "Hello World" Với Node.js

Như ở bài trước thì mình đã giới thiệu với các bạn về Node.js, ở bài này mình sẽ hướng dẫn các bạn viết ứng dụng đầu tiên bằng Node.js mang tên "Hello World"

Hãy mở chương trình biên tập (editor) yêu thích của bạn ra và tạo một file mới có tên là siinblog.js Chúng ta muốn in "Hello World" ra STDOUT, và đây là tất cả những gì chúng ta cần:

console.log("Hello World");

Lưu file lại và chạy nó thông qua Node.js:

node siinblog.js

Chương trình sẽ in Hello World ra màn hình terminal hoặc command prompt của bạn.

Hơi buồn tẻ một chút phải không? Hãy cùng làm cái gì đó thực tế hơn.

Ứng Dụng Đầu Tiên - "Hello World" Với Node.js

Một ứng dụng web hoàn chính sử dụng Node.js

Đơn giản thôi, nhưng thực tế:
  • Người dùng có thể truy cập vào ứng dụng trên một trình duyệt bất kỳ.
  • Người dùng sẽ nhìn thấy một trang chào đón có hiển thị một form cho phép tải file lên khi truy cập vào địa chỉ http://domain/start
  • Sau khi chọn một bức ảnh và ấn gửi đi, bức ảnh đó sẽ được gửi đến http://domain/upload, nơi nó sẽ được hiển thị sau khi quá trình tải lên hoàn tất.

Thế là đủ rồi. Bây giờ, bạn có thể đạt được mục tiêu này bằng cách ... google và sửa code của một ai đó. Nhưng đó không phải là cách mà chúng ta làm ở đây.

Hơn nữa, chúng ta không muốn viết code đơn giản nhất có thể để "miễn sao xong là được", cái chúng ta muốn ở đây là chính xác và rõ ràng nhất có thể. Chúng ta sẽ sử dụng trừu tượng hoá nhiều hơn nhằm mục đích giúp bạn làm quen dần với việc xây dựng các ứng dụng Node.js phức tạp hơn.

Cấu trúc của ứng dụng

Hãy cùng chia nhỏ ứng dụng của chúng ta ra để xem phần nào cần được thực hiện để thoả mãn yêu cầu đã đề ra (use cases).
  • Chúng ta muốn cho phép người dùng truy cập vào các trang web, vì thế chúng ta cần một máy chủ HTTP
  • Máy chủ của chúng ta phải phản hồi/trả lời được các yêu cầu khác nhau, tuỳ thuộc vào địa chỉ (URL) nào được yêu cầu, vì thể chúng ta cần cái gì đó có chức năng giống như router (cầu nối/dẫn) để "nối" các yêu cầu đến nơi chuyên xử lý các yêu cầu (request handler) đó.
  • Để đáp ứng các yêu cầu nhận được ở phía máy chủ và đã được dẫn hướng thông qua router, chúng ta cần các request handlers thật sự.
  • Chắc chắn router của chúng ta sẽ xử lý tất cả các dữ liệu được gửi đến qua phương thức POST rồi gửi nó đi dưới một định dạng thuận tiện đến các request handlers, vì thế chúng ta cần request data handling. (Có thể hiểu là xử lý dữ liệu đầu vào).
  • Chúng ta không chỉ muốn quản lý các request theo đường dẫn mà còn hiển thị nội dung khi một đường dẫn nào đó được gọi, điều này có nghĩa chúng ta cần một view logic mà request handlers có thể sử dụng để gửi lại nội dung về trình duyệt của yêu cầu.
  • Cuối cùng, người dùng có thể tải ảnh lên, vì thể chúng ta cần bước upload handling để xử lý việc upload.

Hãy dành một chút thời gian để nghĩ xem chúng ta sẽ xây dựng cấu trúc này với PHP như thế nào. Không quá khó để đoán ra, mô hình phổ biến sẽ là máy chủ web Apache và mod_php5. 

Điều này đồng nghĩa với việc nhận, gửi và xử lý các yêu cầu không xảy ra trong bản thân PHP.

Với Node.js thì khác. Bởi vì chúng ta không chỉ viết ứng dụng, mà còn cả máy chủ HTTP. Thực tế, ứng dụng web của chúng ta và máy chủ web của nó về cơ bản là giống nhau.

Có vẻ như có rất nhiều việc phải làm, nhưng lát nữa bạn sẽ thấy với Node.js, mọi thứ không quá khó đến vậy.

Hãy cùng bắt đầu từ vạch xuất phát và viết phần đầu tiên trong cấu trúc của ứng dụng của chúng ta, máy chủ HTTP.

Xây dựng cấu trúc ứng dụng

Một máy chủ HTTP cơ bản

Ở cái thời điểm mà tôi muốn bắt đầu phát triển ứng dụng Node.js có tính thực tế đầu tiên của tôi, tôi không chỉ băn khoăn xem phát triển nó như thế nào mà còn tổ chức nó ra làm sao. 

Tôi có nên viết tất cả vào trong một file? Đa số các hướng dẫn viết một máy chủ HTTP sử dung Node.js cơ bản đều gộp tất cả vào một chỗ. Vậy nếu tôi muốn đảm bảo rằng code của tôi luôn rõ ràng và dễ hiểu khi ứng dụng của tôi ngày một mở rộng lên thì sao?

Hoá ra, cũng không quá khó để tách biệt những thứ không có liên quan tới nhau ra, và sắp xếp chúng vào các module khác nhau.

Cách này cho phép chúng ta giữ được file chính (file khởi động ứng dụng) và các module luôn rõ ràng, dễ đọc, dễ bảo trì và các module còn có thể được sử dụng lại ở nhiều nơi khác nhau.

Bây giờ hãy tạo một file chính, nơi khởi chạy ứng dụng, và một file module nơi chứa mã nguồn cho máy chủ HTTP.

Theo quan điểm cá nhân của tôi, tiêu chuẩn để đặt tên file chính nên là index.js và nó sẽ khiến việc đặt tên module máy chủ server.js trở nên hợp lý và logic hơn.

Hãy cùng bắt đầu viết module cho máy chủ. Tạo mới file server.js trong thư mục gốc project của bạn, và viết vào đoạn code sau:

Chỉ thế thôi! Bạn vừa viết xong một máy chủ HTTP có khả năng hoạt động tốt. Hãy xác thực lại việc đó bằng cách chạy và kiểm tra nó. Đầu tiên, hãy chạy lệnh sau bằng Node.js:

node server.js

Bây giờ hãy mở trình duyệt của bạn ra và truy cập vào địa chỉ sau http://localhost:8888/. Nếu đúng như mong đợi, những gì chúng ta thấy sẽ là "Hello World"

Thú vị phải không? Bạn nghĩ sao về việc cùng tìm hiểu xem nó hoạt động như thế nào? Hãy tạm thời để câu hỏi làm thế nào để tổ chức dự án của chúng ta lại đó. Tôi hứa sẽ đề cập lại tới nó trong những phần tiếp theo.

Được tạo bởi Blogger.