在node.js中获取本地IP地址


Answers:


419
'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

17
var _ = require('underscore'); var ip = _.chain(require('os')。networkInterfaces())。flatten()。filter(function(val){return(val.family =='IPv4'&& val.internal == false)}) .pluck('address')。first()。value(); console.log(ip)
Carter Cole

if( details.family=='IPv4' && details.internal === false ) {如果只需要外部IP,则应该是第六行。
2014年

3
@CarterCole您需要在展平之前额外调用.values()。
Guido

1
如果我只想检索活动接口的IP地址怎么办?
2015年

1
节点> = 7.0.0的不带破折号的单线:Object.values(require('os').networkInterfaces()).reduce((r, list) => r.concat(list.reduce((rr, i) => rr.concat(i.family==='IPv4' && !i.internal && i.address || []), [])), [])
som,

224

截至目前,os.networkInterfaces不适用于Windows。运行程序以解析结果似乎有些困难。这是我用的。

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

这应该返回您的第一个网络接口本地ip。


4
@HermannIngjaldsson:这不是非常详尽的批评。你可以再详细一点吗?也许将示例代码放入一个新问题中,以提供更多详细信息,并询问为什么它不起作用?
Xedecimal 2012年

8
使用DNS查找并非总是一个好主意,因为它可以返回错误的信息(即缓存的数据)。我认为使用“ os.networkInterfaces”是一个更好的主意。
Guido

1
如果您的服务器在某处有dns条目,则可以使用DNS。但是,在许多应用程序中都没有dns条目(例如,我的笔记本电脑)。os.networkInterfaces()可能是可行的方法。
Jeff Whiting

1
请注意,这使用操作系统查找,不一定执行DNS查找,并且应该知道其自己的主要IP地址...
w00t 2015年

如果我得到每个接口的DNS地址
怎么办

203

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

var ip = require("ip");
console.dir ( ip.address() );

@Uri这就是问题的要求
Seb

1
该软件包的文档尚不清楚...我还可以获取广播地址,还是必须自己提供?
迈克尔(Michael)

12
@majidarif我不认为这是不良文献的有效借口
Michael

7
这非常好用。实际上,获取IP地址是一种选择。优秀的。
EvSunWoodard'7

5
它不会为您提供所有适配器的IP地址。如果您已安装Docker,它将提供vEthernet泊坞地址而不是您的实际以太网地址
TetraDev

62

您可以使用os模块找到您机器的任何IP- 这是NodeJS 固有的

var os = require( 'os' );

var networkInterfaces = os.networkInterfaces( );

console.log( networkInterfaces );

您所需要做的就是调用os.networkInterfaces(),您将获得一个易于管理的列表-比按联盟运行ifconfig更容易

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

最好

爱德华多


9
很棒的答案。var ip = networkInterfaces ['eth0'] [0] ['address']
Natus Drew

尽管这看起来很不错,因为它很简单,但实际效果可能取决于您的网络配置。例如,OS X的默认配置中没有eth0,而是en0。
ccnokes

3
为我工作。var address = networkInterfaces['venet0:0'][0].address
安东尼

奇怪的。在SunOS 5.11上,此调用返回一个空对象
Michael

34

这是一个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);

刚刚在OSX Lion上进行了测试,完美。非常感谢!
T3db0t 2012年

我必须在Windows正则表达式中的“ IP”一词之后删除连字符,因为我的输出没有连字符(我使用的是Windows XP 32位)。我不知道这是不是拼写错误,或者您的Windows版本是否真的在“ IP”之后输出连字符,但为了安全起见,我想可以将其设置为可选:filterRE = /\bIP-?[^:\r\n]+:\s*([^\s]+)/g;。除此之外,出色的脚本,真正的救生员。非常感谢!
找不到用户

@jSepia:这可能是本地化的事情。德语Windows打印“ IP地址”;)
user123444555621

足够公平,但是现在您又把它弄坏了:p我的ipconfig输出不包含“ v4”或“ v6”,这似乎是Vista / 7的东西(请参阅technet.microsoft.com/zh-cn/library/bb726952 .aspx
找不到用户

没有理由进行这种黑客攻击。我们现在有os.networkInterfaces()。
布拉德,

32

这是我获取本地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';
}

咖啡版本:getLocalIP = (interfaceName = "en0",version = "IPv4")-> iface = require('os').networkInterfaces()[interfaceName] for alias in iface if (alias.family == version && !alias.internal) return alias.address return "0.0.0.0"
周杰伦

30

安装一个名为ip like的模块

npm install ip

然后使用此代码。

var ip = require("ip");
console.log( ip.address() );

5
这将返回127.0.0.1
WeSam Abdallah

它返回私有IP地址而不是公共IP地址。
Mehmet Kurtipek '19

