Bài cuối kì MCT

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 55

Bài cuối kì MCT-CN

Chapter IV: Sử dụng Git, Github

1. Git,Github là gì

Git

Git là một hệ thống quản lý phiên bản phân tán (DVCS - Distributed Version Control System) do Linus
Torvalds phát triển vào năm 2005. Công cụ này giúp các nhà phát triển phần mềm theo dõi và quản lý
sự thay đổi của mã nguồn theo thời gian. Với Git, nhiều người có thể làm việc trên cùng một dự án
mà không cần ở cùng một địa điểm, đồng thời đảm bảo mã nguồn được tổ chức và bảo mật. Git
được thiết kế để xử lý các dự án từ nhỏ đến lớn với hiệu suất cao.

Các Tính Năng Chính của Git:

 Quản lý phiên bản: Theo dõi và lưu trữ lịch sử của tất cả các thay đổi trong mã nguồn.

 Làm việc nhóm: Hỗ trợ làm việc nhóm, cho phép nhiều người đóng góp vào cùng một dự án

mà không gây xung đột.

 Nhánh (Branching) và Gộp (Merging): Cho phép các nhà phát triển tạo ra các nhánh riêng

để phát triển tính năng mới, sau đó có thể gộp nhánh đó vào nhánh chính một cách dễ dàng.

 Tái sử dụng mã nguồn: Dễ dàng tái sử dụng và tích hợp mã nguồn từ các dự án khác.

 Phục hồi: Khả năng phục hồi lại tình trạng mã nguồn ở các thời điểm trước đó khi cần thiết.

GitHub

GitHub là một dịch vụ lưu trữ dự án sử dụng Git trên web, ra mắt vào năm 2008. Nó cung cấp một
giao diện trực quan dựa trên web và các tính năng quản lý dự án để làm việc cùng nhau với mã
nguồn. GitHub là một trong những nền tảng phát triển phần mềm phổ biến nhất thế giới, được sử
dụng bởi cả cá nhân và tổ chức để lưu trữ và chia sẻ mã nguồn của họ.

Các Tính Năng Chính của GitHub:

 Lưu trữ dự án: Cung cấp kho lưu trữ Git trên web để lưu trữ dự án.
 Quản lý dự án: Tích hợp các công cụ quản lý dự án như bảng Kanban, theo dõi vấn đề (issue

tracking), và yêu cầu gộp mã (pull requests).

 Tính năng xã hội: Cho phép người dùng theo dõi các dự án và người dùng khác, tạo "star"

cho các dự án yêu thích, và "fork" các dự án để đóng góp hoặc tạo bản sao riêng.

 Tích hợp CI/CD: Hỗ trợ tích hợp liên tục và triển khai liên tục thông qua GitHub Actions.

 Wiki và trang web: Cho phép tạo wiki để tài liệu dự án và GitHub Pages để lưu trữ trang web

dự án.

2. Repository là gì?

Repository, thường được gọi là "repo" trong ngữ cảnh quản lý mã nguồn và đặc biệt là với Git, là

một kho lưu trữ chứa tất cả các tệp liên quan đến một dự án cụ thể cùng với lịch sử của mọi thay đổi
đã được thực hiện. Repositories cho phép theo dõi sự tiến triển của dự án theo thời gian và cung cấp
khả năng quay lại các phiên bản trước nếu cần thiết. Chúng cũng hỗ trợ cộng tác, giúp nhiều người

có thể cùng làm việc trên một dự án mà không gây ra xung đột giữa các thay đổi của họ. Repository

có các tính năng và mục đích chính bao gồm lưu trữ lịch sử thay đổi đầy đủ của tất cả các tệp, cho
phép xem lại và phục hồi các phiên bản trước; hỗ trợ tạo nhánh (branching) để phát triển tính năng
mới, sửa lỗi hoặc thử nghiệm mà không ảnh hưởng đến nhánh chính hoặc các nhánh khác; và cho
phép gộp (merging) các thay đổi từ một nhánh này sang nhánh khác hoặc vào nhánh chính. Trong

các nền tảng như GitHub, Bitbucket hoặc GitLab, pull requests cho phép người dùng đề xuất thay đổi

và yêu cầu chủ sở hữu repo xem xét và hợp nhất chúng. Repositories cũng hỗ trợ cộng tác, cho phép

nhiều người dùng đóng góp mã nguồn và quản lý các thay đổi một cách có tổ chức. Repositories có

thể là local hoặc remote: Local repository là bản sao của repo nằm trên máy tính cá nhân của người

dùng, cho phép họ thực hiện thay đổi, commit, tạo nhánh và các hoạt động Git khác mà không cần

kết nối internet; trong khi remote repository là bản sao của dự án được lưu trữ trên máy chủ từ xa

như GitHub, GitLab hoặc Bitbucket, cho phép chia sẻ và cộng tác giữa các nhà phát triển.

3. Một số lệnh git cơ bản

Dưới đây là một số lệnh Git cơ bản mà bạn sẽ thường xuyên sử dụng:

- git init
Khởi tạo một kho lưu trữ Git mới trong thư mục hiện tại.

- git clone [url]

Sao chép một kho lưu trữ Git từ một URL nhất định.

- git add [file]

Thêm một hoặc nhiều file vào khu vực staging (sẵn sàng để commit).

- git commit -m "[commit message]"

Commit các file đã được thêm vào khu vực staging với một thông điệp commit.

- git status

Kiểm tra trạng thái của kho lưu trữ, hiển thị các file đã thay đổi mà chưa được commit hoặc thêm vào khu vực
staging.

- git push [remote] [branch]

Đẩy các commit từ kho lưu trữ cục bộ lên kho lưu trữ từ xa (thường là GitHub, GitLab, v.v.).

- git diff
Hiển thị sự khác biệt giữa khu vực làm việc và khu vực staging

4. Ứng dụng Git với VSCode

- Vào app VSCode sử nhấp vào biểu tượng bên trái màn hình

- Tiếp đến xuất hiện giao diện như Hình 4.1 ở giao diện trên có các tính năng phân tích ở bước 3

Ta phân tích các tính năng như sau :

 Màu Đỏ (M): Biểu tượng này cho thấy file new.html đã được thay đổi (modified) trong khu vực làm
việc và những thay đổi đó chưa được thêm vào khu vực staging.
 Dấu(+): Cạnh file styles.css có một biểu tượng "+"(tương đương với lệnh git add để thêm từ working
derectory -> staging)
 Biểu tượng Kiểm tra (✓): Nút này sẽ commit tất cả các file đã được staged (thêm vào khu vực staging).
 Biểu tượng Hồi tố (↩): Nút này khi được nhấp chuột có thể được sử dụng để unstage (bỏ staging) các
file đã được thêm vào khu vực staging.
 Biểu tượng (U):biểu tượng U này có nghĩa là file này vẫn đang ở chế độ untrack (nghĩa là file ở chế độ
chưa được git theo dõi nên khi ta commit nó chỉ commit file ở chế độ modified)
 Tên nhánh (demo-git): Đây là nhánh hiện tại mà người dùng đang làm việc trên đó.

5. Clone dự án lên Github

Để sao chép (clone) một dự án từ GitHub về máy tính cục bộ của bạn, bạn cần thực hiện các bước chi
tiết sau:

Bước 1: Tìm Repository trên GitHub

Truy cập trang GitHub của dự án: Mở trình duyệt web và truy cập vào trang GitHub

