"Получение локального IP-адреса в Node.js: программируем"
Быстрый ответ
Для определения локального IP-адреса в Node.js мы можем использовать модуль os
и его метод networkInterfaces()
. Вот пример кода, который позволит найти IPv4, который не является внутренним:
const os = require('os');
const localIP = Object.values(os.networkInterfaces())
.flat()
.find(iface => iface.family === 'IPv4' && !iface.internal)
?.address;
console.log('Локальный IP-адрес:', localIP); // Вау, я нашел свой IP-адрес!
Выполните этот код в Node.js и ваш локальный IP-адрес будет отображен.
Детальный обзор метода
Ваш компьютер может обладать несколькими сетевыми интерфейсами (Ethernet, Wi-Fi и др.), и каждый из них может иметь несколько IP-адресов.
Метод networkInterfaces()
возвращает информацию обо всех адресах, сгруппированных по интерфейсам. Каждый интерфейс в этом объекте представлен массивом адресов.
Учёт множества сетевых интерфейсов
Если в вашем распоряжении множество сетевых интерфейсов, вы можете модифицировать код следующим образом:
const os = require('os');
const getAllIPv4Addresses = () => {
const interfaces = os.networkInterfaces();
const allAddresses = [];
for (const interface of Object.keys(interfaces)) {
for (const iface of interfaces[interface]) {
if (iface.family === 'IPv4' && !iface.internal) {
allAddresses.push({interface, address: iface.address});
}
}
}
return allAddresses;
};
console.log('Все IPv4 адреса:', getAllIPv4Addresses()); // Как ни странно, все мои IPv4 адреса тут!
Этот скрипт формирует массив объектов с названиями сетевых интерфейсов и их внешними IPv4-адресами.
Публичный адрес: выход за рамки локальной сети
Для определения публичного IP-адреса можно использовать сторонние модули или возможности DNS-разрешения.
// Используя модуль dns
const dns = require('dns');
const os = require('os');
dns.lookup(os.hostname(), (err, address) => {
if (err) throw err;
console.log('Публичный IP-адрес:', address);
});
// Или используя пакет node-ip
const ip = require('ip');
console.log("Публичный IP-адрес: ", ip.address()); // Вот он, мой публичный IP-адрес!
Обратите внимание: с сетевыми операциями всегда связаны определенные ошибки, так что не забывайте про аккуратную обработку исключений!
Визуализация
Воспринимайте поиск локального IP-адреса в Node.js как великое приключение:
Стойкий рыцарь (🖥️): В поисках своего локального IP-адреса в Королевстве (🌐)
require('os').networkInterfaces(); // Изучаем карту королевства 🏰 в поисках своего замка 🏰
🖥️🧭🌐: Рыцарь обнаруживает свой замок [192\.168.1.5] (на пример)
Практические рекомендации и советы при возникновении сложностей
В процессе определения локального IP-адреса в Node.js вы можете столкнуться с некоторыми препятствиями:
Будьте осторожны с IPv6
Это руководство посвящено исключительно IPv4. Если ваши сетевые интерфейсы используют IPv6, не забудьте адаптировать код под нужную версию.
Не обращайте внимание на loopback-адреса и внутренние адреса
Убедитесь, что ваш код игнорирует loopback и внутренние адреса, чтобы получить доступ к адресу, доступному для внешней сети. В нашем коде мы используем !iface.internal
для этого.
Учитывайте специфику различных операционных систем
Отображение сетевых интерфейсов может варьироваться в зависимости от операционной системы. Поэтому всегда тестируйте свои скрипты на всех целевых платформах.
Полезные материалы
- OS | Документация Node.js — Официальная документация Node.js по функции
os.networkInterfaces
. - Определение локального IP-адреса в Node.js – Stack Overflow — Обсуждение на Stack Overflow о том, как получить локальный IP в Node.js.
- Понимание IP-адресов, подсетей и CIDR-нотации в сетевых технологиях | DigitalOcean — Инструкция по IP-адресам и подсетям от DigitalOcean.
- Как найти имя сетевого интерфейса с определенным IP в Node.js — Полезный Gist о том, как определить сетевой интерфейс в Node.js.
- Request — npm — Модуль npm Request для выполнения HTTP-запросов.
- Net | Документация Node.js — Документация модуля Net в Node.js для работы с сетевыми приложениями.