23

调用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);
    }
});

如果您想知道-这不一定获得世界范围内看到的公共IP地址。
artur 2011年

将是一个很好的解决方案,如果它不依赖于互联网连接,其速度..
雅各布·拉斯克

就我而言,该解决方案是完美的,因为我需要知道发出特定请求的接口的IP。
拉迪肯德

20

您的本地IP始终为127.0.0.1。

然后是网络IP,您可以从ifconfig(* nix)或ipconfig(win)获取。这仅在本地网络中有用。

然后是您的外部/公共IP,只有在您可以以某种方式向路由器询问该IP时,才能获得该IP;或者您可以设置一个外部服务,该外部服务在收到请求时会返回客户端IP地址。还存在其他此类服务,例如whatismyip.com。

在某些情况下(例如,如果您具有WAN连接),网络IP和公用IP是相同的,并且都可以在外部用于访问您的计算机。

如果您的网络IP和公共IP不同,则可能需要让网络路由器将所有传入的连接转发到网络ip。


2013年更新:

现在有一种新方法可以执行此操作,您可以检查连接的套接字对象中是否存在名为的属性localAddress,例如net.socket.localAddress。它返回套接字末端的地址。

最简单的方法是打开一个随机端口并监听它,然后获取地址并关闭套接字。


2015年更新:

前一个不再起作用。


这是否意味着,要获得你需要做一个系统调用的的NodeJS网络地址ifconfigipconfig并解析响应字符串?
user123444555621 2010年

@ Pumbaa80-差不多,除非您的网卡有一些可以调用的驱动程序。此外,如果你有多个网卡(或适配器,像滨地),也没有办法,你可以叫各种各样的功能,并得到一个IP是 IP。因此,解析它并解释of的输出ifconfig几乎是唯一的方法。
Tor Valamo

截至2015年,它看起来像是net.socket回报undefined,因此“新方法”不再起作用。有一个net.Socket,但没有localAddress属性。
trysis 2015年

14

使用npm ip模块

var ip = require('ip');

console.log(ip.address());

> '192.168.0.117'

1
我不知道,如何告诉现在登陆此页面的用户,这是当前上下文中唯一合适的选项。
加根

谢谢@Gagan,谢谢。
KARTHIKEYAN.A

13

下划线破折号的正确衬线是:

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

3
您可以使用:.find({family: 'IPv4', internal: false})以及更简短的代码
-dcohenb

9

这可能是最干净,最简单且没有依赖关系的答案,并且适用于所有平台。

const { lookup } = require('dns').promises;
const { hostname } = require('os');

async function getMyIPAddress(options) {
  return (await lookup(hostname(), options))
    .address;
}

8

我所知道的是我想要以开头的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;
            }
        }
    }
}

当然,如果您要查找其他号码,则只需更改数字即可。


如果地址不以开头192.168怎么办?
阿努

@anu可以将前缀更改为您要查找的前缀,或者使用人们在此处发布的许多其他解决方案之一:-)我的本地IP始终以192.168.该地址开头,这就是为什么我选择了该IP 。
mpen

6

对于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' ]

6

我编写了一个Node.js模块,该模块通过查看哪个网络接口包含您的默认网关来确定您的本地IP地址。

这比从os.networkInterfaces()主机名中选择接口或从DNS查找主机更可靠。它能够忽略VMware虚拟接口,环回和VPN接口,并且可以在Windows,Linux,Mac OS和FreeBSD上运行。在后台,它执行route.exenetstat解析输出。

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 
});

可惜,当语言未设置为英语时,它在Windows上不起作用:(
Javier

1
感谢您报告此错误@JavierG!我已经发布了0.0.2版本,应该可以修复它。
本·哈奇森

5

这是香草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

对于任何对简洁感兴趣的人,这里有一些“单行代码”,它们不需要标准Node安装中不包含的插件/依赖项:

eth0的公共IPv4和IPv6作为数组:

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

eth0的第一个公共IP(通常为IPv4)作为字符串:

var ip = require('os').networkInterfaces().eth0[0].address;

请记住,这些一线是特定于平台的。在OS X上,我en0en1以太网和无线网络连接。在Windows上,我有Local Area ConnectionWireless Network Connection
xverges

如果您想了解公共远程IP(在OS X上),请使用:var ip = require('os')。networkInterfaces()。en0 [1] .address;
Marcelo dos Santos

3

Google在搜索“ node.js get server ip”时将我引向了这个问题,因此,对于那些试图在他们的node.js 服务器程序中尝试实现此目标的人,我们可以为其提供一个替代答案(可能是原始发布者的情况)。

在最琐碎的情况下,服务器仅绑定到一个IP地址,由于我们已经知道绑定到哪个地址(例如,传递给listen()函数的第二个参数),因此无需确定IP地址。

在服务器被绑定到多个IP地址的较平凡的情况下,我们可能需要确定客户端连接的接口的IP地址。如今,正如Tor Valamo所简要建议的那样,我们可以轻松地从连接的套接字及其localAddress属性中获取此信息。

例如,如果程序是Web服务器:

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)

