"Đừng tự nối đường dẫn bằng dấu
/. Hãy để Node.js xử lý điều đó bằng modulepathđể chương trình hoạt động đúng trên mọi hệ điều hành."
🎯 Mục tiêu bài học
Sau bài này bạn sẽ:
Hiểu module path là gì.
Biết vì sao cần dùng
paththay vì tự nối chuỗi.Thành thạo các hàm:
join()resolve()basename()dirname()extname()
Biết kết hợp
pathvớifs.Viết chương trình tương thích trên Windows, Linux và macOS.
path là gì?
path là module có sẵn của Node.js dùng để xử lý đường dẫn (path).
Không cần cài đặt thêm.
Import:
import path from "node:path";
Hoặc
import { join } from "node:path";
Vì sao cần dùng path?
Giả sử bạn tự nối đường dẫn:
const file = "images/" + "logo.png";
Có thể hoạt động trên máy bạn.
Nhưng:
Windows
images\logo.png
Linux
images/logo.png
macOS
images/logo.png
Node.js sẽ tự chọn dấu phân cách phù hợp nếu dùng path.
join()
Đây là hàm được sử dụng nhiều nhất.
import path from "node:path";
const file =
path.join(
"images",
"logo.png"
);
console.log(file);
Windows
images\logo.png
Linux
images/logo.png
Có nhiều cấp:
path.join(
"public",
"uploads",
"avatar.png"
);
Kết quả
public/uploads/avatar.png
(hoặc \ trên Windows)
resolve()
resolve() tạo đường dẫn tuyệt đối.
Ví dụ
import path from "node:path";
console.log(
path.resolve("data.txt")
);
Kết quả
C:\Projects\basic\data.txt
Hoặc
/home/user/basic/data.txt
Ví dụ
const file =
path.resolve(
"images",
"logo.png"
);
console.log(file);
basename()
Lấy tên file.
import path from "node:path";
console.log(
path.basename(
"images/logo.png"
)
);
Kết quả
logo.png
Bỏ phần mở rộng
console.log(
path.basename(
"logo.png",
".png"
)
);
Kết quả
logo
dirname()
Lấy thư mục cha.
console.log(
path.dirname(
"images/logo.png"
)
);
Kết quả
images
extname()
Lấy phần mở rộng.
console.log(
path.extname(
"photo.jpg"
)
);
Kết quả
.jpg
Ví dụ
path.extname("index.html");
↓
.html
parse()
Chuyển path thành object.
console.log(
path.parse(
"images/logo.png"
)
);
Kết quả
{
root:'',
dir:'images',
base:'logo.png',
ext:'.png',
name:'logo'
}
format()
Ngược lại với parse().
const file =
path.format({
dir:"images",
name:"logo",
ext:".png"
});
console.log(file);
↓
images/logo.png
isAbsolute()
Kiểm tra đường dẫn tuyệt đối.
console.log(
path.isAbsolute(
"C:\\temp"
)
);
↓
true
Ví dụ
path.isAbsolute(
"images/logo.png"
);
↓
false
normalize()
Chuẩn hóa đường dẫn.
console.log(
path.normalize(
"images//logo.png"
)
);
↓
images/logo.png
Ví dụ
path.normalize(
"public/uploads/../avatar.png"
);
↓
public/avatar.png
Kết hợp path và fs
Đây là cách viết phổ biến.
import fs from "node:fs";
import path from "node:path";
const file =
path.join(
"data",
"users.json"
);
const data =
fs.readFileSync(
file,
"utf8"
);
console.log(data);
__dirname trong ES Module
Trong CommonJS có:
console.log(__dirname);
Nhưng ES Module không hỗ trợ trực tiếp.
Thay vào đó:
import { fileURLToPath } from "node:url";
import path from "node:path";
const __filename =
fileURLToPath(import.meta.url);
const __dirname =
path.dirname(__filename);
console.log(__dirname);
Đây là cách chuẩn khi cần lấy thư mục chứa file hiện tại trong ES Module.
Ví dụ thực tế
Cấu trúc
project/
app.js
uploads/
avatar.png
Đọc ảnh
const avatar =
path.join(
"uploads",
"avatar.png"
);
Không cần quan tâm Windows hay Linux.
Khi nào dùng join()?
✔ Nối thư mục
✔ Tạo đường dẫn file
✔ Đọc file
✔ Upload
✔ Express
✔ Prisma
Đây là hàm được dùng nhiều nhất.
resolve() hay join()?
join()
path.join(
"images",
"logo.png"
);
↓
images/logo.png
Là đường dẫn tương đối.
resolve()
path.resolve(
"images",
"logo.png"
);
↓
C:\Project\images\logo.png
Là đường dẫn tuyệt đối.
Những lỗi thường gặp
Tự nối chuỗi
const file =
"images/" +
"logo.png";
Không nên.
Hãy dùng
path.join(
"images",
"logo.png"
);
Hard-code dấu ""
"images\\logo.png"
Sai trên Linux.
Hard-code dấu "/"
"images/logo.png"
Có thể chạy trong nhiều trường hợp, nhưng không phải là cách viết đa nền tảng và dễ bảo trì.
Không dùng resolve()
Ví dụ
fs.readFileSync(
"data.txt"
);
Nếu chạy ở thư mục khác có thể báo lỗi:
ENOENT
Giải pháp
path.resolve(
"data.txt"
);
Tổng kết
Module path giúp xử lý đường dẫn một cách an toàn, rõ ràng và tương thích trên nhiều hệ điều hành. Thay vì tự nối chuỗi bằng dấu / hoặc \, bạn nên sử dụng các hàm như join(), resolve(), basename(), dirname() và extname() để giảm lỗi và tăng tính chuyên nghiệp cho mã nguồn.
Trong các dự án thực tế, path gần như luôn đi cùng với fs, Express và các thư viện khác để truy cập tệp, thư mục và tài nguyên của ứng dụng.
Bài tiếp theo
👉 Bài 08 — OS
Bạn sẽ học:
Module
oslà gì.Lấy thông tin hệ điều hành.
Kiểm tra CPU, RAM và kiến trúc máy.
Xem thư mục Home và thư mục tạm (Temp).
Ứng dụng module
osđể xây dựng các công cụ giám sát và thu thập thông tin hệ thống bằng Node.js.




Không có nhận xét nào:
Đăng nhận xét