(https://github.com). Sau đó, tìm kiếm repository của dự án mà bạn muốn sao chép. Bạn có thể dùng thanh
tìm kiếm ở đầu trang để nhập tên dự án hoặc duyệt qua các repository mà bạn đã đánh dấu sao (star) hoặc
forked.
Tìm nút "Code": Khi đã ở trang repository của dự án, bạn sẽ thấy một nút "Code" ở phần trên của trang
repository, gần các nút như "Issues", "Pull requests", và "Actions".

Nhấp vào nút "Code": Nhấp vào nút này để hiển thị các tùy chọn clone. Một menu sẽ xuất hiện, cung cấp
các tùy chọn để sao chép repository qua HTTPS, SSH, hoặc GitHub CLI.

Bước 2: Sao chép URL Clone

Chọn phương thức clone: Bạn có thể chọn clone qua HTTPS, SSH, hoặc GitHub CLI. Đối với người mới
bắt đầu, HTTPS là lựa chọn đơn giản nhất vì không yêu cầu cấu hình SSH keys.

Sao chép URL: Sau khi chọn phương thức clone (thường mặc định là HTTPS), bạn sẽ thấy một URL xuất
hiện. Nhấp vào biểu tượng copy (hình biểu tượng clipboard) để sao chép URL này vào clipboard của bạn. Ví
dụ, URL có thể trông giống như thế này: https://github.com/username/repository.git .

Bước 3: Mở Terminal hoặc Command Prompt

Mở terminal hoặc command prompt:

Trên macOS: Mở ứng dụng Terminal.

Trên Linux: Mở terminal từ menu hệ thống hoặc sử dụng phím tắt.

Trên Windows: Mở Command Prompt hoặc PowerShell. Bạn có thể tìm kiếm "cmd" hoặc "PowerShell" trong
menu Start và mở chương trình tương ứng.

Chuyển đến thư mục mong muốn: Sử dụng lệnh cd (change directory) để chuyển đến thư mục nơi bạn
muốn lưu trữ dự án. Ví dụ:

Thay thế path/to/your/directory bằng đường dẫn thực tế đến thư mục mà bạn muốn lưu trữ repository.

Bước 4: Nhập Lệnh Clone

Sử dụng lệnh clone: Trong terminal hoặc command prompt, nhập lệnh sau, thay thế [URL] bằng URL bạn đã
sao chép từ GitHub:

Ví dụ, nếu URL của repository là https://github.com/username/repository.git , bạn sẽ nhập: username/repository.git

Chờ quá trình clone hoàn thành: Git sẽ sao chép toàn bộ repository về máy tính của bạn vào thư mục hiện
tại. Quá trình này có thể mất vài phút tùy thuộc vào kích thước của repository và tốc độ kết nối Internet của bạn.

Bước 5: Xác minh Clone


Xác nhận: Khi quá trình clone hoàn thành, bạn sẽ thấy một thư mục mới có tên là tên repository vừa sao chép.
Bạn có thể vào thư mục này bằng lệnh:

Thay thế repository bằng tên thực tế của repository bạn vừa sao chép.

Kiểm tra nội dung: Bên trong thư mục này, bạn sẽ thấy toàn bộ các tệp và thư mục của dự án, cùng với lịch
sử thay đổi đầy đủ mà Git đã lưu trữ.

Bước 6: Cập nhật và Làm việc với Repository

Lấy các cập nhật mới nhất: Sau khi clone, bạn có thể đồng bộ hóa repository cục bộ của mình với
repository gốc trên GitHub bằng lệnh git pull để lấy về các thay đổi mới nhất.

Thay thế main bằng nhánh chính của repository nếu cần (thường là main hoặc master).

Thực hiện các thay đổi: Bạn có thể chỉnh sửa mã nguồn, thêm tệp mới, và sử dụng các lệnh Git khác như git
add, git commit, và git push để đẩy các thay đổi của bạn trở lại GitHub nếu bạn có quyền.

6. Làm việc với Branch

- Trong GitHub, một branch hoặc nhánh, giống như trong Git, là một phiên bản độc lập của một kho lưu trữ
(repository) mà từ đó bạn có thể phát triển dự án của mình theo hướng khác nhau. Nhánh cho phép bạn và
nhóm của mình làm việc trên các tính năng, sửa lỗi, hoặc thử nghiệm mới mà không ảnh hưởng đến nhánh
chính hoặc nhau.
- Trong Git, việc làm việc với nhánh (branch) được hỗ trợ bởi một số lệnh cơ bản. Dưới đây là các lệnh Git
chính liên quan đến việc quản lý nhánh:

- git branch -a: Liệt kê tất cả các nhánh, bao gồm cả những nhánh ở remote.

- git branch <branch_name>: Tạo một nhánh mới với tên <branch_name>.
- git checkout -b <branch_name>: Tạo và chuyển sang nhánh mới ngay lập tức.

- git checkout <branch_name>: Chuyển đổi từ nhánh hiện tại sang nhánh có tên <branch_name>.

- git branch -d <branch_name>: Xóa nhánh cục bộ <branch_name>. Git sẽ cảnh báo nếu nhánh chưa được
hợp nhất.

Đẩy và Theo Dõi Nhánh Trên Remote

Khi đẩy một nhánh mới lên remote, bạn có thể muốn thiết lập một liên kết tracking giữa nhánh cục bộ và nhánh
từ xa, để sau này, bạn chỉ cần sử dụng git push hoặc git pull mà không cần chỉ định tên nhánh hoặc remote. Bạn
có thể làm điều này bằng cách thêm cờ -u vào lệnh git push:

Sau khi thực hiện


lệnh này, mọi lần sau khi bạn muốn đẩy các thay đổi từ nhánh này lên remote, bạn chỉ cần sử dụng git push, và
Git sẽ tự động biết bạn muốn đẩy lên nhánh tương ứng trên origin.

7. Tìm hiểu lệnh Git log


- Lệnh git log trong Git được sử dụng để hiển thị một danh sách của các commit gần đây trong repository
hiện tại theo thứ tự thời gian ngược (từ mới nhất đến cũ nhất). Mỗi commit sẽ bao gồm ID commit
(SHA), tác giả, ngày commit, và thông điệp commit.
- Cách Sử Dụng Cơ Bản

Đơn giản chỉ cần chạy git log sẽ hiển thị danh sách các commit với thông tin đầy đủ:

Tùy Chọn Phổ Biến

 --oneline: Hiển thị mỗi commit trên một dòng, bao gồm ID commit ngắn và thông điệp commit.
 --all: Hiển thị tất cả các commit từ tất cả các nhánh.
 Ngoài ra ở danh sách trong –oneline nếu ta muốn truy cập đến chỗ dự án mà ta commit ở quá khứ ta
dùng lệnh “git checkout ‘id’ “ để tới nhánh trong quá khứ lúc này code nó sẽ chuyển tới tại thời điểm
trong quá khứ

8. Tìm hiểu lệnh git merge

Lệnh git merge trong Git được sử dụng để hợp nhất các thay đổi từ một nhánh vào nhánh hiện tại hoặc một
nhánh khác. Lệnh này cho phép bạn tích hợp công việc đã hoàn thành từ nhánh này sang nhánh khác, thường
được sử dụng để hợp nhất các tính năng hoặc sửa lỗi đã được phát triển trên các nhánh phụ vào nhánh chính
(main hoặc master) của dự án.

 Cách Sử Dụng Cơ Bản

Để sử dụng git merge, bạn cần chuyển sang nhánh mà bạn muốn hợp nhất các thay đổi vào (nhánh đích), sau đó
sử dụng lệnh git merge kèm theo tên của nhánh mà bạn muốn hợp nhất từ (nhánh nguồn).

Lưu Ý

 Thực hiện merge trong một repository sạch (không có thay đổi chưa commit) để tránh mất mát dữ liệu.
 Kiểm tra và giải quyết mọi xung đột trước khi commit merge.
 Trong nhiều trường hợp, việc hợp nhất có thể được thực hiện thông qua Pull Request trên các dịch vụ
như GitHub, GitLab, v.v., cho phép review và thảo luận trước khi hợp nhất.
 git merge là một công cụ mạnh mẽ trong Git, giúp tích hợp công việc từ các nhánh phát triển độc lập vào
nhánh chính, hỗ trợ quy trình phát triển linh hoạt và hiệu quả.
9. Quy trình làm việc với git

Chaper V: .Kiến thức cơ bản về Nodejs

1. Nodejs là gì

Node.js là một nền tảng phần mềm mã nguồn mở, chạy trên môi trường JavaScript V8 Engine của Google, cho
phép bạn chạy mã JavaScript trên máy chủ. Nó được thiết kế để xây dựng các ứng dụng mạng có khả năng mở
rộng cao. Với Node.js, bạn có thể viết cả mã cho máy chủ và cho ứng dụng web hoặc ứng dụng di động mà
không cần phải dùng đến một ngôn ngữ lập trình khác cho phía máy chủ.

Các đặc điểm chính của Node.js bao gồm:

 Khả năng xử lý đồng thời: Node.js sử dụng mô hình non-blocking I/O và asynchronous, cho phép xử
lý nhiều kết nối cùng một lúc mà không làm chậm tốc độ của máy chủ.
 Kiến trúc sự kiện: Node.js hoạt động trên kiến trúc hướng sự kiện, giúp phát triển các ứng dụng có khả
năng mở rộng và hiệu suất cao.
 Cộng đồng lớn: Node.js có một cộng đồng lập trình viên rất lớn và đang phát triển nhanh chóng, cung
cấp một kho lưu trữ rộng lớn các module và thư viện thông qua npm (Node Package Manager), giúp
tăng tốc quá trình phát triển ứng dụng.
 Đa nền tảng: Node.js có thể chạy trên các hệ điều hành khác nhau như Windows, Linux, Unix, Mac OS
X, v.v.

Node.js thích hợp cho việc phát triển một loạt các ứng dụng như ứng dụng web đơn trang (SPA), ứng dụng
trang web động, ứng dụng API, ứng dụng real-time như chat, game online, và nhiều loại ứng dụng khác nữa.

2. Cài đặt Nodejs bằng NVM

Node Version Manager (NVM) là một công cụ cho phép bạn quản lý nhiều phiên bản Node.js trên cùng một
máy. Việc sử dụng NVM giúp bạn dễ dàng chuyển đổi giữa các phiên bản Node.js khác nhau, từ đó có thể thử
nghiệm hoặc chạy các dự án yêu cầu các phiên bản Node.js cụ thể mà không ảnh hưởng đến các dự án khác.
Dưới đây là các bước cơ bản để cài đặt Node.js bằng NVM:

Cài đặt NVM:

 Trên Windows:

Có một phiên bản tương tự của NVM dành cho Windows là nvm-windows. Để cài đặt:

- Truy cập trang GitHub của nvm-windows (https://github.com/coreybutler/nvm-windows/releases).


- Tải xuống và chạy bộ cài đặt nvm-setup.zip.
- Làm theo hướng dẫn trên màn hình để hoàn tất cài đặt.
- Kiểm tra việc cài đặt NVM bằng cách chạy trên Command Prompt/PowerShell:

 Cài đặt Node.js bằng NVM:


- B1:Sau khi đã cài đặt NVM, bạn có thể cài đặt Node.js bằng cách:

Mở terminal (Linux/macOS) hoặc Command Prompt/PowerShell (Windows).

- B2:Sử dụng lệnh nvm install để cài đặt phiên bản Node.js mong muốn. Ví dụ, để cài đặt phiên bản mới
nhất của Node.js, bạn chạy:

Để cài đặt một phiên bản cụ thể, thay node bằng số phiên bản đó, ví dụ:

Sau khi cài đặt, bạn có thể chọn phiên bản Node.js sử dụng mặc định bằng lệnh:

hoặc chọn phiên bản cụ thể:

Kiểm tra phiên bản Node.js đang sử dụng:


Với NVM, bạn cũng có thể xem danh sách các phiên bản Node.js đã cài đặt và quản lý chúng một cách linh
hoạt.

3. ES Module và common Module

Trong JavaScript, có hai hệ thống module chính được sử dụng để tổ chức và quản lý việc chia sẻ mã giữa các
tệp khác nhau: ES Modules (ESM) và CommonJS Modules (CJS).

ES Modules (ESM)

 ES Modules là hệ thống module tiêu chuẩn trong JavaScript, được giới thiệu trong ECMAScript 2015
(hay còn gọi là ES6). ESM được thiết kế để hỗ trợ cả trong môi trường trình duyệt và máy chủ (ví dụ,
Node.js), cung cấp một cách thức đồng nhất để làm việc với module trong JavaScript.

Cú pháp:

 Import: import { moduleName } from 'moduleLocation';


 Export: export const functionName = () => {}; hoặc export default functionName;
Đặc điểm:

 Hỗ trợ import và export tĩnh, cho phép các công cụ như bundlers và minifiers phân tích cú pháp trước
khi thực thi mã.
 Có thể được tải bất đồng bộ trong môi trường trình duyệt, tối ưu hóa việc tải ứng dụng.
 Được thiết kế để làm việc với các tính năng JavaScript hiện đại và tối ưu hóa cho việc sử dụng trong các
ứng dụng lớn.

CommonJS Modules (CJS)

 CommonJS Modules là hệ thống module được sử dụng chủ yếu trong Node.js trước khi ES Modules
được hỗ trợ rộng rãi. CJS được thiết kế cho môi trường máy chủ, cho phép dễ dàng tạo ra các ứng dụng
và thư viện có cấu trúc.

Cú pháp:

 Import: const moduleName = require('moduleLocation');


 Export: module.exports = functionName; hoặc exports.functionName = functionName;

Đặc điểm:

 Hỗ trợ import và export động, cho phép tải module dựa trên điều kiện thực thi.
 Được tối ưu hóa cho việc tải đồng bộ, phù hợp với môi trường máy chủ.
 Phổ biến trong cộng đồng Node.js trước khi ES Modules trở nên hỗ trợ rộng rãi.

Sự Khác Biệt Chính

 Cú pháp: ESM sử dụng từ khóa import và export cho việc nhập và xuất module, trong khi CJS sử dụng
require để nhập và module.exports hoặc exports để xuất.
 Thời điểm phân giải: ESM hỗ trợ việc nhập và xuất tĩnh, cho phép phân giải module tại thời điểm phân
tích cú pháp, còn CJS thực hiện việc này tại thời điểm thực thi.
 Môi trường: ESM được thiết kế để hoạt động trên cả trình duyệt và máy chủ, trong khi CJS ban đầu
được phát triển cho Node.js.

Với sự phát triển của JavaScript và hỗ trợ ngày càng tăng từ các môi trường thực thi, ES Modules đang dần trở
thành chuẩn mực, nhưng CommonJS vẫn còn được sử dụng rộng rãi, đặc biệt là trong các dự án và thư viện
Node.js đã tồn tại.
Chapter 6: NPM

1. NPM là gì

NPM (Node Package Manager) là một hệ thống quản lý gói (package manager) cho JavaScript, cho phép người
dùng tải xuống và cài đặt các thư viện và công cụ JavaScript từ kho lưu trữ mã nguồn mở trực tuyến (npm
registry). NPM được sử dụng rộng rãi trong cộng đồng phát triển JavaScript, đặc biệt là trong phát triển ứng
dụng Node.js và phát triển front-end.

Tính năng chính của NPM:

 Quản lý dự án: NPM giúp quản lý các phụ thuộc của dự án thông qua tệp package.json, nơi liệt kê tất cả
các gói cần thiết cho một dự án cụ thể.
 Chia sẻ và tái sử dụng mã: Người dùng có thể chia sẻ mã của mình dưới dạng các gói NPM, giúp người
khác có thể tái sử dụng mã dễ dàng.
 Phiên bản gói: NPM hỗ trợ quản lý phiên bản gói, giúp dễ dàng nâng cấp hoặc quay về phiên bản trước
của một gói mà không ảnh hưởng đến hệ thống.
 Script: NPM cho phép định nghĩa các script trong package.json để tự động hóa các tác vụ phát triển như
biên dịch, thử nghiệm và triển khai.
 NPM CLI: Công cụ dòng lệnh (Command Line Interface) của NPM giúp thực hiện các tác vụ như cài
đặt và cập nhật gói, quản lý phiên bản gói và chạy script.

Cách sử dụng NPM:

Bước 1: Khởi tạo một dự án mới

Đầu tiên, bạn cần mở terminal hoặc command prompt, tạo một thư mục mới cho dự án của bạn, và khởi tạo một
dự án mới với NPM:

Lệnh npm init -y sẽ tự động tạo một tệp package.json với các giá trị mặc định, không cần bạn phải trả lời từng
câu hỏi cấu hình.

Bước 2: Thêm gói vào dự án


Giả sử bạn muốn sử dụng thư viện lodash, một thư viện JavaScript cung cấp nhiều chức năng hữu ích để làm
việc với mảng, số, đối tượng, chuỗi, v.v. Bạn có thể thêm lodash vào dự án của mình như sau:

Lệnh trên sẽ
cài đặt lodash và thêm nó vào phần dependencies trong tệp package.json.

Bước 3: Sử dụng gói trong mã của bạn

Tạo một tệp mới,:

Bước 4: Chạy dự án

Cuối cùng, bạn có thể chạy dự án của mình bằng cách sử dụng Node.js:

Kết quả trên terminal sẽ hiển thị mảng gốc và mảng đã được đảo ngược sử dụng hàm reverse từ lodash.

B5: để xóa thư viện đã cài thông qua npm ta thực hiện

Để gỡ bỏ một thư viện (gói) đã được cài đặt trong dự án của bạn thông qua NPM, bạn sử dụng lệnh npm
uninstall. Dưới đây là cách thực hiện:

Cú pháp cơ bản

Trong đó <package-name> là tên của gói bạn muốn gỡ bỏ khỏi dự án.

Ví dụ:

NPM không chỉ là một công cụ quan trọng cho việc quản lý các phụ thuộc và gói trong phát triển Node.js mà
còn là một phần không thể thiếu trong hệ sinh thái phát triển front-end hiện đại, hỗ trợ các công cụ như
Webpack, Babel, và các thư viện như React, Vue, và Angular.
2. Cài đặt package global và local

Cài Đặt Global

Cài đặt nodemon toàn cục cho phép bạn sử dụng nodemon từ bất kỳ đâu trên hệ thống của mình, không giới hạn
trong một dự án cụ thể. Điều này hữu ích khi bạn muốn có nodemon sẵn có như một công cụ phát triển cho
nhiều dự án khác nhau mà không cần cài đặt lại nó cho mỗi dự án.

Lưu ý để sử dụng nodemon :

B1:Cách thay đổi Execution Policy:

 Mở PowerShell với quyền Administrator:


 Nhấn phím Windows, gõ "PowerShell".
 Khi thấy PowerShell xuất hiện trong kết quả tìm kiếm, nhấp chuột phải lên nó và chọn "Run as
administrator".

B2:Thay đổi Execution Policy:

Trong cửa sổ PowerShell, chạy lệnh sau để cho phép thực thi script:

PowerShell sẽ yêu cầu bạn xác nhận thay đổi. Nhấn "Y" hoặc "A" (Yes/All) để tiếp tục.

Ví dụ sử dụng: Sau khi cài đặt, bạn có thể chạy nodemon với một tệp JavaScript cụ thể. Giả sử bạn có một tệp
server.js, bạn có thể chạy:

Nodemon sẽ theo dõi bất kỳ thay đổi nào trong tệp server.js và tự động khởi động lại máy chủ mỗi khi có thay
đổi.
Cài Đặt Local

Cài đặt nodemon một cách cục bộ trong một dự án cụ thể hữu ích khi bạn muốn đảm bảo rằng mọi người làm
việc trong dự án đều sử dụng cùng một phiên bản của nodemon, đồng thời tránh việc "ô nhiễm" môi trường toàn
cục với quá nhiều gói không cần thiết.

Lưu ý rằng chúng tôi sử dụng --save-dev để chỉ định rằng nodemon là một phụ thuộc phát triển, không cần thiết
cho môi trường sản xuất.

Ví dụ sử dụng: Bạn có thể thêm một script trong package.json để chạy nodemon mà không cần phải cài đặt
toàn cục:

Sau đó, bạn có


thể chạy nodemon thông qua npm bằng cách sử dụng:

Nhược điểm:

Global:

 Phiên bản: Các dự án khác nhau có thể yêu cầu các phiên bản nodemon khác nhau, dẫn đến xung đột.
 Ô nhiễm môi trường: Cài đặt quá nhiều gói toàn cục có thể làm "ô nhiễm" môi trường của bạn, khiến
việc quản lý phiên bản trở nên khó khăn.

Local:

 Không gian lưu trữ: Mỗi dự án cần một bản sao của nodemon, dẫn đến việc sử dụng nhiều không gian
lưu trữ hơn.
 Tính linh hoạt: Bạn không thể chạy nodemon từ dòng lệnh mà không định cấu hình script trong
package.json hoặc cài đặt nó toàn cục.
Tùy vào nhu cầu cụ thể của dự án và môi trường phát triển, bạn có thể chọn cài đặt nodemon một cách toàn cục
hoặc cục bộ.

3. Cách cập nhật một hoặc nhiều package trong dự án nodejs

- Cách đánh dấu phiên phản của thư viện

Dưới đây là cách sử dụng các ký hiệu phiên bản:

Semantic Versioning

Một số phiên bản thông thường trong package.json có dạng major.minor.patch, ví dụ 1.4.2, nơi mà:

 major là phiên bản chính, thay đổi khi có các cập nhật không tương thích ngược.
 minor là phiên bản phụ, thay đổi khi bạn thêm chức năng tương thích ngược với phiên bản cũ.
 patch là sửa lỗi, thay đổi khi bạn làm sửa lỗi tương thích ngược.

Ký Hiệu Phiên Bản Trong package.json

 ^ : Cho phép cập nhật phiên bản minor và patch. Ví dụ: ^1.4.2 có nghĩa là chấp nhận bất kỳ phiên bản nào từ
1.4.2 đến <2.0.0.
 ~ : Chỉ cho phép cập nhật phiên bản patch trong phạm vi minor hiện tại. Ví dụ: ~1.4.2 có nghĩa là chấp nhận
các phiên bản từ 1.4.2 đến <1.5.0.
 >: Chấp nhận bất kỳ phiên bản nào lớn hơn phiên bản định rõ. Ví dụ: >1.4.2 có nghĩa là bất kỳ phiên bản
nào lớn hơn 1.4.2.
 >= : Tương tự như > nhưng bao gồm cả phiên bản được định rõ. Ví dụ: >=1.4.2 có nghĩa là từ 1.4.2 trở lên.
 < và <= : Tương tự như > và >= nhưng cho phiên bản nhỏ hơn.
 = : Chỉ định cụ thể một phiên bản.

Không có ký hiệu: Định rõ cụ thể một phiên bản, giống như sử dụng =.

Ví dụ

Nếu bạn muốn cập nhật gói express đến phiên bản minor mới nhất, bạn có thể đặt phiên bản trong package.json

Sau khi cập nhật package.json, chạy lệnh sau để cài đặt các phiên bản mới nhất được chấp nhận:
Nếu bạn muốn cập nhật tất cả các gói cùng một lúc đến phiên bản mới nhất có thể (trong phạm vi đã định trong
package.json), chỉ cần chạy:

Để cập nhật một gói đến phiên bản major mới nhất (có thể có sự thay đổi không tương thích), bạn sẽ cần phải
thay đổi phiên bản trong package.json hoặc sử dụng công cụ như npm-check-updates để cập nhật package.json
cho bạn.

b)update package trong dự án

Cập nhật một gói cụ thể

 Nếu bạn muốn cập nhật một gói cụ thể, chẳng hạn như express, hãy mở terminal hoặc command prompt
và thực hiện các bước sau:
 Điều hướng đến thư mục gốc của dự án Node.js của bạn, nơi tệp package.json của bạn nằm.
 Chạy lệnh sau để cập nhật gói express đến phiên bản mới nhất được phép theo khai báo trong
package.json của bạn:

Cập nhật tất cả các gói

 Nếu bạn muốn cập nhật tất cả các gói trong dự án của bạn đến phiên bản mới nhất được phép theo khai
báo trong package.json:
 Mở terminal hoặc command prompt.
 Điều hướng đến thư mục gốc của dự án của bạn.

Chạy lệnh sau:

Kiểm tra các gói có thể cập nhật

 Để xem có bất kỳ gói nào có thể được cập nhật hay không:
 Mở terminal hoặc command prompt.
 Điều hướng đến thư mục gốc của dự án của bạn.
Chạy lệnh sau:

Lệnh này sẽ hiển thị một danh sách các gói cùng với phiên bản hiện tại, phiên bản mong muốn (được định nghĩa
trong package-lock.json), và phiên bản mới nhất.

Sử dụng npm-check-updates

Bạn cũng có thể sử dụng công cụ npm-check-updates để cập nhật package.json cho tất cả các gói mới nhất bất
chấp các giới hạn về phiên bản trong package.json:

Cài đặt npm-check-updates toàn cục (nếu bạn chưa cài đặt):

Chạy npm-check-updates để kiểm tra các phiên bản mới nhất của các gói:

Cập nhật package.json để sử dụng các phiên bản mới nhất:

Cài đặt các gói với các phiên bản đã cập nhật trong package.json:

Nhớ rằng, việc cập nhật các gói có thể phá vỡ tính tương thích của dự án, vì vậy bạn nên luôn chạy các bài kiểm
tra của mình để đảm bảo rằng tất cả mọi thứ vẫn hoạt động sau khi cập nhật. Đối với các thay đổi lớn hoặc các
bản cập nhật lớn, bạn nên thực hiện các bước này trên một nhánh phát triển và không phải trên nhánh sản xuất
chính cho đến khi bạn đã xác nhận rằng mọi thứ đều ổn.

4. NPX là gì
npx là một công cụ dòng lệnh đi kèm với npm (Node Package Manager) từ phiên bản 5.2 trở lên. npx được thiết
kế để cải thiện trải nghiệm sử dụng các gói (packages) mà không cần phải cài đặt chúng một cách toàn cục
(global).

Đây là những gì npx có thể làm:

 Chạy Gói Mà Không Cần Cài Đặt: npx cho phép bạn chạy các gói npm mà không cần cài đặt chúng vào
hệ thống của mình. Điều này hữu ích khi bạn muốn thử nghiệm một công cụ mà không muốn cài đặt nó
một cách toàn cục.
 Chạy Gói Được Cài Đặt Cục Bộ: Nếu một gói đã được cài đặt một cách cục bộ trong một dự án, npx
giúp bạn chạy gói đó mà không cần phải điều hướng đến thư mục node_modules/.bin.
 Tránh Xung Đột Phiên Bản: Khi bạn cần sử dụng các phiên bản khác nhau của cùng một gói cho các dự
án khác nhau, npx sẽ giúp bạn chạy đúng phiên bản mà không gây xung đột.
 Thực Thi Gói Một Lần: Đôi khi bạn chỉ cần chạy một gói một lần mà không cần giữ nó trên máy của
bạn, npx là lựa chọn hoàn hảo trong trường hợp này.
 Chạy Các Gói Không Cần Ghi Rõ Phiên Bản: npx sẽ tự động tìm phiên bản mới nhất của gói đó và chạy
nó, giúp quá trình thực thi trở nên nhanh chóng và hiệu quả.

Ví dụ, để chạy create-react-app mà không cần cài đặt nó toàn cục, bạn có thể sử dụng lệnh:

Lệnh trên sẽ tải và thực thi create-react-app để tạo một ứng dụng React mới trong thư mục my-app.

Chapter 7: .Tạo server với Nodejs

1. Tạo server đầu tiên với Nodejs

- Viết đoạn code như hình dưới đây trong file index.ts trong dự án có sẵn
- Sau đó nhán ctrl + save thì nó sẽ tự động chạy trên terminal

- Để kiểm tra kĩ hơn ta tải posman về và kiểm tra , sau khi tải xong ta sẽ setup như hình dưới đây .
- Ta tạo thư mục tên là Node_js , sau đó tạo thêm một file nằm trong đó và gửi địa chỉ url ở phần get
2. Fix lỗi xung đột PORT

Khi bạn gặp lỗi xung đột cổng (PORT) trong một ứng dụng Node.js, điều này thường có nghĩa là cổng bạn đang
cố gắng sử dụng cho ứng dụng của mình đã được một tiến trình khác sử dụng. Để giải quyết vấn đề này, bạn có
thể thử một trong các phương pháp sau:

Thay đổi Cổng Trong Ứng Dụng Node.js

Thay đổi cổng mà ứng dụng Node.js của bạn đang lắng nghe. Bạn có thể làm điều này bằng cách tìm dòng code
trong ứng dụng của bạn mà đặt cổng và thay đổi giá trị của nó. Ví dụ:

Tìm và Dừng Tiến Trình Đang Sử Dụng Cổng (Chỉ Windows)

Nếu bạn muốn giữ nguyên cổng nhưng tiến trình khác đang sử dụng cổng đó, bạn có thể tìm và dừng tiến trình
đó.

 Tìm tiến trình sử dụng cổng (ví dụ, cổng 3000):

Bạn sẽ thấy một số kết quả hiển thị thông tin tiến trình, bao gồm PID (ID của tiến trình). Ghi lại PID của tiến
trình đang sử dụng cổng đó.

 Dừng tiến trình bằng PID:


3. Tạo server bằng thư viện Express.js

- Express là gì?

Express là một framework cho Node.js, được thiết kế để xây dựng ứng dụng web và API một cách nhanh chóng
và dễ dàng. Nó cung cấp một lớp trừu tượng cao hơn so với Node.js thông thường, giúp quản lý routes, yêu cầu,
và views một cách hiệu quả. Express tối giản hóa quá trình phát triển ứng dụng web bằng cách cung cấp một
API dễ sử dụng cho việc xây dựng server và xử lý các yêu cầu HTTP.

- Cách cài đặt module Express

Để sử dụng Express, bạn cần cài đặt module thông qua npm (Node Package Manager). Dưới đây là cách cài đặt
Express vào dự án Node.js của bạn:

 Mở terminal hoặc command prompt.


 Điều hướng đến thư mục gốc của dự án Node.js của bạn. Nếu bạn chưa có dự án, bạn có thể tạo một dự
án mới bằng cách sử dụng npm init và theo dõi các bước hướng dẫn:

 Cài đặt Express vào dự án của bạn bằng cách chạy lệnh sau trong terminal:

Lệnh này sẽ thêm Express vào danh sách các phụ thuộc trong file package.json của bạn.

- Tạo một ứng dụng Express đơn giản

Sau khi đã cài đặt Express, bạn có thể tạo một file, ví dụ app.js, và sử dụng code sau để khởi tạo một ứng dụng
Express cơ bản:
Đoạn mã trên tạo một server HTTP sẵn sàng lắng nghe các yêu cầu đến root URL ('/') và trả lời với "Hello
World!". Bạn có thể chạy ứng dụng này bằng cách mở terminal, điều hướng đến thư mục chứa app.js và chạy
lệnh:

Sau khi chạy,


bạn sẽ thấy thông báo "Server đang chạy trên cổng 3000" xuất hiện trên terminal. Bạn có thể truy cập ứng dụng
bằng cách mở trình duyệt web và điều hướng đến http://localhost:3000.

- Thực hiện chạy trên nodemon

Bước 1: Cài Đặt Nodemon

 Bạn có thể cài đặt nodemon làm một phụ thuộc phát triển trong dự án của mình hoặc cài đặt nó toàn cục
trên máy tính của bạn.
 Cài đặt cục bộ trong dự án của bạn (khuyến khích):
 Hoặc cài đặt toàn cục trên máy của bạn:

Bước 2: Chạy Ứng Dụng với Nodemon

 Nếu bạn đã cài đặt nodemon cục bộ, bạn có thể chạy nó thông qua npx (không cần cài đặt toàn cục):

Trong đó app.js là tên tệp chính của ứng dụng Node.js của bạn.
 Nếu bạn đã cài đặt nodemon toàn cục, bạn chỉ cần chạy:

4. Setup dự án Nodejs Typescript Eslint

a) cài các package config

