Bối cảnh và vấn đề nghiên cứu

Trong bối cảnh ngành Công nghệ Thông tin ngày càng phát triển, nhu cầu tuyển dụng nhân lực lập trình web có tay nghề cao gia tăng liên tục. Đối với các doanh nghiệp, việc sở hữu một website chuyên nghiệp có vai trò quyết định trong việc khẳng định uy tín thương hiệu và quảng bá hình ảnh trên thị trường. Trong đó, tốc độ truy cập là yếu tố then chốt giúp website giữ chân người dùng, tăng tỷ lệ quay lại và tối ưu hóa thứ hạng trên các công cụ tìm kiếm (SEO). Do đó, việc lựa chọn công nghệ phát triển web có hiệu năng xử lý cao, hỗ trợ ứng dụng thời gian thực và khả năng mở rộng nhanh chóng là vấn đề cấp thiết.

Báo cáo thực tập tốt nghiệp xác định các mục tiêu và nhiệm vụ cụ thể:

  1. Tổng hợp cơ sở lý thuyết về nền tảng Node.js, đánh giá ưu điểm và nhược điểm của Node.js so với các công nghệ truyền thống như PHP, ASP.NET nhằm rút ra kinh nghiệm lựa chọn công nghệ phù hợp với nhu cầu thiết kế web.
  2. Tìm hiểu và thiết lập môi trường phát triển với Node.js, hệ thống quản lý gói npm, template engine Handlebars, framework Express.js, cơ sở dữ liệu MongoDB và công cụ kiểm thử Postman.
  3. Xây dựng hoàn chỉnh một website tin tức minh họa (Website Demo) đáp ứng các nhóm chức năng: cho phép khách vãng lai xem tin tức nhanh; cho phép người dùng đăng ký thành viên và đăng bài viết; cung cấp giao diện quản trị cho Admin quản lý thành viên và bài viết.

Phạm vi và thời gian thực hiện đề tài:

  • Không gian thực hiện: Khoa Công nghệ Thông tin, Trường Đại học Giao thông Vận tải TP. Hồ Chí Minh.
  • Tác giả thực hiện: Sinh viên Đào Tùng Lâm (MSSV: 1551120097) và Lương Công Cường, dưới sự hướng dẫn của Giảng viên Trần Đức Doanh.
  • Thời gian nghiên cứu và hoàn thành: Từ ngày 04/03/2020 đến ngày 20/05/2020.

Cơ sở lý thuyết và phương pháp

Khung lý thuyết và công nghệ

  • Node.js: Nền tảng mã nguồn mở độc lập xây dựng trên JavaScript Runtime V8 của Google Chrome, phần lõi (core) viết bằng C++, hỗ trợ kiến trúc hướng sự kiện (event-driven) và mô hình I/O không chặn (non-blocking I/O API) giúp tối ưu hóa thông lượng dữ liệu.
  • JavaScript & Chuẩn ECMAScript: Nền tảng ngôn ngữ chung cho cả frontend và backend; các đặc tả ES6/ECMAScript 2015 bao gồm: let/const, Arrow Functions, Classes, Promises, Template Literals, Destructuring Assignment, Modules, Block Scope.
  • Kiến trúc RESTful API: Mô hình dịch vụ web sử dụng các phương thức chuẩn của giao thức HTTP (GET, POST, PUT, PATCH, DELETE) với đường dẫn định danh bằng danh từ tài nguyên.
  • Cơ sở dữ liệu NoSQL (MongoDB): Hệ quản trị cơ sở dữ liệu hướng tài liệu đa nền tảng, tổ chức dữ liệu theo Collection và Document dưới định dạng tương tự JSON (cặp key-value) với cấu trúc schema động, không ràng buộc quan hệ bảng cố định.

