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

432

我在我的电脑上运行了一个简单的Node.js程序,我想获取运行该程序的PC的本地IP地址。如何使用Node.js获取它?


1
值得思考的是,可以查看 http://joeyh.name/code/moreutils/ 和 https://github.com/polotek/procstreams。我从不离开家门而没有它们。 - Tegra Detra
尝试一下这个:https://github.com/indutny/node-ip - Stephen Last
44个回答

13

无论是Underscore.js还是Lodash,正确的一行代码为:

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

3
您可以使用.find({family: 'IPv4', internal: false})来编写更短、更优雅的代码。 - dcohenb

12

我可能对这个问题迟到了,但是如果有人想要一个ES6的一行解决方案来获取IP地址数组,那么这应该对你有所帮助:

Object.values(require("os").networkInterfaces())
    .flat()
    .filter(({ family, internal }) => family === "IPv4" && !internal)
    .map(({ address }) => address)

作为

Object.values(require("os").networkInterfaces())

将返回一个数组的数组,因此使用flat()将其展平为单个数组

.filter(({ family, internal }) => family === "IPv4" && !internal)

将数组过滤,只包括IPv4地址,并且如果它不是内部地址

最后

.map(({ address }) => address)

将仅返回过滤数组中的IPv4地址

因此结果将是[ '192.168.xx.xx' ]

如果需要,您可以获取该数组的第一个索引或更改过滤条件

操作系统使用的是Windows


非常好。如果我需要获取网关信息怎么办? - Mendes

11

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

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

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

9

我知道的是我想要以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
@anu 要么更改前缀为您要查找的前缀,要么使用其他人在此处发布的许多其他解决方案 :-) 我的本地IP始终以“192.168.”开头,这就是我选择它的原因。 - mpen

9
这是一个使用纯JavaScript获取单个IP地址的简化版本。
function getServerIp() {

  const os = require('os');
  const ifaces = os.networkInterfaces();
  let 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';
}

8

我可以仅使用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);
    """
}

7

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

7
我编写了一个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 G.
1
感谢您报告这个错误,@JavierG!我已发布版本0.0.2,应该可以解决它。 - Ben Hutchison

7

macOS第一个本地主机地址的一行代码。

在macOS上开发应用程序时,如果您想在手机上测试它并且需要您的应用程序自动选择本地主机IP地址,请使用以下代码:

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

这只是提到如何自动查找IP地址的方法。 测试时,您可以打开终端并输入:
node
os.networkInterfaces().en0.find(elm => elm.family=='IPv4').address

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

5

对于对简洁性感兴趣的任何人,以下是一些“单行代码”,它们不需要插件/依赖项,这些依赖项不是标准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分别为en0en1。而在Windows上,则是本地连接无线网络连接 - xverges
如果您想了解您的公共远程IP(在OS X上),请使用以下命令: var ip = require('os').networkInterfaces().en0[1].address; - Marcelo dos Santos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接