代码之家  ›  专栏  ›  技术社区  ›  yojimbo87 jesuisbonbon

获取本地IP地址节点.js

  •  259
  • yojimbo87 jesuisbonbon  · 技术社区  · 15 年前

    我有一个简单的问题节点.js程序运行在我的机器上,我想得到本地IP地址的PC上运行我的程序。我怎样才能得到它Node.js?

    36 回复  |  直到 5 年前
        1
  •  467
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    此信息可在中找到 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"
    
        2
  •  231
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    运行程序来解析结果似乎有点不确定。这是我用的。

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

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

        3
  •  211
  •   Jan Jůna    12 年前

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

    var ip = require("ip");
    console.dir ( ip.address() );
    
        4
  •  65
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    您可以使用 模块-这就是 本地的 至节点.js:

    var os = require('os');
    
    var networkInterfaces = os.networkInterfaces();
    
    console.log(networkInterfaces);
    

    你只需要打个电话 os.networkInterfaces() 你会得到一个易于管理的列表-比跑步更容易 命令 按联盟。

        5
  •  38
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    ip 比如:

    npm install ip
    

    然后使用以下代码:

    var ip = require("ip");
    console.log(ip.address());
    
        6
  •  37
  •   Peter Mortensen Pieter Jan Bonestroo    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';
    }
    
        7
  •  34
  •   Gern Blanston    5 年前

    以下是节点.js将解析 ifconfig 并(异步)返回找到的第一个IP地址:

    (它是在 Mac OS X v10.6 (SnowLeopard)只有;我希望它也能在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 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, '$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

    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);
    
        8
  •  23
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    节点.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);
        }
    });
    
        9
  •  20
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    您的本地IP地址始终为127.0.0.1。

    ifconfig (*nix)或 ipconfig

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

    在某些情况下(例如,如果您有一个广域网连接),网络IP地址和公共IP是相同的,都可以在外部使用,以达到您的计算机。

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


    2013年更新:

    现在有了一种新的方法。您可以检查连接的socket对象中名为 localAddress ,例如。 net.socket.localAddress . 它返回套接字一端的地址。

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


    2015年更新:

    前一个已经不起作用了。

        10
  •  16
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    使用 npm ip

    var ip = require('ip');
    
    console.log(ip.address());
    
    > '192.168.0.117'
    
        11
  •  13
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    正确的一个衬里 Underscore.js Lodash 是:

    var ip = require('underscore')
        .chain(require('os').networkInterfaces())
        .values()
        .flatten()
        .find({family: 'IPv4', internal: false})
        .value()
        .address;
    
        12
  •  11
  •   user87064    7 年前

    下面是一个最简洁、最简单的答案,它不依赖于所有平台。

    const { lookup } = require('dns').promises;
    const { hostname } = require('os');
    
    async function getMyIPAddress(options) {
      return (await lookup(hostname(), options))
        .address;
    }
    
        13
  •  9
  •   mpen    8 年前

    我只知道我想要以 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;
                }
            }
        }
    }
    

        14
  •  6
  •   Ben Hutchison    9 年前

    我写了一封信 Node.js module

    这比从中选择接口更可靠 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 
    });
    
        15
  •  6
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    下面是一个使用vanilla 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
  •  6
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    对于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']
    
        17
  •  5
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

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

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

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

    var ip = require('os').networkInterfaces().eth0[0].address;
    
        18
  •  5
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    作为节点.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);
    

    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
  •  3
  •   FDisk    5 年前

    const ip = Object.values(require("os").networkInterfaces())
            .flat()
            .filter((item) => !item.internal && item.family === "IPv4")
            .find(Boolean).address;
    
        20
  •  3
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    Google在我搜索的时候把我引向了这个问题 服务器 程序(可能是原始海报的情况)。

    listen() 函数)。

    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)
    

    有关详细信息,请参阅:

        21
  •  3
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    根据评论,以下是当前版本的节点.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() 现在返回一个对象而不是数组。

        22
  •  3
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    这是前面例子的一个变体。小心过滤掉 VMware 接口等。如果不传递索引,它将返回所有地址。否则,您可能希望将其默认值设置为0,然后只传递null以获取all,但您将对此进行排序。如果愿意添加,还可以为regex过滤器传入另一个参数。

    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
  •  3
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    如果你对简洁感兴趣的话,这里是用 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);
        24
  •  3
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    在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地址。

        25
  •  2
  •   Uli Köhler    11 年前

    以下是我的变体,它允许以可移植的方式获取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' } }
    
        26
  •  2
  •   Facundo Olano    9 年前

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

    '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);
    
        27
  •  2
  •   A T    8 年前

    这里有一个整洁的小内衬为您做到这一点的功能:

    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];
    
        28
  •  2
  •   Dave Templin    8 年前

    很多时候,我发现有多个面向内部和外部的接口可用(例如: 10.0.75.1 172.100.0.1 , 192.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;
    
        29
  •  2
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    用途:

    var os = require('os');
    var networkInterfaces = os.networkInterfaces();
    var arr = networkInterfaces['Local Area Connection 3']
    var ip = arr[1].address;
    
        30
  •  2
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    这是对已接受答案的修改,不考虑vEthernet IP地址,例如 Docker

    /**
     * Get local IP address, while ignoring vEthernet IP addresses (like from Docker, etc.)
     */
    let localIP;
    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(ifname === 'Ethernet') {
             if (alias >= 1) {
                // This single interface has multiple IPv4 addresses
                // console.log(ifname + ':' + alias, iface.address);
             } else {
                // This interface has only one IPv4 address
                // console.log(ifname, iface.address);
             }
             ++alias;
             localIP = iface.address;
          }
       });
    });
    console.log(localIP);
    

    这将返回一个IP地址,如 192.168.2.169 而不是 10.55.1.1

    推荐文章