รับ IP แอดเดรสโลคัลใน node.js


308

ฉันมีโปรแกรม node.js ที่ใช้งานง่ายบนเครื่องของฉันและฉันต้องการรับที่อยู่ IP ของพีซีที่โปรแกรมของฉันทำงานอยู่ ฉันจะรับมันด้วย node.js ได้อย่างไร


1
อาหารสำหรับการตรวจสอบความคิดออกjoeyh.name/code/moreutilsและgithub.com/polotek/procstreams ฉันไม่เคยออกจากบ้านโดยไม่ใช้มัน
James

คำตอบ:


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 _ = ต้องการ ('ขีดล่าง'); var ip = _.chain (ต้องการ ('os'). networkInterfaces ()). แผ่แบน (). filter (ฟังก์ชั่น (val) {return (val.family == 'IPv4' && val.internal == false)}) .. .pluck ( 'ที่อยู่') ครั้งแรก () มูลค่า (); console.log (ip)
Carter Cole

บรรทัดที่หกควรเป็นif( details.family=='IPv4' && details.internal === false ) {ถ้าคุณต้องการ IP ภายนอก
Arlen Beiler

3
@CarterCole คุณต้องโทรเพิ่มค่า. () ก่อนที่จะแบน
Guido

1
ถ้าฉันต้องการเรียกคืนเฉพาะที่อยู่ IP ของอินเตอร์เฟสที่ใช้งานอยู่
Tejas

1
หนึ่งซับโดยไม่ต้อง lodash สำหรับโหนด> = 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 || []), [])), [])
ส้ม

224

os.networkInterfaces ณ ตอนนี้ไม่สามารถใช้งานกับ windows ได้ การเรียกใช้โปรแกรมเพื่อแยกวิเคราะห์ผลลัพธ์ดูเหมือนว่าไม่แน่นอน นี่คือสิ่งที่ฉันใช้

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

สิ่งนี้จะส่งคืน IP โลคัลอินเตอร์เฟสเครือข่ายแรกของคุณ


4
@ HermannIngjaldsson: นี่ไม่ใช่คำวิจารณ์ที่ให้ข้อมูลอย่างละเอียด คุณเจาะจงมากกว่านี้ไหม? อาจนำโค้ดตัวอย่างมาใส่ไว้ในคำถามใหม่ที่ให้รายละเอียดเพิ่มเติมและถามว่าทำไมมันไม่ทำงาน
Xedecimal

8
ไม่ใช่ความคิดที่ดีเสมอไปที่จะใช้การค้นหา DNS เนื่องจากสามารถส่งคืนข้อมูลที่ไม่ถูกต้อง (เช่นข้อมูลแคช) การใช้ 'os.networkInterfaces' เป็นความคิดที่ดีกว่าในความคิดของฉัน
กุยโด้

1
การใช้ DNS จะทำงานหากเซิร์ฟเวอร์ของคุณมีรายการ DNS อย่างไรก็ตามในแอปพลิเคชันจำนวนมากไม่มีรายการ DNS (เช่นแล็ปท็อปของฉัน) os.networkInterfaces () อาจเป็นวิธีที่จะไป
Jeff Whiting

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
เอกสารประกอบสำหรับแพ็คเกจนี้ไม่ชัดเจน ... ฉันสามารถรับที่อยู่ออกอากาศได้หรือฉันต้องจัดหาเอง
Michael

12
@majidarif ฉันไม่ยอมรับว่าเป็นข้อแก้ตัวที่ถูกต้องสำหรับเอกสารที่ไม่ดี
ไมเคิล

7
มันใช้งานได้ดีอย่างไม่น่าเชื่อ การรับที่อยู่ IP เป็นหนึ่งซับ ยอดเยี่ยม
EvSunWoodard

5
มันไม่ได้ให้ที่อยู่ IP ของอะแดปเตอร์ทั้งหมด หากคุณติดตั้ง Docker ไว้จะให้ที่อยู่ vEthernet docker แทนที่อยู่ Ethernet จริงของคุณ
TetraDev

