我的计算机上运行了一个简单的Node.js程序,我想获取运行该程序的PC的本地IP地址。如何使用Node.js进行获取?

评论

思考的食物,请查看joeyh.name/code/moreutils和github.com/polotek/procstreams。我永远不会带着他们离开家。

试试这个:github.com/indutny/node-ip

#1 楼

可以在os.networkInterfaces()中找到此信息,'use strict'; const { networkInterfaces } = require('os'); const nets = networkInterfaces(); const results = Object.create(null); // Or just '{}', an empty object for (const name of Object.keys(nets)) { for (const net of nets[name]) { // Skip over non-IPv4 and internal (i.e. 127.0.0.1) addresses if (net.family === 'IPv4' && !net.internal) { if (!results[name]) { results[name] = []; } results[name].push(net.address); } } } 是一个对象,该对象将网络接口名称映射到其属性(以便一个接口可以具有多个地址):
 // 'results'
{
  "en0": [
    "192.168.1.101"
  ],
  "eth0": [
    "10.0.0.101"
  ],
  "<network name>": [
    "<ip>",
    "<ip alias>",
    "<ip alias>",
    ...
  ]
}
 

 // results["en0"][0]
"192.168.1.101"
 

 q4312079q  

评论


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)
2013年9月9日15:27

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

–圭多
2015年3月4日在9:41

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

– Tejas
15年8月2日在6:54

节点> = 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
19年1月17日,0:15



“下划线”,“ lowdash”,“一个班轮”-总计。

– B T
20年6月12日在15:43

#2 楼

运行程序以解析结果似乎有些困难。这是我使用的方法。
 require('dns').lookup(require('os').hostname(), function (err, add, fam) {
  console.log('addr: ' + add);
})
 

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

评论


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

–十六进制
2012年11月7日在20:11

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

–圭多
13年2月28日在19:55

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

– Jeff Whiting
2015年2月6日在20:54

请注意,这使用OS查找,它不一定进行DNS查找,并且应该知道其自己的主要IP地址...

– w00t
2015年9月3日于10:09

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

–taha027
16年1月25日在9:58

#3 楼

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

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


评论


@Uri这是问题的要求

–Seb
16年11月2日,16:06

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

–迈克尔
17年1月29日在21:33

@majidarif我不认为这是不良文档的有效借口

–迈克尔
17年2月15日在15:11

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

– EvSunWoodard
17年7月25日在20:41

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

– TetraDev
17年12月19日在21:52

#4 楼

您可以使用os模块找到您机器的任何IP地址-这是Node.js的本机:
var os = require('os');

var networkInterfaces = os.networkInterfaces();

console.log(networkInterfaces);

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

评论


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

–纳图斯·德鲁(Natus Drew)
2014年12月11日上午8:13

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

–鸣叫
2015年1月2日,19:49

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

–安东尼
2015年10月2日在20:24

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

–迈克尔
17年1月29日在21:34



这实际上是最好的答案。 os.networkInterfaces()返回一个简单的JSON对象以使用;)

– chankruze
20-09-16在15:52

#5 楼