- Khởi tạo dự án

Đầu tiên chúng ta cần tạo folder để làm việc.

Tiếp theo, chúng ta sẽ setup dự án với package.json và thêm các dependencies cần thiết.

- Tạo dự án Node.js

Sử dụng -y khi chạy lệnh npm init khi tạo file package.json để không cần nhập các thông tin về project. Chúng
ta có thể vào file package.json để chỉnh sửa sau.
- Thêm TypeScript như một dev dependency

Bước này chắc sẽ không bất ngờ lắm nhỉ, để sử dụng Typescript, chúng ta cần phải cài đặt nó trước.

Sau khi cài typescript, chúng ta có thể dùng TypeScript để biên dịch code bằng câu lệnh tsc (lưu ý là mình cài
local nên muốn dùng tsc thì phải thông qua file package.json hoặc dùng npx tsc).

- Cài đặt kiểu dữ liệu TypeScript cho Node.js

Vì dùng TypeScript để code Node.js nên chúng ta cần cài thêm kiểu dữ liệu cho Node.js.

- Cài đặt các package config cần thiết còn lại

Chúng ta cần cài đặt các package config cần thiết để làm việc với TypeScript như ESLint, Prettier, ...

npm install eslint prettier eslint-config-prettier eslint-plugin-prettier @typescript-eslint/eslint-plugin