62

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

ดีที่สุด

Edoardo


9
คำตอบที่ยอดเยี่ยม var ip = networkInterfaces ['eth0'] [0] ['address']
Natus Drew

ในขณะที่สิ่งนี้ดูดีเพราะใช้งานง่าย แต่ประสิทธิภาพที่แท้จริงอาจขึ้นอยู่กับการกำหนดค่าเครือข่ายของคุณ ตัวอย่างเช่นไม่มี eth0 ในการกำหนดค่าเริ่มต้นของ OS X มันคือ 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

ฉันต้องลบเครื่องหมายขีดคั่นหลังจากคำว่า "IP" ใน regexp Windows ของคุณเนื่องจากผลลัพธ์ของฉันไม่มีเครื่องหมายขีดคั่น (ฉันใช้ Windows XP 32 บิต) ผมไม่ทราบว่าเป็นพิมพ์ผิดหรือถ้า Windows รุ่นของคุณจริงๆเอาท์พุทยัติภังค์หลัง "IP" filterRE = /\bIP-?[^:\r\n]+:\s*([^\s]+)/g;แต่เพียงที่จะอยู่ในด้านความปลอดภัยที่ฉันคิดว่ามันสามารถทำให้ตัวเลือก: นอกจากนั้นสคริปต์ที่ยอดเยี่ยมผู้ช่วยชีวิตที่แท้จริง ขอบคุณมาก!
ไม่พบผู้ใช้

@jSepia: นั่นอาจเป็นเรื่องการแปล Windows ภาษาเยอรมันพิมพ์ "IP-Adresse";)
123444555621

ยุติธรรมเพียงพอ แต่ตอนนี้คุณแตกได้อีก: p เอาต์พุต ipconfig ของฉันไม่รวม "v4" หรือ "v6" ซึ่งดูเหมือนว่าจะเป็น Vista / 7 (ดูที่technet.microsoft.com/en-us/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';
}

รุ่น Coffee: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

มันจะส่งคืนที่อยู่ 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

จะเป็นวิธีการแก้ปัญหาที่ดีถ้ามันไม่ได้ขึ้นอยู่กับการเชื่อมต่ออินเทอร์เน็ตและความเร็วของมัน ..
จาค็อบ Rask

ในอินสแตนซ์ของฉันโซลูชันนี้สมบูรณ์แบบเนื่องจากฉันจำเป็นต้องทราบ IP ของอินเทอร์เฟซที่มีคำขอพิเศษเกิดขึ้น
radicand

20

IP ท้องถิ่นของคุณคือ 127.0.0.1 เสมอ

จากนั้นมี IP เครือข่ายซึ่งคุณสามารถรับได้จากifconfig(* ระวัง) หรือipconfig (ชนะ) สิ่งนี้มีประโยชน์เฉพาะในเครือข่ายท้องถิ่น

จากนั้นมี IP ภายนอก / สาธารณะของคุณซึ่งคุณจะได้รับก็ต่อเมื่อคุณสามารถขอเราเตอร์จากมันได้หรือคุณสามารถตั้งค่าบริการภายนอกซึ่งจะส่งคืนที่อยู่ IP ของไคลเอ็นต์เมื่อใดก็ตามที่ได้รับคำขอ นอกจากนี้ยังมีบริการอื่น ๆ ที่มีอยู่เช่น whatismyip.com

ในบางกรณี (เช่นหากคุณมีการเชื่อมต่อ WAN) IP เครือข่ายและ IP สาธารณะจะเหมือนกันและสามารถใช้ภายนอกทั้งสองเพื่อเข้าถึงคอมพิวเตอร์ของคุณ

หากเครือข่ายและ IP สาธารณะของคุณแตกต่างกันคุณอาจต้องให้เราเตอร์เครือข่ายส่งต่อการเชื่อมต่อขาเข้าทั้งหมดไปยังเครือข่าย ip ของคุณ


อัปเดต 2013:

