node.jsでローカルIPアドレスを取得する


308

自分のマシンで単純なnode.jsプログラムを実行していますが、プログラムが実行されているPCのローカルIPアドレスを取得したいと考えています。node.jsで取得するにはどうすればよいですか?


1
思考の糧joeyh.name/code/moreutilsgithub.com/polotek/procstreamsをチェックしてください。私は彼らなしで家を出ることはありません。
James

これを試してください:github.com/indutny/node-ip
Stephenの最後の

回答:


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)
カーターコール

6行目は、if( details.family=='IPv4' && details.internal === false ) {外部IPだけが必要な場合です。
Arlen Beiler 2014

3
@CarterColeでは、平坦化する前に.values()への追加の呼び出しが必要です。
グイド

1
アクティブなインターフェースのIPアドレスのみを取得したい場合はどうなりますか?
Tejas、2015

1
ノードのロダッシュなしの1ライナー> = 7.0.0Object.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

8
DNSルックアップは誤った情報(つまり、キャッシュされたデータ)を返す可能性があるため、常にDNSルックアップを使用することはお勧めしません。私の意見では、「os.networkInterfaces」を使用する方が良いアイデアです。
グイド

1
サーバーのどこかにDNSエントリがある場合は、DNSを使用できます。ただし、多くのアプリケーションにはDNSエントリがありません(たとえば、私のラップトップ)。os.networkInterfaces()はおそらく進むべき道です。
ジェフホワイティング、

1
これはOSルックアップを使用することに注意してください。これは必ずしもDNSルックアップを行う必要はなく、独自のプライマリIPアドレスを知っている必要があります...
w00t

各インターフェイスのDNSアドレスを取得した場合
taha027

203

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

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

@Uriこれが質問が求めるものです
Seb

1
このパッケージのドキュメントは不明確です...ブロードキャストアドレスも取得できますか、それとも自分で提供する必要がありますか?
マイケル

12
@majidarif私はそれを貧弱なドキュメントの正当な言い訳として認識していません
Michael

7
これは信じられないほどうまくいきます。IPアドレスの取得は、文字通り1行です。優れた。
EvSunWoodard 2017

5
すべてのアダプタのIPアドレスを提供するわけではありません。Dockerがインストールされている場合、実際のイーサネットアドレスの代わりにvEthernet Dockerアドレスが表示されます
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です。
2015年

3
私のために働く。var address = networkInterfaces['venet0:0'][0].address
Anthony

変。SunOS 5.11では、この呼び出しは空のオブジェクトを返します
Michael

34

以下は、ifconfig見つかった最初のIPアドレスの出力を解析して(非同期で)返すnode.jsコードのスニペットです。

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

2番目のパラメータがの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

出力にハイフンがなかったため(Windows XP 32-bitを使用しています)、Windows正規表現で「IP」という単語の後にあるハイフンを削除する必要がありました。それがタイプミスであったのか、Windowsバージョンで「IP」の後に実際にハイフンが出力されたのかはわかりませんが、念のため、オプションにすることができますfilterRE = /\bIP-?[^:\r\n]+:\s*([^\s]+)/g;。それはさておき、素晴らしいスクリプト、真の命の恩人。どうもありがとう!
ユーザーが

@jSepia:それはおそらくローカリゼーションのことです。ドイツ語版Windowsは「IP-Adresse」を出力します;)
user123444555621 '06 / 07/18

