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

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

Ответы [ 36 ]

365 голосов
/ 09 декабря 2011
'use strict';

var os = require('os');
var ifaces = os.networkInterfaces();

Object.keys(ifaces).forEach(function (ifname) {
  var alias = 0;

  ifaces[ifname].forEach(function (iface) {
    if ('IPv4' !== iface.family || iface.internal !== false) {
      // skip over internal (i.e. 127.0.0.1) and non-ipv4 addresses
      return;
    }

    if (alias >= 1) {
      // this single interface has multiple ipv4 addresses
      console.log(ifname + ':' + alias, iface.address);
    } else {
      // this interface has only one ipv4 adress
      console.log(ifname, iface.address);
    }
    ++alias;
  });
});

// en0 192.168.1.101
// eth0 10.0.0.101
212 голосов
/ 03 марта 2012

os.networkInterfaces на данный момент не работает на Windows. Запуск программ для анализа результатов кажется немного сомнительным. Вот что я использую.

require('dns').lookup(require('os').hostname(), function (err, add, fam) {
  console.log('addr: '+add);
})

Это должно вернуть ваш первый локальный IP-интерфейс сетевого интерфейса.

173 голосов
/ 26 декабря 2013

https://github.com/indutny/node-ip

var ip = require("ip");
console.dir ( ip.address() );
52 голосов
/ 17 мая 2013

Любой IP-адрес вашей машины вы можете найти с помощью модуля os - и это native to NodeJS

var os = require( 'os' );

var networkInterfaces = os.networkInterfaces( );

console.log( networkInterfaces );

Все, что вам нужно сделать, это позвонить по номеру os.networkInterfaces () , и вы получите легко управляемый список - проще, чем запустить ifconfig по лигам

http://nodejs.org/api/os.html#os_os_networkinterfaces

Лучший

Эдоардо

32 голосов
/ 18 сентября 2010

Ниже приведен фрагмент кода node.js, который будет анализировать выходные данные ifconfig и (асинхронно) возвращать первый найденный IP-адрес:

(проверено только на MacOS Snow Leopard; надеюсь, он работает натоже linux)

var getNetworkIP = (function () {
    var ignoreRE = /^(127\.0\.0\.1|::1|fe80(:1)?::1(%.*)?)$/i;

    var exec = require('child_process').exec;
    var cached;    
    var command;
    var filterRE;

    switch (process.platform) {
    // TODO: implement for OSs without ifconfig command
    case 'darwin':
         command = 'ifconfig';
         filterRE = /\binet\s+([^\s]+)/g;
         // filterRE = /\binet6\s+([^\s]+)/g; // IPv6
         break;
    default:
         command = 'ifconfig';
         filterRE = /\binet\b[^:]+:\s*([^\s]+)/g;
         // filterRE = /\binet6[^:]+:\s*([^\s]+)/g; // IPv6
         break;
    }

    return function (callback, bypassCache) {
         // get cached value
        if (cached && !bypassCache) {
            callback(null, cached);
            return;
        }
        // system call
        exec(command, function (error, stdout, sterr) {
            var ips = [];
            // extract IPs
            var matches = stdout.match(filterRE);
            // JS has no lookbehind REs, so we need a trick
            for (var i = 0; i < matches.length; i++) {
                ips.push(matches[i].replace(filterRE, '$1'));
            }

            // filter BS
            for (var i = 0, l = ips.length; i < l; i++) {
                if (!ignoreRE.test(ips[i])) {
                    //if (!error) {
                        cached = ips[i];
                    //}
                    callback(error, ips[i]);
                    return;
                }
            }
            // nothing found
            callback(error, null);
        });
    };
})();

Пример использования:

getNetworkIP(function (error, ip) {
    console.log(ip);
    if (error) {
        console.log('error:', error);
    }
}, false);

Если вторым параметром является true, функция будет каждый раз выполнять системный вызов;в противном случае используется кэшированное значение.


Обновленная версия

Возвращает массив всех адресов локальной сети.

Протестировано в Ubuntu 11.04 и Windows XP 32