มีวิธีการใหม่ของการทำเช่นนี้ตอนนี้คุณสามารถตรวจสอบวัตถุซ็อกเก็ตของการเชื่อมต่อของคุณสำหรับคุณสมบัติที่เรียกว่าเช่นlocalAddress net.socket.localAddressมันจะส่งคืนที่อยู่ที่ปลายซ็อกเก็ตของคุณ

วิธีที่ง่ายที่สุดคือเพียงเปิดพอร์ตสุ่มและฟังจากนั้นรับที่อยู่ของคุณและปิดซ็อกเก็ต


อัปเดตปี 2015:

ก่อนหน้านี้ไม่ทำงานอีกต่อไป


นั่นหมายความว่าการรับเน็ตเวิร์กแอดเดรสใน nodejs คุณต้องทำการเรียกระบบไปยังifconfigหรือipconfigและแยกสตริงการตอบกลับ?
user123444555621

@ Pumbaa80 - ค่อนข้างดีเว้นแต่ว่าการ์ดเครือข่ายของคุณมีไดรเวอร์บางตัวที่คุณสามารถโทรได้ นอกจากนี้ถ้าคุณมีบัตรหลายเครือข่าย (หรืออะแดปเตอร์เช่น Hamachi) มีวิธีที่คุณก็สามารถเรียกใช้ฟังก์ชันของแปลกและได้รับหนึ่ง IP ซึ่งไม่มีIP ดังนั้นการแยกวิเคราะห์และตีความผลลัพธ์ของวิธีการค่อนข้างมาก ifconfig
Tor Valamo

ดูเหมือนว่าnet.socketผลตอบแทนundefinedณ ปี 2558 ดังนั้น "วิธีการใหม่ในการทำเช่นนี้" จะไม่ทำงานอีกต่อไป มีnet.Socketแต่มันไม่มีlocalAddressคุณสมบัติ
trysis

14

ใช้โมดูล ip npm

var ip = require('ip');

console.log(ip.address());

> '192.168.0.117'

1
ฉันไม่รู้จะบอกผู้ใช้ที่เข้ามาที่หน้านี้ได้อย่างไรว่านี่เป็นตัวเลือกที่เหมาะสมในบริบทปัจจุบัน
Gagan

ขอบคุณ @Gagan
KARTHIKEYAN.A

13

ซับหนึ่งที่ถูกต้องสำหรับทั้งขีดล่างและ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

9

นี่คือสิ่งที่อาจเป็นคำตอบที่สะอาดและง่ายที่สุดโดยไม่มีการอ้างอิง & ที่ใช้ได้กับทุกแพลตฟอร์ม

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

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

8

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

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 เดียว:

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

สำหรับทุกคนที่สนใจในความกะทัดรัดนี่คือ "one-liners" ที่ไม่ต้องการปลั๊กอิน / การพึ่งพาที่ไม่ได้เป็นส่วนหนึ่งของการติดตั้งโหนดมาตรฐาน:

Public IPv4 และ IPv6 ของ eth0 เป็น Array:

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

IP สาธารณะแรกของ eth0 (ปกติคือ IPv4) เป็นสตริง:

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

โปรดทราบว่าหนึ่ง liners เหล่านี้เป็นแพลตฟอร์มเฉพาะ บน OS X ฉันมีen0และen1สำหรับอีเธอร์เน็ตและ wifi บน Windows, ฉันมีและLocal Area Connection Wireless Network Connection
xverges

หากคุณต้องการทราบเกี่ยวกับ IP สาธารณะระยะไกลของคุณ (ใน OS X) ให้ใช้: var ip = ต้องการ ('os'). networkInterfaces (). en0 [1] .address;
Marcelo dos Santos

3

Google นำฉันไปที่คำถามนี้ในขณะที่ค้นหา"node.js get server ip"ดังนั้นให้คำตอบทางเลือกสำหรับผู้ที่พยายามบรรลุเป้าหมายนี้ในโปรแกรมเซิร์ฟเวอร์ node.js (อาจเป็นกรณีของโปสเตอร์ดั้งเดิม)

