Получить локальный IP-адрес в node.js - PullRequest
269 голосов
/ 06 сентября 2010

На моем компьютере запущена простая программа node.js, и я хочу получить локальный IP-адрес ПК, на котором запущена моя программа. Как мне получить его с помощью node.js?

Ответы [ 36 ]

10 голосов
/ 27 февраля 2017

использовать ip модуль npm

var ip = require('ip');

console.log(ip.address());

> '192.168.0.117'
8 голосов
/ 10 марта 2018

Все, что я знаю, я хотел, чтобы IP-адрес начинался с 192.168.. Этот код даст вам следующее:

function getLocalIp() {
    const os = require('os');

    for(let addresses of Object.values(os.networkInterfaces())) {
        for(let add of addresses) {
            if(add.address.startsWith('192.168.')) {
                return add.address;
            }
        }
    }
}

Конечно, вы можете просто изменить номера, если ищете другой.

6 голосов
/ 08 апреля 2017

Я написал Node.js модуль , который определяет ваш локальный IP-адрес, посмотрев, какой сетевой интерфейс содержит ваш шлюз по умолчанию.

Это более надежно, чем выбор интерфейса из os.networkInterfaces() или DNS-поиска имени хоста. Он может игнорировать виртуальные интерфейсы VMware, петлевые и VPN-интерфейсы и работает в Windows, Linux, Mac OS и FreeBSD. Под капотом он выполняет route.exe или netstat и анализирует вывод.

var localIpV4Address = require("local-ipv4-address");

localIpV4Address().then(function(ipAddress){
    console.log("My IP address is " + ipAddress);
    // My IP address is 10.4.4.137 
});
5 голосов
/ 20 октября 2015

Вот упрощенная версия ванильного javascript для получения одного IP:

function getServerIp() {

  var os = require('os');
  var ifaces = os.networkInterfaces();
  var values = Object.keys(ifaces).map(function(name) {
    return ifaces[name];
  });
  values = [].concat.apply([], values).filter(function(val){ 
    return val.family == 'IPv4' && val.internal == false; 
  });

  return values.length ? values[0].address : '0.0.0.0';
}
4 голосов
/ 17 июля 2013

Для тех, кто интересуется краткостью, вот некоторые «однострочные», которые не требуют плагинов / зависимостей, не являющихся частью стандартной установки Node:

Публичный IPv4 и IPv6 из eth0как массив:

var ips = require('os').networkInterfaces().eth0.map(function(interface) { 
    return interface.address;
});

Первый публичный IP-адрес eth0 (обычно IPv4) в виде строки:

var ip = require('os').networkInterfaces().eth0[0].address;
4 голосов
/ 20 марта 2016

для Linux и MacOS использует, если вы хотите получить ваши IP-адреса синхронно, попробуйте это.

var ips = require('child_process').execSync("ifconfig | grep inet | grep -v inet6 | awk '{gsub(/addr:/,\"\");print $2}'").toString().trim().split("\n");
console.log(ips);

результат будет примерно таким:

[ '192.168.3.2', '192.168.2.1' ]
3 голосов
/ 18 июня 2014

Вот вариант вышеупомянутых примеров.Это требует фильтрации интерфейсов vMware и т. Д. Если вы не передадите индекс, он вернет все адреса, в противном случае вы можете установить его по умолчанию на 0, а затем просто передать null, чтобы получить все, но вы разберетесь с этим.Вы также можете передать другой аргумент для фильтра регулярных выражений, если хотите добавить

    function getAddress(idx) {

    var addresses = [],
        interfaces = os.networkInterfaces(),
        name, ifaces, iface;

    for (name in interfaces) {
        if(interfaces.hasOwnProperty(name)){
            ifaces = interfaces[name];
            if(!/(loopback|vmware|internal)/gi.test(name)){
                for (var i = 0; i < ifaces.length; i++) {
                    iface = ifaces[i];
                    if (iface.family === 'IPv4' &&  !iface.internal && iface.address !== '127.0.0.1') {
                        addresses.push(iface.address);
                    }
                }
            }
        }
    }

    // if an index is passed only return it.
    if(idx >= 0)
        return addresses[idx];
    return addresses;
}
3 голосов
/ 12 июня 2014

Исходя из комментария выше, вот что работает для текущей версии узла:

var os = require('os');
var _ = require('lodash');

var ip = _.chain(os.networkInterfaces())
  .values()
  .flatten()
  .filter(function(val) {
    return (val.family == 'IPv4' && val.internal == false)
  })
  .pluck('address')
  .first()
  .value();

В комментарии к одному из ответов выше отсутствовал звонок на values(). Похоже, os.networkInterfaces() теперь возвращает объект вместо массива.

3 голосов
/ 05 мая 2014

Google направил меня на этот вопрос при поиске "node.js get server ip" , поэтому давайте дадим альтернативный ответ тем, кто пытается добиться этого на своем сервере node.js программа (может быть в случае оригинального плаката).

В наиболее тривиальном случае, когда сервер связан только с одним IP-адресом, не нужно определять IP-адрес, поскольку мы уже знаем, к какому адресу мы его привязали (например, второй параметр передан в listen() функция).

В менее тривиальном случае, когда сервер привязан к нескольким IP-адресам, нам может потребоваться определить IP-адрес интерфейса, к которому подключен клиент. И как кратко предложил Tor Valamo, в настоящее время мы можем легко получить эту информацию из подключенного сокета и его свойства localAddress.

Например, если программа является веб-сервером:

var http = require("http")

http.createServer(function (req, res) {
    console.log(req.socket.localAddress)
    res.end(req.socket.localAddress)
}).listen(8000)

А если это универсальный TCP-сервер:

var net = require("net")

net.createServer(function (socket) {
    console.log(socket.localAddress)
    socket.end(socket.localAddress)
}).listen(8000)

При запуске серверной программы это решение обеспечивает очень высокую мобильность, точность и эффективность.

Подробнее см .:

2 голосов
/ 23 июля 2015

Если вам нравится вся эта краткость, здесь используется lodash :

var os = require('os');
var _ = require('lodash');
var firstLocalIp = _(os.networkInterfaces()).values().flatten().where({ family: 'IPv4', internal: false }).pluck('address').first();

console.log('First local IPv4 address is ' + firstLocalIp);
...