十分に公正ですが、今度はそれをもう一度壊しました:p私のipconfig出力には「v4」も「v6」も含まれていません。これはVista / 7のようです(technet.microsoft.com/en-us/library/bb726952 .aspx
ユーザーが見つかりません

そのようなハッキングの理由はありません。これでos.networkInterfaces()ができました。
ブラッド

32

IPv4アドレスを探していて、マシンに実際のネットワークインターフェイスが1つしかない場合、ローカルIPアドレスを取得するための私のユーティリティメソッドを次に示します。マルチインターフェイスマシンの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"
Jay

30

ip likeというモジュールをインストールします

npm install ip

次に、このコードを使用します。

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

5
これは127.0.0.1を返します
WeSam Abdallah 2017

パブリックIPアドレスではなくプライベートIPアドレスを返します。
Mehmet Kurtipek

23

ifconfigの呼び出しはプラットフォームに非常に依存しており、ネットワーク層はソケットのIPアドレスを知っているため、確認することをお勧めします。ノードはこれを行う直接的な方法を公開していませんが、任意のソケットを開いて、使用されているローカル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

それはインターネット接続とその速度に依存していなかった場合は...素敵な解決策になる
ヤコブラスク

私の場合、特定のリクエストが送信されるインターフェースのIPを知る必要があるため、このソリューションは完璧です。
radicand 2013年

20

ローカルIPは常に127.0.0.1です。

次に、ifconfig(* nix)またはipconfig(win)から取得できるネットワークIPがあります。これは、ローカルネットワーク内でのみ役立ちます。

次に、外部/パブリックIPがあります。これは、ルーターに何らかの方法で要求できる場合にのみ取得できます。または、要求を取得するたびにクライアントIPアドレスを返す外部サービスを設定できます。whatismyip.comのような他のそのようなサービスも存在します。

場合によっては(たとえば、WAN接続がある場合)、ネットワークIPとパブリックIPは同じであり、外部からコンピューターにアクセスするために使用できます。

ネットワークとパブリックIPが異なる場合は、ネットワークルーターにすべての着信接続をネットワークIPに転送させる必要がある場合があります。


2013年更新:

これを行う新しい方法があります。localAddressたとえば、と呼ばれるプロパティの接続のソケットオブジェクトを確認できますnet.socket.localAddress。ソケットの端のアドレスを返します。

最も簡単な方法は、ランダムなポートを開いてそれをリッスンし、アドレスを取得してソケットを閉じることです。


2015年更新:

以前はもう機能しません。


つまり、nodejsでネットワークアドレスを取得するには、システムコールを実行するifconfigipconfig、応答文字列を解析する必要がありますか。
user123444555621

@ Pumbaa80-ネットワークカードに呼び出すことができるいくつかのドライバーがない限り、ほとんどの場合。また、複数のネットワークカード(またはhamachiのようなアダプター)がある場合、ある種の関数を呼び出して1つのIPであるTHE IP を取得する方法はありません。したがって、それを解析しての出力を解釈することが、ifconfigほとんど唯一の方法です。
Tor Valamo

2015年の時点でnet.socket収益が返っundefinedているように見えるため、「これを行う新しい方法」は機能しなくなりました。はありますnet.Socketが、localAddressプロパティはありません。
トリシス

14

npm ipモジュールを使用する

var ip = require('ip');

console.log(ip.address());

> '192.168.0.117'

1
現在のコンテキストでこれが唯一の適切なオプションであることを、このページにアクセスしたユーザーにどのように伝えるかわかりません。
Gagan

@Gaganに感謝します。
KARTHIKEYAN.A

13

アンダースコアロダッシュの両方の正しい1つのライナーは次のとおりです。

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

@anuプレフィックスを探しているものに変更するか、人々がここに投稿した他の多くのソリューションの1つを使用してください:-)私のローカルIPは常に先頭から始まるため、192.168.これを選択しました。
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.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 
});

残念ながら、言語が英語に設定されていない場合、Windowsでは機能しません:(
Javier G.

1
このバグを報告してくれてありがとう、@ JavierG!私はそれを修正するバージョン0.0.2を公開しました。
ベンハッチソン

5

これは、単一のIPを取得するためのバニラJavaScriptの簡易バージョンです。

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(通常はIPv4)の最初のパブリックIP:

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

これらのワンライナーはプラットフォーム固有であることに注意してください。OS X上で、私が持っているen0en1、イーサネットや無線LANのため。Windowsでは、とがLocal Area ConnectionありWireless Network Connectionます。
xverges 2013

パブリックリモートIP(OS Xの場合)について知りたい場合は、次を使用します。var ip = require( 'os')。networkInterfaces()。en0 [1] .address;
Marcelo dos Santos

3

Googleが「node.js get server ip」を検索しているときにこの質問に案内したので、node.js サーバーでこれを達成しようとしている人に別の答えを与えましょうプログラムで(元のポスターの場合もある)。

サーバーが1つだけのIPアドレスにバインドされている最も簡単なケースでは、どのアドレスにバインドしたか(たとえば、2番目のパラメーターが 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)

サーバープログラムを実行する場合、このソリューションは非常に高い移植性、精度、効率を提供します。

詳細については、以下を参照してください。


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

上記の回答の1つに対するコメントには、への呼び出しがありませんでしたvalues()os.networkInterfaces()配列ではなくオブジェクトを返すようになりました。


1
私は3ダッシュ未満です。特にロダッシュゴルフ!_.chain(..)ように書き換えることができ_(...).filter(..)として再記述することができ.where({family: 'IPv4', internal: false})、あなたは、最終的なドロップすることができますvalue()のでが.first()連鎖するときあなたのためにそれを行います。
ライアングラハム

3

上記の例のバリエーションを次に示します。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;
}

3

私はノードjsだけを使用してこれを行うことができました

ノード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()、それは同じことになります。
キンバウディ

2

MAC osの最初のlocalhostアドレスのみの1つのライナー。

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
キンバウディ

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は、稼働中の現在のインターフェースに接続されているものです。
blueren 2018

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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.