运行服务器程序时,此解决方案可提供很高的可移植性,准确性和效率。

有关更多详细信息,请参见:


3

根据上面的评论,这是当前版本的Node的工作方式:

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()现在返回一个对象而不是数组。


1
我<3 lodash。特别是lodash高尔夫!该_.chain(..)可重新写成_(...)时,.filter(..)可重新写成.where({family: 'IPv4', internal: false}),你可以放下最后的value(),因为.first()它会为你链接的时候。
瑞安·格雷厄姆

3

这是上述示例的变体。过滤掉vMware接口等时要格外小心。如果不传递索引,它将返回所有地址,否则您可能希望将其设置为默认值0,然后传递null以获取所有地址,但您将对其进行整理。如果愿意,您还可以为正则表达式过滤器传入另一个arg

    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

我仅使用节点js就可以做到这一点

作为Node JS

var os = require( 'os' );
var networkInterfaces = Object.values(os.networkInterfaces())
    .reduce((r,a)=>{
        r = r.concat(a)
        return r;
    }, [])
    .filter(({family, address}) => {
        return family.toLowerCase().indexOf('v4') >= 0 &&
            address !== '127.0.0.1'
    })
    .map(({address}) => address);
var ipAddresses = networkInterfaces.join(', ')
console.log(ipAddresses);

作为bash脚本(需要安装节点js)

function ifconfig2 ()
{
    node -e """
        var os = require( 'os' );
        var networkInterfaces = Object.values(os.networkInterfaces())
            .reduce((r,a)=>{
                r = r.concat(a)
                return r;
            }, [])
            .filter(({family, address}) => {
                return family.toLowerCase().indexOf('v4') >= 0 &&
                    address !== '127.0.0.1'
            })
            .map(({address}) => address);
        var ipAddresses = networkInterfaces.join(', ')
        console.log(ipAddresses);
    """
}

2

这是我的变体,允许以可移植的方式同时获取IPv4和IPv6地址:

/**
 * Collects information about the local IPv4/IPv6 addresses of
 * every network interface on the local computer.
 * Returns an object with the network interface name as the first-level key and
 * "IPv4" or "IPv6" as the second-level key.
 * For example you can use getLocalIPs().eth0.IPv6 to get the IPv6 address
 * (as string) of eth0
 */
getLocalIPs = function () {
    var addrInfo, ifaceDetails, _len;
    var localIPInfo = {};
    //Get the network interfaces
    var networkInterfaces = require('os').networkInterfaces();
    //Iterate over the network interfaces
    for (var ifaceName in networkInterfaces) {
        ifaceDetails = networkInterfaces[ifaceName];
        //Iterate over all interface details
        for (var _i = 0, _len = ifaceDetails.length; _i < _len; _i++) {
            addrInfo = ifaceDetails[_i];
            if (addrInfo.family === 'IPv4') {
                //Extract the IPv4 address
                if (!localIPInfo[ifaceName]) {
                    localIPInfo[ifaceName] = {};
                }
                localIPInfo[ifaceName].IPv4 = addrInfo.address;
            } else if (addrInfo.family === 'IPv6') {
                //Extract the IPv6 address
                if (!localIPInfo[ifaceName]) {
                    localIPInfo[ifaceName] = {};
                }
                localIPInfo[ifaceName].IPv6 = addrInfo.address;
            }
        }
    }
    return localIPInfo;
};

这是相同功能的CoffeeScript版本:

getLocalIPs = () =>
    ###
    Collects information about the local IPv4/IPv6 addresses of
      every network interface on the local computer.
    Returns an object with the network interface name as the first-level key and
      "IPv4" or "IPv6" as the second-level key.
    For example you can use getLocalIPs().eth0.IPv6 to get the IPv6 address
      (as string) of eth0
    ###
    networkInterfaces = require('os').networkInterfaces();
    localIPInfo = {}
    for ifaceName, ifaceDetails of networkInterfaces
        for addrInfo in ifaceDetails
            if addrInfo.family=='IPv4'
                if !localIPInfo[ifaceName]
                    localIPInfo[ifaceName] = {}
                localIPInfo[ifaceName].IPv4 = addrInfo.address
            else if addrInfo.family=='IPv6'
                if !localIPInfo[ifaceName]
                    localIPInfo[ifaceName] = {}
                localIPInfo[ifaceName].IPv6 = addrInfo.address
    return localIPInfo