@typescript-eslint/parser ts-node tsc-alias tsconfig-paths rimraf nodemon --save-dev

eslint: Linter (bộ kiểm tra lỗi) chính

prettier: Code formatter chính

eslint-config-prettier: Cấu hình ESLint để không bị xung đột với Prettier

eslint-plugin-prettier: Dùng thêm một số rule prettier cho eslint

@typescript-eslint/eslint-plugin: ESLint plugin cung cấp các rule cho Typescript

@typescript-eslint/parser: Parser cho phép ESLint kiểm tra lỗi Typescript

ts-node: Dùng để chạy TypeScript code trực tiếp mà không cần build

tsc-alias: Xử lý alias khi build

tsconfig-paths: Khi setting alias import trong dự án dùng ts-node thì chúng ta cần dùng tsconfig-paths để nó
hiểu được paths và baseUrl trong file tsconfig.json

rimraf: Dùng để xóa folder dist khi trước khi build

nodemon: Dùng để tự động restart server khi có sự thay đổi trong code
- Cấu hình tsconfig.json

Tạo file tsconfig.json tại thư mục root, có thể tạo bằng lệnh touch tsconfig.json hoặc cứ tạo bằng tay, quen cái
nào thì dùng cái đấy

Tiếp theo copy và paste cấu hình dưới đây vào file tsconfig.json của bạn

