
Chào các chiến thần code tương lai của Gen Z! Anh Creyt lại lên sóng đây. Hôm nay, chúng ta sẽ 'soi' vào một góc nhỏ nhưng cực kỳ quyền lực trong cái máy tính 'khủng long' của các em: thông tin mạng. Cụ thể là cái 'chứng minh nhân dân' (CMND) của từng cổng mạng, từng 'cánh cửa' kết nối ra thế giới ảo. Và công cụ giúp chúng ta làm điều đó trong Node.js chính là os.networkInterfaces().
Nghe tên hơi 'học thuật' đúng không? Đừng lo! Cứ hình dung thế này: cái máy tính của em nó không chỉ có một 'cánh cổng' để ra vào internet đâu. Nó có thể có cổng LAN, Wi-Fi, Bluetooth, thậm chí là mấy cái cổng ảo mà các phần mềm tạo ra (như VPN chẳng hạn). Mỗi 'cánh cổng' này, hay còn gọi là giao diện mạng (network interface), nó đều có một danh tính riêng, một địa chỉ riêng để 'giao thiệp' với thế giới bên ngoài. Và os.networkInterfaces() chính là 'ông quản lý' hồ sơ, chuyên đi thu thập hết thông tin của những 'cánh cổng' đó, gói ghém lại và đưa cho các em một cái danh sách chi tiết.
Nói nôm na, nó giúp em biết: 'À, cái máy mình đang có những đường kết nối mạng nào? Mỗi đường có địa chỉ IP là gì (như số nhà ấy), là loại gì (IPv4 hay IPv6), có đang hoạt động không?' Cực kỳ hữu ích khi em muốn xây dựng những ứng dụng cần 'nhận diện' chính mình trên mạng nội bộ, hoặc 'nhòm ngó' xem máy mình đang kết nối kiểu gì.
os.networkInterfaces() Trả về cái gì?
Kết quả mà os.networkInterfaces() trả về là một Object (đối tượng). Mà không phải object thường đâu, nó là một object đặc biệt, với mỗi key là tên của một giao diện mạng (ví dụ: Ethernet, Wi-Fi, lo - cái này là loopback, hay còn gọi là 'giao diện tự sự với chính mình'). Giá trị (value) của mỗi key lại là một Array (mảng) các đối tượng con. Mỗi đối tượng con này chính là một địa chỉ mạng cụ thể của giao diện đó. Nghe hơi 'xoắn não' đúng không? Xem ví dụ code là hiểu ngay!
Code Ví Dụ Minh Họa (Uống miếng nước đi rồi code nhé!)
Đầu tiên, chúng ta cần 'triệu hồi' module os:
const os = require('os');
// Bước 1: Gọi hàm thần thánh để lấy toàn bộ thông tin
const networkInterfaces = os.networkInterfaces();
console.log('--- Tất tần tật các "CMND" mạng của máy bạn: ---');
console.log(networkInterfaces);
console.log('\n--- Bóc tách từng "cánh cổng" và địa chỉ: ---');
for (const interfaceName in networkInterfaces) {
console.log(`\nCổng "${interfaceName}":`);
const addresses = networkInterfaces[interfaceName];
addresses.forEach(addr => {
console.log(` - Địa chỉ: ${addr.address}`);
console.log(` Loại: ${addr.family} (IPv${addr.family === 'IPv4' ? 4 : 6})`);
console.log(` Mặt nạ mạng (Netmask): ${addr.netmask}`);
console.log(` Nội bộ (Internal - tự đàm thoại với chính mình): ${addr.internal}`);
console.log(` CIDR: ${addr.cidr}`);
});
}
// Ví dụ thực tế hơn: Tìm địa chỉ IPv4 không phải loopback (internal)
// Đây chính là địa chỉ mà các máy khác trong mạng nội bộ có thể "gọi" tới bạn!
console.log('\n--- Địa chỉ IP "thực" của máy bạn trên mạng nội bộ: ---');
let localIpAddress = 'Không tìm thấy';
for (const interfaceName in networkInterfaces) {
const addresses = networkInterfaces[interfaceName];
for (const addr of addresses) {
if (addr.family === 'IPv4' && !addr.internal) {
localIpAddress = addr.address;
break; // Tìm thấy rồi thì nghỉ
}
}
if (localIpAddress !== 'Không tìm thấy') {
break; // Tìm thấy rồi thì nghỉ luôn vòng ngoài
}
}
console.log(`Địa chỉ IP nội bộ của bạn là: ${localIpAddress}`);
Khi chạy đoạn code trên, các em sẽ thấy một 'mớ' thông tin. Key interfaceName sẽ là tên của card mạng (ví dụ: Wi-Fi, Ethernet, Loopback Pseudo-Interface 1,...). Mỗi addr trong mảng là một địa chỉ cụ thể với các thuộc tính:
address: Địa chỉ IP thực (ví dụ:192.168.1.100,127.0.0.1).netmask: Mặt nạ mạng, để xác định phần nào của IP là mạng, phần nào là máy chủ.family: Loại địa chỉ, có thể làIPv4hoặcIPv6.mac: Địa chỉ MAC của giao diện (chỉ có trên một số hệ điều hành).internal:truenếu đây là địa chỉ loopback (chỉ dùng cho máy tự giao tiếp với chính nó, như127.0.0.1),falsenếu là địa chỉ mạng thực.cidr: Địa chỉ IP với ký hiệu CIDR (ví dụ:192.168.1.100/24).