Phương pháp nghiên cứu

  • Phương pháp thu thập và phân tích tài liệu: Nghiên cứu lý thuyết qua sách, báo, tài liệu khoa học chuyên ngành và tài liệu trực tuyến chính thức liên quan đến hệ sinh thái Node.js, Express.js, Handlebars và MongoDB.
  • Phương pháp thực nghiệm và xây dựng phần mềm: Cài đặt môi trường, viết mã nguồn ứng dụng bằng Visual Studio Code, quản trị dữ liệu với MongoDB Compass, thiết kế API và kiểm thử tự động với Postman và Newman CLI.
  • Nguồn dữ liệu: Dữ liệu lưu trữ dạng JSON (users.json), dữ liệu mẫu blog site và các bài viết tin tức thực nghiệm trên cơ sở dữ liệu MongoDB cục bộ.

Thiết kế và triển khai

Kiến trúc công nghệ của hệ thống

Hệ thống website demo được tổ chức theo kiến trúc phân lớp ứng dụng web sử dụng hoàn toàn hệ sinh thái JavaScript:

  • Tầng máy chủ & Điều hướng (Backend & Routing): Node.js kết hợp framework Express.js để tiếp nhận HTTP request, xử lý logic nghiệp vụ và định tuyến (routing).
  • Tầng hiển thị giao diện (View Engine): Handlebars.js làm template engine, biên dịch các mẫu HTML chứa biểu thức dữ liệu từ máy chủ và render phía client.
  • Tầng lưu trữ dữ liệu (Database): MongoDB lưu trữ các Document dữ liệu người dùng, bài viết tin tức, danh mục và bình luận.
  • Tầng kiểm thử (Testing): Postman PM API kết hợp Collection Runner và Newman CLI để kiểm thử tự động các điểm cuối API.

Thiết kế các điểm cuối API mẫu

Báo cáo xây dựng bảng tiêu chuẩn thiết kế RESTful API cho đối tượng người dùng (User) như sau:

STT Tên API Phương thức HTTP URI Body dữ liệu Kết quả trả về
1 listUsers GET /listUsers Rỗng (empty) Hiển thị danh sách tất cả người dùng
2 addUser POST /addUsers JSON String Thêm một người dùng mới vào hệ thống
3 deleteUser DELETE /deleteUser JSON String Xóa một người dùng hiện tại theo ID
4 Chi tiết User GET /:id Rỗng (empty) Hiển thị thông tin chi tiết một người dùng

Danh mục các mô-đun lõi và cờ I/O hệ thống

Các mô-đun cốt lõi tích hợp sẵn trong Node.js được ứng dụng để vận hành máy chủ và xử lý tập tin:

Tên mô-đun lõi Mô tả chức năng
http Cung cấp lớp, phương thức và sự kiện để tạo máy chủ HTTP
url Cung cấp các phương thức phân tích cú pháp và xử lý địa chỉ URL
querystring Cung cấp phương thức làm việc với chuỗi truy vấn (query string)
path Cung cấp các phương thức xử lý và chuẩn hóa đường dẫn tập tin
fs Cung cấp lớp, phương thức và sự kiện làm việc với hệ thống xuất/nhập tập tin (File I/O)
util Cung cấp các hàm tiện ích hữu ích cho lập trình viên

Đối với các hoạt động đọc/ghi tập tin qua mô-đun fs, báo cáo hệ thống hóa các cờ (flags) điều khiển:

  • r / r+: Mở tập tin để đọc / mở để đọc và ghi (báo lỗi nếu tập tin không tồn tại).
  • rs / rs+: Mở tập tin để đọc / đọc-ghi ở chế độ đồng bộ.
  • w / w+: Mở tập tin để ghi / đọc-ghi (tự động tạo mới nếu chưa có).
  • wx / wx+: Mở ghi / đọc-ghi nhưng thất bại nếu tập tin đã tồn tại.
  • a / a+: Mở tập tin để ghi nối tiếp (append) / đọc và nối tiếp (tự tạo nếu chưa có).
  • ax / ax+: Mở append / đọc-append nhưng thất bại nếu tập tin đã tồn tại.

Danh sách Actor, Use-case và Giao diện chức năng