这是我获取本地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 iface中的别名if(alias.family ==版本&&!alias (内部)返回别名。地址返回“ 0.0.0.0”

–杰伊
2015年3月24日20:58



#6 楼

安装一个名为ip的模块,例如:
npm install ip

,然后使用此代码:
var ip = require("ip");
console.log(ip.address());


评论


这将返回127.0.0.1

– WeSam Abdallah
17年11月24日在1:33

它返回私有IP地址而不是公共IP地址。

– Mehmet Kurtipek
19 Feb 25 '19:38

如何显示正在使用的端口?

– MrMins
20 Sep 5 '19:27

@MrMins, .localPort和
–游牧
20/09/9在15:28



它返回DockerNAT IP

– Michal MikyJankovský
20-09-25在11:29

#7 楼

以下是Node.js代码片段,它将解析ifconfig的输出并(异步)返回找到的第一个IP地址:
(仅在Mac OS X v10.6(Snow Leopard)上进行了测试;我希望
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 OSes without the 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 IP addresses
            var matches = stdout.match(filterRE);

            // JavaScript doesn't have any lookbehind regular expressions, so we need a trick
            for (var i = 0; i < matches.length; i++) {
                ips.push(matches[i].replace(filterRE, ''));
            }

            // 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(Natty Narwhal)和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, '')
                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年5月3日在21:49

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

–找不到用户
2012年7月6日在18:14



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

–user123444555621
2012年7月6日在18:19



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

–找不到用户
2012年7月6日23:40

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

–布拉德
13年5月18日在2:56

#8 楼

调用ifconfig非常依赖于平台,并且网络层确实知道套接字在哪个IP地址上,所以最好问一下。
Node.js并不公开这样做的直接方法,但是您可以打开任何套接字,并询问正在使用的本地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年9月21日在16:05



如果它不依赖于互联网连接及其速度,那将是一个不错的解决方案。

–雅各布·拉斯克(Jacob Rask)
2011年11月1日于10:21

在我的实例中,此解决方案是完美的,因为我需要知道发出特定请求的接口的IP。

–radicand
13-10-18在5:05

#9 楼

您的本地IP地址始终为127.0.0.1。
然后是网络IP地址,您可以从ifconfig(* nix)或ipconfig(win)中获得。这仅在局域网内有用。
然后有您的外部/公共IP地址,只有在您可以以某种方式向路由器询问该IP地址或可以设置返回客户端IP的外部服务时,您才能获取该地址。收到请求时的地址。还存在其他此类服务,例如whatismyip.com。
在某些情况下(例如,如果您具有WAN连接),网络IP地址和公用IP是相同的,并且都可以在外部使用
如果您的网络和公共IP地址不同,则可能需要让网络路由器将所有传入的连接转发到您的网络IP地址。

更新2013年:
现在有一种新的方法。您可以在连接的套接字对象中检查名为localAddress的属性,例如net.socket.localAddress。它返回套接字末端的地址。
最简单的方法是打开一个随机端口并监听它,然后获取您的地址并关闭套接字。

Update 2015 :
以前的版本不再起作用。

评论


这是否意味着要在nodejs中获取网络地址,您需要对ifconfig或ipconfig进行系统调用并解析响应字符串?

–user123444555621
2010-09-18在8:38

@ Pumbaa80-差不多,除非您的网卡有一些可以调用的驱动程序。同样,如果您有多个网卡(或适配器,例如hamachi),则无法调用各种功能并获得一个IP(即IP)。因此,解析它并解释ifconfig的输出几乎是唯一的方法。

– Tor Valamo
2010-09-18 17:25



截至2015年,net.socket的返回值似乎不确定,因此“执行此操作的新方法”不再起作用。有一个net.Socket,但是它没有localAddress属性。

–trysis
2015年4月9日在16:40



#10 楼

使用npm ip模块:
var ip = require('ip');

console.log(ip.address());

> '192.168.0.117'


评论


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

–加甘
19年11月17日下午5:39

谢谢@Gagan您的赞赏。

– KARTHIKEYAN.A
19年11月17日在14:29

#11 楼

对于Underscore.js和Lodash而言,正确的单行代码是:
var ip = require('underscore')
    .chain(require('os').networkInterfaces())
    .values()
    .flatten()
    .find({family: 'IPv4', internal: false})
    .value()
    .address;


评论


您也可以使用.find({family:'IPv4',internal:false})来获得更短,更优雅的代码

– dcohenb
16 Mar 27 '16 at 11:16

#12 楼

这可能是最干净,最简单的答案,没有依赖项,并且可以在所有平台上使用。

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

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


#13 楼

我所知道的是我想要以192.168.开头的IP地址。此代码将为您提供:

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
19年8月7日,下午3:31

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

– mpen
19年8月7日在17:52



#14 楼

我编写了一个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上不起作用:(

–哈维尔G.
17年4月14日在13:22

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

– Ben Hutchison
17年4月22日在9:31

#15 楼

这是使用原始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';
}


#16 楼

对于Linux和macOS使用,如果要通过同步方式获取IP地址,请尝试以下操作:
var ips = require('child_process').execSync("ifconfig | grep inet | grep -v inet6 | awk '{gsub(/addr:/,\"\");print }'").toString().trim().split("\n");
console.log(ips);

结果将是这样的:
['192.168.3.2', '192.168.2.1']


#17 楼

对于对简洁感兴趣的人,这里有一些“单行”,它们不需要标准Node.js安装中不包含的插件/依赖项:
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上,我有用于以太网和wifi的en0和en1。在Windows上,我具有“局域网连接”和“无线网络连接”。

–xverges
13年7月29日在10:39

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

– Marcelo dos Santos
16-4-26的13:47

#18 楼

我仅使用Node.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脚本(需要安装Node.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);
    """
}


#19 楼

以下解决方案适用于我
const ip = Object.values(require("os").networkInterfaces())
        .flat()
        .filter((item) => !item.internal && item.family === "IPv4")
        .find(Boolean).address;


评论


非常好。如果没有找到,请稍作调整:const ip = Object.values(require(“ os”)。networkInterfaces())。flat()。reduce((ip,{family,address,internal})=> ip ||!内部&&家庭==='IPv4'&&地址,'');

–x0a
20-11-08在19:03

#20 楼

Google在搜索“ Node.js获取服务器IP”时将我引向了这个问题,因此,对于那些试图在其Node.js服务器程序中尝试实现此目标的用户,我们可以为其提供替代答案(可能是原始发布者的情况)。
在最简单的情况下,服务器仅绑定到一个IP地址,因此无需确定IP地址,因为我们已经知道将其绑定到哪个地址(例如,第二个参数传递给了listen()函数)。
在服务器绑定到多个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)

运行服务器程序时,此解决方案可提供非常高的可移植性,准确性和效率。
有关更多详细信息,请参见:

http://nodejs.org/api/net.html
http://nodejs.org/api/http.html


#21 楼

根据评论,以下是当前版本的Node.js的工作原理:
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 lodash。特别是lodash高尔夫! _.chain(..)可以重写为_(...),. filter(..)可以重写为.where({family:'IPv4',internal:false}),并且您可以删除最终的value(),因为链接时.first()会为您完成。

–瑞安·格雷厄姆(Ryan Graham)
15年6月17日在22:38

#22 楼

这是先前示例的变体。过滤掉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;
}


#23 楼


在macOS上开发应用程序时,您要在电话上对其进行测试,并且需要您的应用程序自动选择localhost IP地址。
require('os').networkInterfaces().en0.find(elm => elm.family=='IPv4').address


这只是提及如何自动查找ip地址。
要进行测试,可以转到终端命中

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


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


#24 楼

这是我的变体,允许以可移植的方式同时获取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' } }


#25 楼

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

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


评论


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

–kimbaudi
19年7月13日在22:55

#26 楼

这是一个功能齐全的小衬板,可以正常工作:

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
19年7月13日在22:44

#27 楼

很多时候,我发现有多个面向内部和面向外部的接口(例如: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;


#28 楼

用途:
var os = require('os');
var networkInterfaces = os.networkInterfaces();
var arr = networkInterfaces['Local Area Connection 3']
var ip = arr[1].address;


评论


npm install ip //安装模块var ip = require('ip'); //需要模块ip.address()//我的IP地址

– Flaalf
15年5月11日在17:46



一个解释将是有条理的。

– Peter Mortensen
20/12/21在19:12

#29 楼

如果您热衷于简洁,这里使用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); 




#30 楼

我正在使用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);


评论


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

– blueren
'18 Sep 6'在6:26