var getNetworkIPs = (function () {
    var ignoreRE = /^(127\.0\.0\.1|::1|fe80(:1)?::1(%.*)?)$/i;

    var exec = require('child_process').exec;
    var cached;
    var command;
    var filterRE;

    switch (process.platform) {
    case 'win32':
    //case 'win64': // TODO: test
        command = 'ipconfig';
        filterRE = /\bIPv[46][^:\r\n]+:\s*([^\s]+)/g;
        break;
    case 'darwin':
        command = 'ifconfig';
        filterRE = /\binet\s+([^\s]+)/g;
        // filterRE = /\binet6\s+([^\s]+)/g; // IPv6
        break;
    default:
        command = 'ifconfig';
        filterRE = /\binet\b[^:]+:\s*([^\s]+)/g;
        // filterRE = /\binet6[^:]+:\s*([^\s]+)/g; // IPv6
        break;
    }

    return function (callback, bypassCache) {
        if (cached && !bypassCache) {
            callback(null, cached);
            return;
        }
        // system call
        exec(command, function (error, stdout, sterr) {
            cached = [];
            var ip;
            var matches = stdout.match(filterRE) || [];
            //if (!error) {
            for (var i = 0; i < matches.length; i++) {
                ip = matches[i].replace(filterRE, '$1')
                if (!ignoreRE.test(ip)) {
                    cached.push(ip);
                }
            }
            //}
            callback(error, cached);
        });
    };
})();

Пример использования для обновленной версии

getNetworkIPs(function (error, ip) {
console.log(ip);
if (error) {
    console.log('error:', error);
}
}, false);
27 голосов
/ 10 мая 2017

Установите модуль с именем ip, например

npm install ip

, затем используйте этот код.

var ip = require("ip");
console.log( ip.address() );
25 голосов
/ 25 февраля 2013

Вот мой метод получения локального IP-адреса, при условии, что вы ищете адрес IPv4, и у машины есть только один реальный сетевой интерфейс.Он может быть легко реорганизован для получения массива IP-адресов для машин с несколькими интерфейсами.

function getIPAddress() {
  var interfaces = require('os').networkInterfaces();
  for (var devName in interfaces) {
    var iface = interfaces[devName];

    for (var i = 0; i < iface.length; i++) {
      var alias = iface[i];
      if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal)
        return alias.address;
    }
  }

  return '0.0.0.0';
}
22 голосов
/ 16 августа 2011

Вызов ifconfig очень зависит от платформы, и сетевой уровень знает, на каких IP-адресах находится сокет, поэтому лучше спросить об этом. Node не предоставляет прямого способа сделать это, но вы можете открыть любой сокет и спросить, какой локальный IP-адрес используется. Например, открыв сокет для www.google.com:

var net = require('net');
function getNetworkIP(callback) {
  var socket = net.createConnection(80, 'www.google.com');
  socket.on('connect', function() {
    callback(undefined, socket.address().address);
    socket.end();
  });
  socket.on('error', function(e) {
    callback(e, 'error');
  });
}

Случай использования:

getNetworkIP(function (error, ip) {
    console.log(ip);
    if (error) {
        console.log('error:', error);
    }
});
19 голосов
/ 07 сентября 2010

Ваш локальный IP-адрес всегда 127.0.0.1.

Затем есть сетевой IP-адрес, который вы можете получить от ifconfig (* nix) или ipconfig (win). Это полезно только внутри локальной сети.

Тогда есть ваш внешний / публичный IP-адрес, который вы можете получить только в том случае, если вы можете каким-либо образом попросить маршрутизатор об этом, или вы можете настроить внешнюю службу, которая возвращает клиентский IP-адрес всякий раз, когда он получает запрос. Существуют и другие подобные сервисы, например whatismyip.com.

В некоторых случаях (например, если у вас есть подключение к глобальной сети) IP-адрес сети и общедоступный IP-адрес совпадают, и оба они могут использоваться внешне для доступа к вашему компьютеру.

Если ваша сеть и общедоступные IP-адреса различаются, вам может потребоваться, чтобы сетевой маршрутизатор переадресовывал все входящие соединения на ваш ip сети *.


Обновление 2013:

Теперь есть новый способ сделать это, вы можете проверить объект сокета вашего соединения для свойства с именем localAddress, например. net.socket.localAddress. Возвращает адрес на вашем конце сокета.

Самый простой способ - просто открыть случайный порт и прослушать его, затем получить свой адрес и закрыть сокет.


Обновление 2015:

предыдущий больше не работает.

11 голосов
/ 23 июня 2015

Правильный один вкладыш для подчеркивания и lodash :

var ip = require('underscore')
    .chain(require('os').networkInterfaces())
    .values()
    .flatten()
    .find({family: 'IPv4', internal: false})
    .value()
    .address;
...