Mẹo Vặt & Best Practices từ Anh Creyt (Quan trọng lắm đó!)
- "Lọc vàng" trong mớ hỗn độn: Như ví dụ trên, thường em chỉ quan tâm đến IPv4 và địa chỉ không phải
internal(tức là không phải127.0.0.1hay::1). Hãy luôn lọc kỹ để lấy đúng thông tin mình cần, tránh bị nhiễu bởi các địa chỉ ảo hay IPv6 nếu không có nhu cầu. - Cẩn trọng với
internal: Địa chỉinternal(hay loopback) là để máy tự nói chuyện với chính nó. Đừng bao giờ dùng nó để giao tiếp với máy khác trên mạng. Nó giống như em tự nói chuyện với bản thân trong gương vậy, người ngoài không nghe thấy đâu. - Kiểm tra
family: Luôn kiểm tra thuộc tínhfamily(IPv4hoặcIPv6) để đảm bảo em đang xử lý đúng loại địa chỉ. Đừng bao giờ mặc định. - Xử lý trường hợp không tìm thấy: Mặc dù
os.networkInterfaces()luôn trả về một object, nhưng có thể không có interface nào thỏa mãn điều kiện lọc của em (ví dụ: không có card mạng nào đang hoạt động và có IPv4). Luôn có một giá trị mặc định hoặc thông báo lỗi cho trường hợp này. - Bảo mật là trên hết: Đừng bao giờ 'show' bừa bãi thông tin mạng chi tiết của server ra ngoài internet. Những thông tin này có thể bị kẻ xấu lợi dụng để tìm lỗ hổng. Chỉ hiển thị những gì cần thiết cho người dùng cuối.
Ứng Dụng Thực Tế (Không phải lý thuyết suông đâu!)
- Server Dev nội bộ: Khi em chạy một server Node.js trên máy mình, đôi khi nó báo
listening on 0.0.0.0(nghe trên tất cả các địa chỉ). Nhưng để bạn bè trong cùng mạng LAN truy cập, em cần biết địa chỉ IP thực của máy mình (ví dụ192.168.1.x).os.networkInterfaces()sẽ giúp em 'moi' ra cái địa chỉ đó để share cho bạn. - Công cụ chẩn đoán mạng: Các ứng dụng như Wireshark (dạng đơn giản hơn), hoặc các script kiểm tra tình trạng mạng cục bộ thường dùng hàm này để liệt kê các giao diện và địa chỉ của chúng, giúp người dùng dễ dàng khắc phục sự cố mạng.
- Hệ thống IoT/Embedded: Một con Raspberry Pi hay ESP32 chạy Node.js cần báo cáo địa chỉ IP của nó cho một server trung tâm để server đó có thể gửi lệnh điều khiển. Hàm này là chìa khóa để thiết bị tự nhận diện mình.
- Container và Virtual Machines: Trong môi trường Docker hay VM, việc xác định địa chỉ IP của container/VM trên mạng ảo là rất quan trọng để các service bên ngoài có thể kết nối hoặc để các container giao tiếp với nhau qua IP.
Thử Nghiệm & Nên Dùng Cho Case Nào?
Anh Creyt khuyến khích các em cứ mạnh dạn console.log và 'nghịch' với os.networkInterfaces() trên máy mình. Mỗi máy, mỗi hệ điều hành sẽ cho ra kết quả khác nhau, và đó chính là cách học tốt nhất!
- Khi nào nên dùng?
- Khi em cần biết địa chỉ IP mà server Node.js của em đang lắng nghe để người khác có thể truy cập trong mạng nội bộ (ví dụ: bạn bè cùng quán cà phê, đồng nghiệp cùng văn phòng).
- Khi em đang viết một công cụ CLI (Command Line Interface) để hiển thị thông tin mạng của máy cho mục đích chẩn đoán hoặc báo cáo.
- Khi em muốn cấu hình một dịch vụ Node.js để chỉ lắng nghe trên một giao diện mạng cụ thể (ví dụ: chỉ lắng nghe trên Wi-Fi, không lắng nghe trên LAN).
- Khi nào không nên dùng?
- Khi em chỉ cần địa chỉ IP public (IP mà cả thế giới nhìn thấy khi em truy cập internet). Cái này phải dùng các dịch vụ bên ngoài (như
ipify.orghaywhatismyip.com) vìos.networkInterfaces()chỉ cho em IP của máy trong mạng nội bộ thôi. - Khi em không cần thông tin mạng chi tiết mà chỉ cần kiểm tra xem có kết nối internet hay không (có thể dùng các package khác hoặc thử ping một địa chỉ cố định để kiểm tra).
- Khi em chỉ cần địa chỉ IP public (IP mà cả thế giới nhìn thấy khi em truy cập internet). Cái này phải dùng các dịch vụ bên ngoài (như
Vậy đó, các em thấy không? Một hàm nhỏ bé nhưng lại mở ra cả một thế giới thông tin về 'danh tính' mạng của chiếc máy tính thân yêu. Hãy thực hành, thử nghiệm và biến nó thành công cụ đắc lực trong hành trình code của mình nhé! Anh Creyt tin tưởng vào các em!
Thuộc Series: Nodejs
Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!