b) Ta sẽ cài các package như trong bài block ở dưới đây và thực hiện theo từng bước (vì bài blog này quá
dài nên là mong các bạn nhấp vào link để xem một cách chi tiết để setup dự án)

https://duthanhduoc.com/blog/setup-du-an-nodejs-typescript

Câu lệnh để chạy dự án

Đến đây là xong rồi đó. Các bạn có thể chạy dự án bằng các câu lệnh sau

Chạy dự án trong môi trường dev

Build dự án TypeScript sang JavaScript cho production

Có thể các bạn sẽ hỏi rằng tại sao phải build, để nguyên TypeScript thì luôn vẫn được mà. Đúng vậy nhưng khi
build thì chúng ta sẽ có những lợi ích sau

 Code chạy được mà không cần cài đặt TypeScript


 Chạy nhanh hơn vì đã được biên dịch rồi
 Có thể minify code để giảm dung lượng
 Code chạy được trên những mội trường không hỗ trợ TypeScript

Để build thì chạy câu lệnh sau

Tiếp theo chạy câu lệnh sau để chạy dự án, lưu ý câu lệnh này đòi hỏi bạn phải build trước để có code trong thư
mục dist

Kiểm tra lỗi ESLint / Prettier

Câu lệnh này sẽ giúp bạn kiểm tra lỗi ESLint trong dự án
Nếu bạn muốn ESLint tự động fix lỗi thì chạy câu lệnh sau

Tương tự với Prettier, ta có câu lệnh

Chapter 8: Kĩ năng Debug xử lí lỗi

1. Các kiểu lỗi trong dự án Nodejs Typescript Eslint

Lỗi TypeScript (TS Errors)

 Lỗi TypeScript thường liên quan đến việc vi phạm các quy tắc về kiểu dữ liệu trong TypeScript.
TypeScript là một ngôn ngữ mạnh mẽ cho phép bạn viết mã JavaScript với kiểu dữ liệu tĩnh, giúp phát
hiện lỗi sớm trong quá trình phát triển thay vì khi chạy mã.

Lỗi ESLint (Linting Errors)

 Lỗi ESLint xuất hiện khi mã JavaScript hoặc TypeScript của bạn vi phạm một hoặc nhiều quy tắc được
định nghĩa trong cấu hình ESLint của dự án. ESLint là một công cụ linting giúp giữ mã nguồn của bạn
sạch sẽ và tuân thủ các quy ước về phong cách lập trình.

