Hoe kan ik het lokale IP-adres in Node.js krijgen?

Ik heb het niet over

127.0.0.1

Maar eerder degene die andere computers zouden gebruiken om toegang te krijgen tot de machine, bijvoorbeeld

192.168.1.6


Antwoord 1, autoriteit 100%

http://nodejs.org/api/os.html#os_os_networkinterfaces

var os = require('os');
var interfaces = os.networkInterfaces();
var addresses = [];
for (var k in interfaces) {
    for (var k2 in interfaces[k]) {
        var address = interfaces[k][k2];
        if (address.family === 'IPv4' && !address.internal) {
            addresses.push(address.address);
        }
    }
}
console.log(addresses);

Antwoord 2, autoriteit 85%

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

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

Antwoord 3, autoriteit 8%

Mijn versie die nodig was voor een compact script met één bestand, hoop nuttig te zijn voor anderen:

var ifs = require('os').networkInterfaces();
var result = Object.keys(ifs)
  .map(x => [x, ifs[x].filter(x => x.family === 'IPv4')[0]])
  .filter(x => x[1])
  .map(x => x[1].address);

Of om de oorspronkelijke vraag te beantwoorden:

var ifs = require('os').networkInterfaces();
var result = Object.keys(ifs)
  .map(x => ifs[x].filter(x => x.family === 'IPv4' && !x.internal)[0])
  .filter(x => x)[0].address;

Antwoord 4, autoriteit 7%

$ npm install --save quick-local-ip

gevolgd door

var myip = require('quick-local-ip');
//getting ip4 network address of local system
myip.getLocalIP4();
//getting ip6 network address of local system
myip.getLocalIP6();

Antwoord 5, autoriteit 4%

https://github.com/dominictarr/my-local-ip

$ npm install -g my-local-ip
$ my-local-ip

of

$ npm install --save my-local-ip
$ node
> console.log(require('my-local-ip')())

Een zeer kleine module die precies dit doet.


Antwoord 6

wilde one-liner inkomend

gebaseerd op geaccepteerd antwoord, zal deze een array van objecten bouwen met voorwaardelijke invoer, afhankelijk van adreseigenschappen

[{name: {interface name}, ip: {ip address}}, ...]
const ips = Object.entries(require("os").networkInterfaces()).reduce((acc, iface) => [...acc, ...(iface[1].reduce((acc, address) => acc || (address.family === "IPv4" && !address.internal), false) ? [{name: iface[0], ip: iface[1].filter(address => address.family === "IPv4" && !address.internal).map(address => address.address)[0]}] : [])], []);
console.log(ips);

Uitgelegd:

const ips = Object.entries(require("os").networkInterfaces()) // fetch network interfaces
.reduce((acc, iface) => [ // reduce to build output object
    ...acc, // accumulator
    ...(
        iface[1].reduce((acc, address) => acc || (address.family === "IPv4" && !address.internal), false) ? // conditional entry
        [ // validate, insert it in output
            { // create {name, ip} object
                name: iface[0], // interface name
                ip: iface[1] // interface IP
                .filter(address => address.family === "IPv4" && !address.internal) // check is IPv4 && not internal
                .map(address => address.address)[0] // get IP
            }
        ] 
        : 
        [] // ignore interface && ip
    )
], []);

Uitvoervoorbeeld:

Array(4) [Object, Object, Object, Object]
length:4
__proto__:Array(0) [, …]
0:Object {name: "vEthernet (WSL)", ip: "172.31.xxx.x"}
1:Object {name: "Ethernet", ip: "10.0.x.xx"}
2:Object {name: "VMware Network Adapter VMnet1", ip: "192.168.xxx.x"}
3:Object {name: "VMware Network Adapter VMnet8", ip: "192.168.xx.x"}

Antwoord 7

Sinds Node versie 0.9.6 is er een eenvoudige manier om het IP-adres van de server op basis van elk verzoek te krijgen. Dit kan belangrijk zijn als uw machine meerdere IP-adressen heeft of zelfs als u iets op localhost doet.

req.socket.localAddressretourneert het adres van het machineknooppunt waarop wordt uitgevoerd op basis van de huidige verbinding.

Als je een openbaar IP-adres hebt van 1.2.3.4en iemand raakt je node-server van buitenaf, dan is de waarde voor req.socket.localAddress"1.2.3.4".

Als u dezelfde server van localhost bereikt, is het adres "127.0.0.1"

Als uw server meerdere openbare adressen heeft, is de waarde van req.socket.localAddresshet juiste adres van de socketverbinding.


Antwoord 8

Een beetje aangepast Ebrahims antwoordmet wat es6 en modulesyntaxis, voor slankere code:

import { networkInterfaces } from "os";
const netInterfaces = networkInterfaces();
const [{ address }] = Object.values(netInterfaces).flatMap((netInterface) =>
  netInterface.filter((prop) => prop.family === "IPv4" && !prop.internal)
);
console.log(address) // -> '192.168...'

Other episodes