Báo cáo xác định các tác nhân (Actor) và các ca sử dụng (Use-case) tương ứng với các phân hệ giao diện:

  • Khách vãng lai (Guest): Truy cập Trang chủ (Hình 7.1), xem danh sách tin tức mới nhất, xem chi tiết bài viết (Hình 7.5), xem thông tin hồ sơ của thành viên đăng bài (Hình 7.6), gửi phản hồi qua Trang liên hệ (Hình 7.4), thực hiện Đăng ký tài khoản (Hình 7.2) và Đăng nhập (Hình 7.3).
  • Thành viên (Member): Đăng nhập hệ thống, quản lý thông tin cá nhân, truy cập Trang quản lý bài viết của thành viên (Hình 7.8), tạo bài viết mới, chỉnh sửa hoặc xóa bài viết đã đăng (Hình 7.9).
  • Quản trị viên (Admin): Toàn quyền trên Trang quản trị của Admin (Hình 7.7), quản lý danh sách thành viên, kiểm duyệt và quản lý toàn bộ bài viết tin tức trên trang web.

Nội dung chính theo từng chương

Chương 1: Giới thiệu về NodeJS

Chương 1 làm rõ định nghĩa Node.js là môi trường runtime mã nguồn mở chạy mã JavaScript trên máy chủ thông qua V8 engine. Báo cáo phân tích các lý do sinh viên và lập trình viên nên tiếp cận Node.js: sử dụng đồng nhất một ngôn ngữ JavaScript cho cả frontend và backend, thư viện built-in cho phép chạy trực tiếp webserver mà không cần phần mềm trung gian (Nginx, Apache, IIS), cơ chế bất đồng bộ giúp xử lý ngầm các tác vụ nền, và cài đặt đơn giản trên Windows, Linux, Mac OS.

Chương này trình bày các ứng dụng phổ biến của Node.js gồm ứng dụng Real-time (chat, mạng xã hội), ứng dụng Single Page Application (SPA) với AJAX, ứng dụng kết nối cơ sở dữ liệu NoSQL (MongoDB, CouchDB) và các công cụ dòng lệnh (CLI). Hệ sinh thái npm được giới thiệu cùng các thư viện tiêu biểu: Express, Connect, Jade, Mongo/mongojs, Redis, CoffeeScript, Underscore/Lodash, Forever. Đồng thời, chương trình bày chi tiết về phạm vi biến trong JS (Scope: Global Scope, Local Scope), vòng đời biến, lịch sử các phiên bản ECMAScript từ ES1 đến ES6 (2015), và đánh giá các công cụ phát triển (WebStorm, Sublime Text, Visual Studio Code, Atom).

Chương 2: Ứng dụng của NodeJS

Chương 2 hướng dẫn chi tiết quy trình thực thi mã nguồn Node.js từ dòng lệnh (Terminal/CMD) và khởi tạo một máy chủ HTTP cơ bản. Báo cáo phân tích hệ thống quản lý gói npm với 2 vai trò: kho lưu trữ trực tuyến và công cụ dòng lệnh (npm install, cài đặt cục bộ tại node_modules, cài đặt toàn cục -g, cấu hình package.json, npm update, npm uninstall, npm init, npm adduser, npm publish).

Nội dung trọng tâm của chương là việc xử lý tập tin qua mô-đun fs thông qua các hàm cụ thể:

  • fs.open(path, flags[, mode], callback): Mở tập tin với cờ và chế độ phân quyền.
  • fs.stat(path, callback): Lấy thông tin tập tin, trả về đối tượng fs.Stats hỗ trợ các phương thức kiểm tra kiểu: isFile(), isDirectory(), isBlockDevice(), isCharacterDevice(), isSymbolicLink(), isFIFO(), isSocket().
  • fs.writeFile(), fs.read(), fs.close(), fs.ftruncate(), fs.unlink(): Ghi, đọc qua File Descriptor (fd), đóng, cắt bớt kích thước và xóa tập tin.
  • fs.mkdir(), fs.readdir(), fs.rmdir(): Tạo, duyệt danh sách và xóa thư mục.