Lỗi Node.js

 Lỗi Node.js thường liên quan đến các vấn đề về môi trường runtime như lỗi kết nối mạng, lỗi tệp tin
không tìm thấy, hoặc lỗi trong việc sử dụng các API bất đồng bộ.

Cách Tiếp Cận Giải Quyết

 Đọc kỹ thông điệp lỗi: Thông điệp lỗi thường cung cấp thông tin chi tiết về vấn đề.
 Sử dụng IDE hỗ trợ: Môi trường phát triển tích hợp như Visual Studio Code cung cấp công cụ mạnh mẽ
để phát hiện và giúp sửa lỗi TypeScript và ESLint.
 Tìm kiếm trợ giúp trực tuyến: Sử dụng tài liệu chính thức, Stack Overflow, và các nguồn tài nguyên
khác để tìm hiểu cách giải quyết lỗi.
 Kiểm tra cấu hình ESLint: Đảm bảo rằng cấu hình ESLint của bạn phản ánh đúng quy ước mã hóa và
best practices mà bạn muốn tuân theo.
 Kiểm tra lại mã và logic: Đối với lỗi Node.js, kiểm tra lại logic của mã, đảm bảo bạn đang sử dụng các
API đúng cách và xử lý lỗi bất đồng bộ một cách thích hợp.

2. Xử lí lỗi liên quan typescript

Sử dụng as với Interfaces

Type Assertions cũng có thể được sử dụng để chuyển đổi kiểu của đối tượng sang một interface cụ thể.

Ví dụ:

Lưu ý khi sử dụng Type Assertions

 Sử dụng Type Assertions chỉ khi bạn chắc chắn về kiểu dữ liệu của biến. Lạm dụng Type Assertions có
thể dẫn đến việc che giấu các lỗi kiểu dữ liệu thực sự.
 Type Assertions không thay đổi kiểu dữ liệu của biến tại runtime. Nó chỉ là một cách để "bảo" cho trình
biên dịch TypeScript biết cách bạn muốn xử lý kiểu dữ liệu.

Nhớ rằng, mặc dù Type Assertions có thể hữu ích, việc sử dụng chúng đòi hỏi bạn phải hiểu rõ về dữ liệu mà
bạn đang làm việc để tránh gặp phải các lỗi runtime không mong muốn.

3. Xử lí lỗi liên quan Eslint

Khi làm việc với ESLint trong dự án JavaScript hoặc TypeScript của bạn, việc gặp phải lỗi linting là khá phổ
biến. Dưới đây là một số bước và mẹo để giúp bạn xử lý và giải quyết các lỗi liên quan đến ESLint:

Đọc Kỹ Thông Báo Lỗi

Thông báo lỗi từ ESLint thường cung cấp thông tin chi tiết về vấn đề, bao gồm tên quy tắc vi phạm và một mô
tả ngắn gọn về lỗi. Đôi khi, nó cũng đề xuất cách để sửa lỗi.
Hiểu Rõ Quy Tắc Vi Phạm

Mỗi lỗi ESLint được liên kết với một "quy tắc" cụ thể trong cấu hình ESLint. Để giải quyết lỗi, bạn cần hiểu rõ
quy tắc đó yêu cầu điều gì. Bạn có thể tìm kiếm tên quy tắc trên trang web chính thức của ESLint để đọc thêm
về nó.

Sửa Lỗi theo Hướng Dẫn

Sau khi hiểu rõ vấn đề, hãy sửa lỗi trong mã của bạn theo hướng dẫn hoặc đề xuất từ ESLint. Điều này thường
bao gồm việc tuân thủ các quy ước về cách viết mã, sử dụng hoặc không sử dụng một số tính năng ngôn ngữ cụ
thể, hoặc cải thiện cấu trúc mã để tránh lỗi tiềm ẩn.

Tạm Thời Tắt Quy Tắc (Nếu Cần)

Nếu một quy tắc cụ thể không phù hợp với dự án hoặc đội ngũ của bạn, bạn có thể tạm thời vô hiệu hóa quy tắc
đó trong tệp cấu hình ESLint của mình hoặc ngay trong tệp mã nguồn thông qua các bình luận:

Hầu hết các IDE và trình soạn thảo mã nguồn hiện đại có plugin hoặc extension hỗ trợ ESLint, giúp bạn phát
hiện và sửa các lỗi linting ngay lập tức khi bạn viết mã.

Chạy ESLint Trong Dự Án của Bạn

Bạn có thể chạy ESLint trên toàn bộ dự án của mình để tìm và sửa các lỗi linting bằng cách sử dụng lệnh sau
trong terminal:

Lệnh --fix sẽ tự động sửa một số lỗi mà không cần sự can thiệp thủ công của bạn.

4. Xử lí lỗi liên quan Nodejs

Khi làm việc với Node.js, bạn có thể gặp phải nhiều loại lỗi khác nhau, từ lỗi cú pháp, lỗi thời gian chạy
(runtime errors), đến các vấn đề liên quan đến môi trường. Dưới đây là một số cách tiếp cận để giải quyết các
lỗi thường gặp trong Node.js:

Lỗi Cú Pháp (Syntax Errors)

 Lỗi cú pháp xảy ra khi mã JavaScript không tuân theo quy tắc ngữ pháp của ngôn ngữ. Các lỗi này
thường được phát hiện khi bạn cố gắng chạy script.
 Giải quyết: Đọc kỹ thông báo lỗi để xác định vị trí lỗi trong mã nguồn và sửa đổi cho đúng. Các IDE và
trình soạn thảo mã nguồn thường cung cấp gợi ý về lỗi cú pháp trước khi bạn chạy mã.

Lỗi Thời Gian Chạy (Runtime Errors)


 Lỗi thời gian chạy xảy ra khi mã JavaScript gặp sự cố trong quá trình thực thi. Ví dụ: tham chiếu đến
một biến chưa được định nghĩa, truy cập thuộc tính của null hoặc undefined, hoặc lỗi liên quan đến I/O.
 Giải quyết: Sử dụng try...catch để bắt và xử lý các lỗi này. Đối với lỗi bất đồng bộ, hãy sử dụng .catch()
với Promises hoặc try...catch trong các hàm async/await.

Lỗi liên quan đến Module và Package

 Khi bạn nhận được lỗi như Error: Cannot find module, có nghĩa là Node.js không thể tìm thấy module
mà bạn đang cố gắng require.
 Giải quyết: Đảm bảo rằng bạn đã cài đặt tất cả các phụ thuộc cần thiết thông qua npm hoặc yarn và tên
module trong lệnh require() là chính xác. Sử dụng npm install hoặc yarn install để cài đặt các phụ thuộc.

Lỗi liên quan đến Mạng

 Lỗi mạng xảy ra khi có sự cố kết nối mạng, chẳng hạn như không thể kết nối đến một máy chủ cụ thể
thông qua HTTP.
 Giải quyết: Sử dụng thư viện như axios hoặc node-fetch và xử lý lỗi mạng một cách cẩn thận, kiểm tra
trạng thái kết nối và thử lại yêu cầu khi cần thiết.

5. Run và debug Nodejs trên Vscode

Cấu hình File Launch.json

 Để debug ứng dụng Node.js, bạn cần tạo một file cấu hình cho debugger. VSCode làm việc này khá đơn
giản:
 Mở tab Run bằng cách chọn Run từ menu bên trái hoặc sử dụng tổ hợp phím “Ctrl + Shift + D”.
 Nhấp vào create a launch.json file và chọn môi trường Node.js.
 VSCode sẽ tự động tạo một file launch.json trong thư mục .vscode của dự án bạn. File này chứa cấu
hình cần thiết để chạy và debug ứng dụng.

Chỉnh Sửa Cấu Hình Launch.json

 File launch.json mặc định thường đáp ứng nhu cầu cơ bản, nhưng bạn có thể chỉnh sửa nó để phù hợp
với nhu cầu cụ thể của dự án:
 Để chạy một file cụ thể, thay đổi giá trị của "program" thành đường dẫn của file bạn muốn chạy, ví dụ:
"program": "${workspaceFolder}/app.js".

Chạy và Debug Ứng Dụng

 Chạy ứng dụng: Bạn có thể chạy ứng dụng Node.js của mình trực tiếp từ terminal bằng cách sử dụng
lệnh node app.js, với app.js là file chính của ứng dụng bạn.
 Debug ứng dụng: Để bắt đầu debug, đặt breakpoint bằng cách nhấp vào lề bên trái của số dòng code.
Sau đó, trở lại tab Run và nhấp vào nút mũi tên xanh (Start Debugging) hoặc sử dụng tổ hợp phím F5.

Sử Dụng Tính Năng Debugging

 Khi debug bắt đầu, VSCode sẽ dừng ứng dụng tại các breakpoint. Bạn có thể:
 Xem giá trị của biến trong cửa sổ Variables.
 Sử dụng Step Over (F10), Step Into (F11), và Step Out (Shift + F11) để di chuyển qua mã.
 Xem stack trace trong cửa sổ Call Stack.
 Xem và sửa đổi biểu thức trong cửa sổ Watch.