输出示例 console.log(getLocalIPs())

{ lo: { IPv4: '127.0.0.1', IPv6: '::1' },
  wlan0: { IPv4: '192.168.178.21', IPv6: 'fe80::aa1a:2eee:feba:1c39' },
  tap0: { IPv4: '10.1.1.7', IPv6: 'fe80::ddf1:a9a1:1242:bc9b' } }

2

如果您很简单,这里就使用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);


2

与其他答案类似,但更为简洁:

'use strict';

const interfaces = require('os').networkInterfaces();

const addresses = Object.keys(interfaces)
  .reduce((results, name) => results.concat(interfaces[name]), [])
  .filter((iface) => iface.family === 'IPv4' && !iface.internal)
  .map((iface) => iface.address);

1
只是想提一下您可以替换Object.keys(interfaces).reduce(...)Object.values(interfaces).flat(),这将是同一件事。
kimbaudi

2

仅MAC OS的第一个localhost地址的衬板。

在Mac OS上开发应用程序时,想要在电话上对其进行测试,并且需要您的应用程序自动选择localhost ip。

require('os').networkInterfaces().en0.find(elm=>elm.family=='IPv4').address

这只是在提您如何自动找到IP地址。要测试这个,你可以去终端命中

node
os.networkInterfaces().en0.find(elm=>elm.family=='IPv4').address

输出将是您的本地主机IP地址。


2

这是为您提供的一个简洁的单层功能,可实现此功能:

const ni = require('os').networkInterfaces();
Object
  .keys(ni)
  .map(interf =>
    ni[interf].map(o => !o.internal && o.family === 'IPv4' && o.address))
  .reduce((a, b) => a.concat(b))
  .filter(o => o)
  [0];

为了使您的代码更简洁,您可以消除对的调用,reduce并以代替对map的调用flatMap
kimbaudi

2

很多时候,我发现有多个内部和外部接口面向可用(例如:10.0.75.1172.100.0.1192.168.2.3),它的外部一次,我以后真的(172.100.0.1)。

如果其他任何人也有类似的问题,这里还有一个建议,希望可能会对您有所帮助...

const address = Object.keys(os.networkInterfaces())
    // flatten interfaces to an array
    .reduce((a, key) => [
        ...a,
        ...os.networkInterfaces()[key]
    ], [])
    // non-internal ipv4 addresses only
    .filter(iface => iface.family === 'IPv4' && !iface.internal)
    // project ipv4 address as a 32-bit number (n)
    .map(iface => ({...iface, n: (d => ((((((+d[0])*256)+(+d[1]))*256)+(+d[2]))*256)+(+d[3]))(iface.address.split('.'))}))
    // set a hi-bit on (n) for reserved addresses so they will sort to the bottom
    .map(iface => iface.address.startsWith('10.') || iface.address.startsWith('192.') ? {...iface, n: Math.pow(2,32) + iface.n} : iface)
    // sort ascending on (n)
    .sort((a, b) => a.n - b.n)
    [0]||{}.address;

1

我正在使用node.js 0.6.5

$ node -v
v0.6.5

这是我的工作

var util = require('util');
var exec = require('child_process').exec;
function puts(error, stdout, stderr) {
        util.puts(stdout);
}
exec("hostname -i", puts);

这适用于hostname -I(大写i)。它返回机器所有分配的IP地址的列表。您需要的是第一个IP地址。该IP是连接到当前接口的IP。
blueren's

1

这是上述jhurliman答案的多IP版本:

function getIPAddresses() {

    var ipAddresses = [];

    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) {
                ipAddresses.push(alias.address);
            }
        }
    }

    return ipAddresses;
}

1

我意识到这是一个旧线程,但是由于以下原因,我想对最佳答案进行改进:

  • 代码应尽可能自我解释。
  • 应避免使用for ... in ...枚举数组。
  • for ... in ...枚举应经过验证,以确保被枚举的对象包含您要查找的属性。由于javsacript是松散键入的,因此 for ... in ...可以交给任何任意对象处理;验证我们正在寻找的物业是否可用更安全。

    var os = require('os'),
        interfaces = os.networkInterfaces(),
        address,
        addresses = [],
        i,
        l,
        interfaceId,
        interfaceArray;
    
    for (interfaceId in interfaces) {
        if (interfaces.hasOwnProperty(interfaceId)) {
            interfaceArray = interfaces[interfaceId];
            l = interfaceArray.length;
    
            for (i = 0; i < l; i += 1) {
    
                address = interfaceArray[i];
    
                if (address.family === 'IPv4' && !address.internal) {
                    addresses.push(address.address);
                }
            }
        }
    }
    
    console.log(addresses);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.