Chương làm rõ cơ chế Callback trong kiến trúc bất đồng bộ của Node.js thông qua so sánh thực nghiệm giữa hàm đọc tập tin đồng bộ chặn luồng (fs.readFileSync) trong blocking-example.js và hàm đọc bất đồng bộ không chặn luồng (fs.readFile) trong non-blocking-example.js.

Chương 3: Template Engine Handlebars

Chương 3 trình bày về Handlebars.js – một template engine không chứa logic (logic-less templating engine) mở rộng từ Mustache.js. Handlebars biên dịch các chuỗi mẫu HTML kết hợp với đối tượng dữ liệu ngữ cảnh (context) để tạo ra mã HTML hoàn chỉnh trả về cho trình duyệt.

Báo cáo mô tả chi tiết 3 thành phần chính của Handlebars:

  1. Biểu thức Handlebars (Expressions): Cú pháp biến đơn giản {{ content }} hoặc khối lặp {{#each}} ... {{/each}}.
  2. Dữ liệu ngữ cảnh (Context Data): Đối tượng JavaScript chứa thuộc tính chuỗi, số hoặc mảng các đối tượng truyền vào hàm biên dịch.
  3. Hàm biên dịch (Compile function): Phương thức Handlebars.compile nhận mẫu làm tham số, trả về hàm JavaScript thực thi dữ liệu để xuất chuỗi HTML.

Chương 4: Express.js và API

Chương 4 giới thiệu framework Express.js với các tính năng: thiết lập middleware xử lý request, định nghĩa bảng routing theo phương thức HTTP và render HTML. Các module middleware quan trọng gồm: body-parser (xử lý JSON/dữ liệu form), cookie-parser (phân tích cookie header), multer (xử lý multipart/form-data).

Chương trình bày việc xây dựng các điểm cuối RESTful API cho tệp dữ liệu người dùng (users.json), đồng thời hướng dẫn phương pháp kiểm thử API bằng Postman. Báo cáo phân tích cách viết kịch bản kiểm thử tự động bằng cú pháp pm.test() và pm.expect(), kiểm tra mã trạng thái HTTP 200 (pm.response.to.be.ok), kiểm tra tính hợp lệ của dữ liệu phản hồi JSON (pm.response.to.be.json), thực thi kiểm thử hàng loạt bằng Postman Collection Runner và tự động hóa qua dòng lệnh với Newman CLI (npm install -g newman).

Chương 5: MongoDB

Chương 5 giới thiệu về hệ quản trị cơ sở dữ liệu NoSQL MongoDB, viết bằng C++, vận hành trên mô hình phi quan hệ với hai khái niệm cốt lõi:

  • Collection: Tập hợp các Document, đóng vai trò tương đương bảng trong RDBMS nhưng không áp đặt ràng buộc quan hệ hay cấu trúc cột cố định.
  • Document: Đơn vị dữ liệu lưu trữ dưới dạng các cặp key-value tương tự JSON, sở hữu schema động cho phép các bản ghi trong cùng một collection có các trường dữ liệu và kiểu dữ liệu khác nhau.
  • MongoDB Compass: Công cụ giao diện đồ họa được sử dụng trong đề tài để kết nối, quản trị cơ sở dữ liệu cục bộ và thực hiện các thao tác thêm, đọc, cập nhật, xóa dữ liệu.

Chương 6: Xây dựng Website Demo

Chương 6 tổng kết quá trình xây dựng ứng dụng website tin tức minh họa. Chương này trình bày chi tiết danh sách Actor, sơ đồ và danh sách Use-case, nền tảng công nghệ áp dụng, cùng kết quả thực nghiệm với 9 giao diện màn hình:

  • Hình 7.1: Trang chủ hiển thị tin tức tổng hợp.
  • Hình 7.2 & Hình 7.3: Màn hình Đăng ký thành viên và Đăng nhập hệ thống.
  • Hình 7.4: Trang liên hệ phản hồi thông tin.
  • Hình 7.5 & Hình 7.6: Màn hình xem chi tiết nội dung bài viết và xem hồ sơ thành viên tác giả.
  • Hình 7.7: Bảng điều khiển quản trị viên (Admin) quản lý người dùng và bài viết.
  • Hình 7.8 & Hình 7.9: Giao diện quản lý danh sách bài viết và các tác vụ nghiệp vụ của thành viên.

Kết quả và đóng góp

Kết quả đạt được

  1. Nghiên cứu lý thuyết: Hoàn thành hệ thống hóa các kiến thức nền tảng về Node.js (V8 engine, non-blocking I/O, event-driven), cú pháp chuẩn ES6/ES7, các mô-đun quản lý tập tin fs, template engine Handlebars, framework Express và cơ sở dữ liệu NoSQL MongoDB.
  2. Triển khai ứng dụng thực nghiệm: Xây dựng thành công Website Tin Tức Demo chạy trên môi trường máy chủ Node.js và MongoDB, đáp ứng đầy đủ các chức năng cho khách vãng lai (xem tin nhanh, liên hệ), thành viên (đăng ký, đăng nhập, đăng và quản lý bài viết cá nhân) và quản trị viên (quản lý người dùng, bài viết).
  3. Quy trình kiểm thử: Xây dựng bộ kịch bản kiểm thử API người dùng bằng Postman PM API, chạy kiểm thử trực quan qua Postman Collection Runner và kiểm thử dòng lệnh với Newman.

Đóng góp của đề tài

  • Làm rõ sự khác biệt về mặt hiệu năng giữa cơ chế thực thi đồng bộ (blocking) và bất đồng bộ (non-blocking) qua thực nghiệm mã nguồn tập tin blocking-example.js và non-blocking-example.js.
  • Tổng hợp bảng so sánh các cờ xử lý đọc/ghi tập tin, các phương thức kiểm tra định dạng tập tin trong lớp fs.Stats, và tiêu chuẩn định tuyến RESTful API.
  • Đưa ra góc nhìn so sánh công nghệ giữa nền tảng JavaScript Fullstack (Node.js) với các mô hình server-side truyền thống (PHP, ASP.NET) về tốc độ thiết lập, khả năng mở rộng và sự đồng nhất ngôn ngữ.

Hạn chế và hướng nghiên cứu tiếp

Hạn chế

  • Hệ thống website tin tức mới dừng lại ở mức độ ứng dụng minh họa (demo), cơ sở dữ liệu mẫu ban đầu còn sử dụng tệp JSON cứng (users.json) trước khi kết nối MongoDB.
  • Các chức năng nâng cao về phân quyền chi tiết, bảo mật chuyên sâu và tối ưu hóa truy vấn khi lượng truy cập lớn chưa được triển khai đầy đủ trong phạm vi báo cáo thực tập.

Hướng nghiên cứu tiếp

  • Hoàn thiện và mở rộng các chức năng nghiệp vụ của website tin tức demo thành sản phẩm thương mại hoàn chỉnh.
  • Tích hợp thêm các framework frontend hiện đại (như Angular đã nêu trong định hướng nghiên cứu đề tài) nhằm xây dựng ứng dụng Single Page Application (SPA) hoàn chỉnh.
  • Nghiên cứu áp dụng các giải pháp cân bằng tải, bộ nhớ đệm (Redis) và các kỹ thuật tối ưu hóa bảo mật API trên nền tảng Node.js.

Giá trị tham khảo

Báo cáo thực tập tốt nghiệp có giá trị tham khảo hữu ích cho các nhóm đối tượng:

  • Sinh viên ngành Công nghệ Thông tin: Làm tài liệu hướng dẫn từng bước từ việc cài đặt môi trường Node.js, cấu hình npm, quản lý tập tin hệ thống đến xây dựng ứng dụng web cơ bản.
  • Người mới tiếp cận lập trình Web Fullstack JavaScript: Tham khảo cách thức kết hợp bộ công cụ Express.js, Handlebars.js, MongoDB và Postman để hiện thực hóa quy trình phát triển website từ backend, giao diện đến cơ sở dữ liệu và kiểm thử API.

Câu hỏi thường gặp

1. Tại sao Node.js được đánh giá là phù hợp cho việc phát triển ứng dụng web tốc độ cao và ứng dụng thời gian thực?

Theo tác giả, Node.js được xây dựng trên Chrome V8 JavaScript Runtime với phần Core viết bằng C++, cung cấp kiến trúc hướng sự kiện (event-driven) và mô hình non-blocking I/O API. Mọi hàm trong Node.js đều chạy bất đồng bộ và xử lý ở chế độ nền, giúp tối ưu hóa thông lượng dữ liệu, xử lý các tác vụ thời gian thực (realtime) nhanh chóng và dễ dàng mở rộng.

2. Sự khác biệt cốt lõi giữa hai hàm fs.readFileSync và fs.readFile trong báo cáo là gì?

Hàm fs.readFileSync là phương thức đọc tập tin đồng bộ (blocking), làm chặn luồng thực thi của chương trình cho đến khi đọc xong tập tin. Ngược lại, hàm fs.readFile là phương thức đọc bất đồng bộ (non-blocking), chương trình tiếp tục thực thi các dòng lệnh kế tiếp mà không phải đợi; khi quá trình đọc hoàn tất, Node.js sẽ tự động gọi hàm Callback được chỉ định.

3. Handlebars.js đóng vai trò gì và cơ chế hoạt động của nó như thế nào?

Handlebars.js là một template engine không chứa logic (logic-less). Trình biên dịch Handlebars nhận biểu thức mẫu HTML (chứa các thẻ {{ content }} hoặc {{#each}}) và biên dịch thành một hàm JavaScript. Hàm này nhận đối tượng dữ liệu ngữ cảnh (context) làm tham số và trả về chuỗi HTML hoàn chỉnh chứa dữ liệu đã được chèn vào để render ra trang web.

4. Báo cáo sử dụng công cụ gì để tự động hóa quá trình kiểm thử các điểm cuối RESTful API?

Báo cáo sử dụng Postman để viết kịch bản kiểm thử bằng JavaScript thông qua PM API (pm.test(), pm.expect()). Để chạy kiểm thử và xem kết quả theo thời gian thực, tác giả sử dụng Postman Collection Runner; để tự động hóa việc chạy kiểm thử trực tiếp từ giao diện dòng lệnh (CLI), tác giả cài đặt và sử dụng công cụ Newman (npm install -g newman).

5. Cấu trúc dữ liệu trong MongoDB khác với cơ sở dữ liệu quan hệ (RDBMS) như thế nào theo phân tích của đề tài?

Trong MongoDB, dữ liệu được tổ chức thành các Collection (tương đương bảng trong RDBMS) và Document (tương đương dòng/bản ghi). Khác với bảng MySQL có các cột (field) cố định và ràng buộc khóa ngoại, Collection trong MongoDB không áp đặt ràng buộc quan hệ; mỗi Document là một tập hợp cặp key-value có schema động, cho phép các Document trong cùng một Collection sở hữu các trường dữ liệu và cấu trúc khác nhau.


Kết luận

Báo cáo thực tập tốt nghiệp của sinh viên Đào Tùng Lâm và Lương Công Cường (ngành Công nghệ Thông tin, Trường Đại học Giao thông Vận tải TP. Hồ Chí Minh) đã hoàn thành việc khảo sát toàn diện nền tảng Node.js, framework Express.js, template engine Handlebars và cơ sở dữ liệu NoSQL MongoDB. Đề tài làm rõ các khái niệm kỹ thuật trọng tâm như kiến trúc non-blocking I/O, cơ chế Callback, chuẩn ECMAScript 2015, xử lý tập tin qua mô-đun fs và kiểm thử RESTful API bằng Postman/Newman. Kết quả thực nghiệm đã xây dựng thành công ứng dụng Website Tin Tức minh họa với đầy đủ các giao diện phân quyền cho khách vãng lai, thành viên và quản trị viên, cung cấp tư liệu tham khảo thực hành cho sinh viên phát triển ứng dụng web trên nền tảng JavaScript.