Kết thúc Phiên Debug

 Để kết thúc phiên debug, bạn có thể nhấp vào nút dừng (Stop) trên thanh công cụ debug hoặc đóng cửa
sổ terminal mà Node.js đang chạy.
 Sử dụng VSCode để chạy và debug ứng dụng Node.js không chỉ giúp bạn tìm ra và giải quyết lỗi một
cách hiệu quả mà còn cung cấp cái nhìn sâu sắc về cách thức hoạt động của ứng dụng, giúp bạn trở
thành một nhà phát triển tốt hơn.

Chapter 9: Phân tích và thiết kế cơ sở dữ liệu bằng MongoDB

1. Cơ sở dữ liệu cơ bản

Cơ sở dữ liệu cơ bản là một hệ thống được thiết kế để lưu trữ, truy xuất, và quản lý dữ liệu. Dữ liệu trong cơ sở
dữ liệu có thể được tổ chức theo nhiều cách khác nhau, tùy thuộc vào mô hình cơ sở dữ liệu được sử dụng, như
mô hình quan hệ, mô hình đồ thị, mô hình tài liệu, hoặc mô hình cột. Dưới đây là một số khái niệm và thành
phần cơ bản của cơ sở dữ liệu:

 Dữ liệu: Thông tin có tổ chức lưu trữ trong cơ sở dữ liệu. Dữ liệu có thể là văn bản, số, hình ảnh, video,
etc.
 Bảng (Table): Trong mô hình cơ sở dữ liệu quan hệ, dữ liệu được tổ chức thành các bảng. Mỗi bảng bao
gồm hàng (dữ liệu) và cột (thuộc tính).
 Hàng (Row) / Bản ghi (Record): Một hàng trong bảng biểu diễn một đối tượng hoặc một thực thể. Mỗi
hàng chứa dữ liệu của đối tượng đó.
 Cột (Column) / Trường (Field): Một cột trong bảng biểu diễn một loại dữ liệu cụ thể mà mỗi hàng hoặc
bản ghi có thể có.
 Khóa chính (Primary Key): Một hoặc một nhóm cột trong bảng được sử dụng để duy nhất xác định mỗi
hàng trong bảng.
 Khóa ngoại (Foreign Key): Một hoặc một nhóm cột trong một bảng tham chiếu đến khóa chính của bảng
khác, tạo ra một mối quan hệ giữa hai bảng.
 Truy vấn (Query): Một cách để truy xuất hoặc cập nhật dữ liệu từ cơ sở dữ liệu. Các truy vấn thường
được viết bằng ngôn ngữ truy vấn cấu trúc (SQL) cho cơ sở dữ liệu quan hệ.
 Mô hình cơ sở dữ liệu (Database Model): Một khung cấu trúc lý thuyết mô tả cách dữ liệu được tổ chức,
lưu trữ, và quản lý. Các mô hình phổ biến bao gồm mô hình quan hệ, mô hình đối tượng, mô hình tài
liệu, và mô hình cột.
 Hệ quản trị cơ sở dữ liệu (Database Management System - DBMS): Phần mềm được thiết kế để quản lý
cơ sở dữ liệu. DBMS hỗ trợ việc tạo, truy xuất, cập nhật, và quản lý dữ liệu. Các ví dụ phổ biến bao gồm
MySQL, PostgreSQL, MongoDB, Oracle, và SQL Server.
 Các cơ sở dữ liệu đóng một vai trò quan trọng trong hầu hết các hệ thống thông tin, từ ứng dụng web và
di động cho đến phần mềm quản lý doanh nghiệp và hệ thống thông tin địa lý (GIS).

2. So sánh SQL và NoSQL

SQL (Structured Query Language) và NoSQL là hai loại hệ quản trị cơ sở dữ liệu (DBMS) chính, mỗi loại có
những đặc điểm và ứng dụng riêng biệt. Sự khác biệt chính giữa chúng nằm ở cách tổ chức, lưu trữ dữ liệu và
cách thức truy vấn dữ liệu.

SQL (Relational Databases)

 Mô hình Dữ liệu: SQL sử dụng mô hình quan hệ, tổ chức dữ liệu thành các bảng có quan hệ với nhau
thông qua khóa chính và khóa ngoại.
 Sơ đồ Cố định: Các cơ sở dữ liệu SQL yêu cầu một sơ đồ dữ liệu được xác định trước và cố định, nghĩa
là cấu trúc của bảng và mối quan hệ giữa chúng phải được xác định trước khi dữ liệu được thêm vào.
 Giao dịch: Hỗ trợ tính toàn vẹn giao dịch mạnh mẽ với các tính năng ACID (Atomicity, Consistency,
Isolation, Durability).
 Truy vấn: Sử dụng ngôn ngữ truy vấn cấu trúc (SQL) để thực hiện truy vấn và cập nhật dữ liệu, cho
phép truy vấn phức tạp và kết hợp dữ liệu từ nhiều bảng.

Ví dụ DBMS: MySQL, PostgreSQL, Oracle, SQL Server.

NoSQL (Non-relational Databases)

 Mô hình Dữ liệu: NoSQL không sử dụng mô hình quan hệ, thay vào đó có thể sử dụng mô hình tài liệu,
cặp khóa-giá trị, đồ thị, hoặc cột để lưu trữ dữ liệu.
 Sơ đồ Linh hoạt: Cơ sở dữ liệu NoSQL không yêu cầu sơ đồ dữ liệu cố định, cho phép thêm và thay đổi
cấu trúc dữ liệu mà không cần phải tái cấu trúc cơ sở dữ liệu.
 Giao dịch: Một số hệ thống NoSQL có thể không hỗ trợ tính toàn vẹn giao dịch mạnh mẽ như SQL, tập
trung vào hiệu suất và khả năng mở rộng.
 Truy vấn: Phương thức truy vấn có thể không chuẩn như SQL, và mỗi hệ thống NoSQL có thể có cách
truy vấn dữ liệu riêng biệt.
 Ví dụ DBMS: MongoDB (tài liệu), Redis (khóa-giá trị), Neo4j (đồ thị), Cassandra (cột).

So Sánh

 Khả năng Mở Rộng: NoSQL thường dễ mở rộng hơn theo chiều ngang, hỗ trợ cơ sở dữ liệu lớn và phân
tán. SQL truyền thống hơn và tối ưu cho mô hình mở rộng theo chiều dọc.
 Giao dịch và Tính Toàn Vẹn Dữ liệu: SQL mạnh mẽ hơn trong việc đảm bảo tính toàn vẹn giao dịch và
dữ liệu. NoSQL có thể hy sinh một số tính năng này để đạt được hiệu suất cao hơn và khả năng mở rộng
tốt hơn.
 Truy vấn Dữ liệu: SQL cung cấp khả năng truy vấn phức tạp và mạnh mẽ với ngôn ngữ truy vấn chuẩn.
Trong khi đó, NoSQL có thể không hỗ trợ truy vấn phức tạp như vậy mà không cần tới công cụ hoặc
phần mềm bổ sung.
 Linh hoạt về Dữ liệu: NoSQL cung cấp tính linh hoạt cao hơn trong việc lưu trữ và quản lý các loại dữ
liệu khác nhau, làm cho nó phù hợp với ứng dụng có dữ liệu phi cấu trúc hoặc bán cấu trúc.

3. MongoDB cơ bản
Nhấp Add try và xóa my ip

Quay lại overview và nhấp vào connect bên phải màn hình
Set-up và copy URI như hình dưới đây :

Pass vào URI ở MongoDB compass


Sửa phần password hồi này chúng ta tạo project sau đó save và connect

Tạo database
4. CRUD MongoDB compass

Ta thực hiện code như trong file.json và insert như hình dưới đây:

Ta có thể update bằng cách edit rồi update nó

Tương tự như vậy ta cũng có thể xóa nó bằng cách trỏ chuột đến góc phải và nhấp vào biểu tượng thùng rác và
delete nó
Ta có thể tìm cách nhập code json để tìm khi dữ liệu nhiều và ở dưới ta có tìm kiếm loại trừ :

Ví dụ : “age” : 0 thì nó sẽ xuất hiện hết thông tin loại trừ tuổi

Hoặc có thể dùng lệnh $gt để tìm kiếm những độ tuổi lớn hơn 18

5. CRUD Mongosh
- Mongosh (MongoDB Shell) là công cụ tương tác command-line interface (CLI) cho MongoDB, cho
phép bạn truy vấn và cập nhật dữ liệu, quản lý cơ sở dữ liệu. Dưới đây là hướng dẫn chi tiết về cách thực
hiện các thao tác CRUD (Create, Read, Update, Delete) trong mongosh, kèm theo ví dụ cụ thể.

Create (Tạo)

Để tạo một tài liệu mới trong collection, bạn sử dụng phương thức insertOne() để thêm một tài liệu hoặc
insertMany() để thêm nhiều tài liệu cùng một lúc.