ในกรณีที่ไม่สำคัญที่สุดที่เซิร์ฟเวอร์ถูกผูกไว้กับที่อยู่ IP เดียวเท่านั้นไม่จำเป็นต้องกำหนดที่อยู่ IP เนื่องจากเราทราบแล้วว่าที่อยู่ใดที่เราผูกไว้ (เช่นพารามิเตอร์ตัวที่สองส่งผ่านไปยัง listen()ฟังก์ชัน)

ในกรณีเล็ก ๆ น้อย ๆ ที่เซิร์ฟเวอร์ถูกผูกไว้กับที่อยู่ IP หลายแห่งเราอาจต้องกำหนดที่อยู่ IP ของอินเทอร์เฟซที่ไคลเอ็นต์เชื่อมต่ออยู่ และตามคำแนะนำสั้น ๆ ของ Tor Valamo ทุกวันนี้เราสามารถรับข้อมูลนี้จากซ็อกเก็ตที่เชื่อมต่อและมันได้อย่างง่ายดาย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)

เมื่อรันโปรแกรมเซิร์ฟเวอร์โซลูชันนี้ให้การพกพาความแม่นยำและประสิทธิภาพสูงมาก

สำหรับรายละเอียดเพิ่มเติมดู:


3

จากความคิดเห็นด้านบนนี่คือสิ่งที่ใช้ได้กับโหนดรุ่นปัจจุบัน:

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()ไม่ได้สำหรับคุณเมื่อผูกมัด
Ryan Graham

3

นี่คือตัวอย่างของตัวอย่างข้างต้น มันจะระมัดระวังในการกรองอินเทอร์เฟซ vMware เป็นต้นหากคุณไม่ผ่านดัชนีมันจะส่งกลับที่อยู่ทั้งหมดไม่เช่นนั้นคุณอาจต้องการตั้งค่าเริ่มต้นเป็น 0 จากนั้นเพียงส่งผ่านค่า null เพื่อรับทั้งหมด แต่คุณจะคัดออก คุณสามารถส่งต่ออาร์กิวเมนต์อื่นสำหรับตัวกรอง 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;
}

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

ในฐานะที่เป็นสคริปต์ทุบตี (ต้องติดตั้งโหนด 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

หนึ่งซับสำหรับที่อยู่ localhost แรกของ MAC เท่านั้น

เมื่อพัฒนาแอพบน mac os และต้องการทดสอบบนโทรศัพท์และต้องการให้แอปของคุณเลือก localhost ip โดยอัตโนมัติ

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

นี่เป็นเพียงการกล่าวถึงวิธีที่คุณสามารถค้นหาที่อยู่ IP โดยอัตโนมัติ เพื่อทดสอบสิ่งนี้คุณสามารถไปที่ terminal hit

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

ผลลัพธ์จะเป็นที่อยู่ IP localhost ของคุณ


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.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;

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

1

นี่คือคำตอบของ jhurliman ในเวอร์ชั่น multi-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

ฉันรู้ว่านี่เป็นหัวข้อเก่า แต่ฉันต้องการเสนอการปรับปรุงคำตอบยอดนิยมด้วยเหตุผลดังต่อไปนี้:

  • รหัสควรจะอธิบายด้วยตนเองเท่าที่จะทำได้
  • ควรหลีกเลี่ยงการระบุอาร์เรย์ที่ใช้สำหรับ ... ใน ...
  • สำหรับ ... ใน ... การแจงนับควรได้รับการตรวจสอบความถูกต้องเพื่อให้แน่ใจว่าวัตถุที่ถูกระบุมีคุณสมบัติที่คุณกำลังมองหา ในฐานะที่เป็น javsacript พิมพ์อย่างอิสระและ สำหรับ ... ใน ...สามารถส่งมอบวัตถุใด ๆ ในการจัดการ; การตรวจสอบคุณสมบัติที่เรากำลังมองหานั้นปลอดภัยกว่า

    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.