Ví dụ:

Thêm một tài liệu vào collection users:

Thêm nhiều tài liệu vào collection users:

Read (Đọc)

Để truy vấn tài liệu từ một collection, bạn có thể sử dụng find() để truy vấn nhiều tài liệu hoặc findOne() để truy
vấn một tài liệu duy nhất phù hợp với điều kiện.

Ví dụ:

Tìm một tài liệu trong users có name là "John Doe":


Tìm tất cả tài liệu trong users có age lớn hơn 25:

Update (Cập nhật)

Để cập nhật tài liệu, bạn có thể sử dụng updateOne(), updateMany(), hoặc replaceOne() tùy thuộc vào nhu cầu
cập nhật của bạn.

Ví dụ:

Cập nhật age của tài liệu có name là "John Doe":

Tăng age lên 1 cho tất cả tài liệu trong users:


Delete (Xóa)

Để xóa tài liệu, bạn có thể sử dụng deleteOne() để xóa một tài liệu, hoặc deleteMany() để xóa nhiều tài liệu
cùng một lúc.

Ví dụ:

Xóa một tài liệu có name là "Jim Beam":

Xóa tất cả tài liệu trong users có age nhỏ hơn 30:

Lưu Ý

Khi làm việc với mongosh, đảm bảo rằng bạn đã kết nối thành công với instance MongoDB của mình. Bạn cũng
cần lựa chọn đúng cơ sở dữ liệu trước khi thực hiện các thao tác trên collection với lệnh use <database_name>.

Các ví dụ trên chỉ là cơ bản. MongoDB cung cấp nhiều tùy chọn và tính năng phức tạp hơn cho phép bạn tối ưu
hóa và điều chỉnh truy vấn theo nhu cầu cụ thể của mình.

6. Thiết kế cơ sở dữ liệu bằng MongoDB sao cho chuẩn

Cách tiếp cận thiết kế cơ sở dữ liệu - Relational vs MongoDB

 Thiết kế cơ sở dữ liệu quan hệ

Khi thiết kế các schema cho một cơ sở dữ liệu quan hệ, anh em dev chúng ta thường chia dữ liệu thành các
bảng, sao cho không bị nhân đôi dữ liệu.

Cùng nhìn ví dụ dưới đây, chúng ta có 3 bảng Users, Professions và Cars đại diện cho dữ liệu của người dùng.
Dữ liệu người dùng được chia thành những bảng riêng biệt, và chúng có thể được JOINED với nhau bằng cách
sử dụng khóa ngoại trong cột user_id của bảng Professions và Cars

 Thiết kế cơ sở dữ liệu MongoDB

MongoDB schema hoạt động khác với SQL. Với kiểu thiết kế cơ sở dữ liệu theo MongoDB, chúng ta sẽ:

 Không có quy trình chính thức


 Không có những thuật toán
 Không có những quy tắc

Ưu điểm

 Bạn có thể truy xuất tất cả thông tin liên quan trong một query
 Tránh việc join hoặc lookup trong ứng dụng
 Update các thông tin liên quan trong một query duy nhất

Hạn chế

 Khi document lớn lên sẽ gây gánh nặng cho những trường không liên quan. Bạn có thể tăng hiệu suất
truy vấn bằng cách hạn chế kích thước của các document mà bạn gửi qua cho mỗi truy vấn.
 Giới hạn cho document là 16 MB trong MongoDB. Nếu bạn nhúng quá nhiều dữ liệu bên trong một
document duy nhất, bạn có thể đụng phải giới hạn này.
 Tham chiếu

Tham chiếu hoạt động tương tự như toán tử JOIN trong một truy vấn SQL. Nó cho phép chúng ta chia dữ liệu
để tạo ra các truy vấn hiệu quả và có thể mở rộng hơn, nhưng vẫn duy trì mối quan hệ giữa dữ liệu.

Ưu điểm

 Bằng cách chia dữ liệu, bạn sẽ có các document nhỏ hơn.


 Ít khả năng đạt giới hạn 16-MB cho mỗi document.
 Những dữ liệu không cần thiết sẽ không được đính kèm vào các truy vấn.
 Giảm lượng trùng lặp dữ liệu. Tuy nhiên, điều quan trọng cần lưu ý là đôi khi chúng ta chấp nhận trùng
lặp dữ liệu để đem lại một schema tốt hơn.

Hạn chế

 Để truy xuất được hết data, chúng ta cần tối thiểu là 2 query hoặc dùng $lookup

Các loại quan hệ

Quan hệ 1-1 (One-to-One)


Ví dụ: Mỗi người dùng có một hồ sơ cá nhân duy nhất.
Cách thực hiện: Có thể nhúng trực tiếp hồ sơ cá nhân vào trong tài liệu người dùng hoặc tham chiếu
bằng cách sử dụng ID.

Quan hệ 1 - ít (One-to-Few)
Ví dụ: Một tác giả viết một số sách ít.
Cách thực hiện: Nhúng danh sách sách trực tiếp vào tài liệu của tác giả.
Quan hệ 1 - Nhiều (One-to-Many)
Ví dụ: Một bài đăng blog có nhiều bình luận.
Cách thực hiện: Tham chiếu bằng cách lưu ID của bài đăng trong mỗi tài liệu bình luận hoặc nhúng
bình luận vào bài đăng nếu số lượng không quá lớn.
Quan hệ 1 - rất nhiều (One-to-Squillions)
Ví dụ: Một người dùng có lịch sử giao dịch rất lớn.
Cách thực hiện: Tham chiếu bằng cách sử dụng ID của người dùng trong mỗi tài liệu giao dịch.
Quan hệ Nhiều - Nhiều (Many-to-Many)
Ví dụ: Sinh viên và các khóa học; mỗi sinh viên có thể đăng ký nhiều khóa học, và mỗi khóa học có thể
có nhiều sinh viên.
Cách thực hiện: Tham chiếu qua các ID, có thể sử dụng một bộ sưu tập riêng để quản lý quan hệ này.

7. Lưu ý trước khi thiết kế database bằng MongoDB

Khi làm việc với dữ liệu thời gian trong MongoDB, việc hiểu rõ cách sử dụng các kiểu dữ liệu liên quan đến
thời gian như Date và Timestamp là rất quan trọng. Dưới đây là một số lưu ý khi sử dụng chúng:

Date

 Định dạng: Trong MongoDB, kiểu Date lưu trữ dữ liệu thời gian dưới dạng UTC (Coordinated
Universal Time) và biểu diễn số miligiây kể từ thời điểm Epoch (1/1/1970). Kiểu Date phản ánh cả ngày
và giờ, cho phép bạn lưu trữ thông tin thời gian một cách chi tiết.
 Sử dụng: Kiểu Date thường được sử dụng để lưu trữ các dấu thời gian của sự kiện, như ngày tạo và ngày
cập nhật của một tài liệu. MongoDB cung cấp các hàm để làm việc với Date, bao gồm cả việc trích xuất
thành phần cụ thể của ngày hoặc giờ từ một giá trị Date.
 Quản lý múi giờ: Vì Date lưu trữ dưới dạng UTC, bạn cần xử lý chuyển đổi múi giờ trong ứng dụng của
mình nếu cần hiển thị thời gian theo địa phương của người dùng.

Timestamp

 Định dạng: Timestamp trong MongoDB là một kiểu dữ liệu đặc biệt dùng cho mục đích nội bộ, chủ yếu
để ghi lại thời điểm của các thay đổi trong replica set. Nó bao gồm một phần thời gian (number of
seconds since the Unix epoch) và một số thứ tự tăng dần để phân biệt các sự kiện xảy ra cùng một thời
điểm.
 Sử dụng: Kiểu Timestamp thường không được sử dụng cho dữ liệu ứng dụng, mà chủ yếu dùng trong
các hoạt động nội bộ của MongoDB, như trong oplog của replica sets.
 Đối với Ứng dụng: Trừ khi bạn đang thực hiện các tác vụ liên quan đến quản lý replica set hoặc cần một
cơ chế thời gian chính xác cho các thay đổi dữ liệu nội bộ, thì bạn nên sử dụng kiểu Date cho các nhu
cầu ứng dụng thông thường liên quan đến thời gian.
Lưu ý chung

 Truy vấn và Index: Khi lưu trữ dữ liệu thời gian, việc tạo index cho các trường này sẽ cải thiện hiệu suất
truy vấn đáng kể, đặc biệt là với các truy vấn phức tạp liên quan đến khoảng thời gian.
 Lưu trữ và Truy vấn hiệu quả: Để tối ưu hóa lưu trữ và truy vấn, hãy đảm bảo rằng bạn chỉ lưu trữ thông
tin thời gian cần thiết và sử dụng các phương pháp truy vấn hiệu quả, như sử dụng $date operator cho
các truy vấn thời gian.

8. Phân tích user collection


9. phân tích refresh_tokens collection
10.Phân tích followers collection
11.Phân tích tweets collection
12.Phân tích tính năng boomarks và like collection
13.Tính năng HashTags collection.

You might also like