Получить локальный IP-адрес в node.js
У меня на компьютере запущена простая программа node.js, и я хочу получить локальный IP-адрес ПК, на котором запущена моя программа. Как мне получить его с помощью node.js?
45 ответов
Некоторые ответы здесь показались мне излишне сложными. Вот лучший подход к этому с использованием простого Nodejs.
import os from "os";
const machine = os.networkInterfaces()["Ethernet"].map(item => item.family==="IPv4")
console.log(machine.address) //gives 192.168.x.x or whatever your local address is
См. документацию: NodeJS — модуль os: networkInterfaces
Вот мой вариант, который позволяет получать адреса 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' } }
Много раз я обнаружил, что доступно несколько внутренних и внешних интерфейсов (пример: 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;
Большой вопрос "почему?"
Если вам нужно знать сервер, на котором слушает ваш NODE, вы можете использовать req.hostname
,
Я использую 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);
import os from "os";
const networkAddresses = Object.values(os.networkInterfaces())
.flat()
.reduce(
(result: string[], networkInterface) =>
networkInterface?.family === "IPv4"
? [...result, networkInterface.address]
: result,
[]
);
Вот версия ответа Джурлимана для нескольких 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;
}
Я понимаю, что это старая ветка, но я бы хотел предложить лучший ответ по следующим причинам:
- Код должен быть как можно более понятен.
- Следует избегать перечисления по массиву с использованием 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);
Принятый ответ асинхронный, я хотел синхронную версию, надеюсь, это кому-нибудь поможет.
var os = require('os');
var ifaces = os.networkInterfaces();
console.log(JSON.stringify(ifaces, null, 4));
for (var iface in ifaces) {
var iface = ifaces[iface];
for (var alias in iface) {
var alias = iface[alias];
console.log(JSON.stringify(alias, null, 4));
if ('IPv4' !== alias.family || alias.internal !== false) {
debug("skip over internal (i.e. 127.0.0.1) and non-ipv4 addresses");
continue;
}
console.log("Found ipaddress: " + alias.address);
return alias.address;
}
}
return false;
Вот вариант, который позволяет вам получить локальный IP-адрес (проверено на Mac и Win):
var
// Local ip address that we're trying to calculate
address
// Provides a few basic operating-system related utility functions (built-in)
,os = require('os')
// Network interfaces
,ifaces = os.networkInterfaces();
// Iterate over interfaces ...
for (var dev in ifaces) {
// ... and find the one that matches the criteria
var iface = ifaces[dev].filter(function(details) {
return details.family === 'IPv4' && details.internal === false;
});
if(iface.length > 0) address = iface[0].address;
}
// Print the result
console.log(address); // 10.25.10.147
const { networkInterfaces } = require('os')
const nets = networkInterfaces()const адрес = nets['Wi-Fi'][1].адрес
Для получения IP-адреса в узле js нам нужно включить три модуля - connect, net и request-ip. Если у вас не установлены эти модули, давайте сначала установим эти модули, используя npm.
Данная ссылка содержит решение, которое вы хотите, пожалуйста, пройдите по нему -
Вот лучшее рабочее решение (узел v18.1.0):
function getLocalIP() {
const os = require("os");
const networkInterfaces = os.networkInterfaces();
for (const name of Object.keys(networkInterfaces)) {
for (const net of networkInterfaces[name]) {
if (net.family == 4 && !net.internal) return net.address;
}
}
}
Использование внутреннего IP:
const internalIp = require("internal-ip")
console.log(internalIp.v4.sync())
Если вы не хотите устанавливать зависимости и используете систему *nix, вы можете сделать:
hostname -I
И вы получите все адреса для хоста, вы можете использовать эту строку в узле:
const exec = require('child_process').exec;
let cmd = "hostname -I";
exec(cmd, function(error, stdout, stderr)
{
console.log(stdout + error + stderr);
});
Это одна строка, и вам не нужны другие библиотеки, такие как 'os' или 'node-ip', которые могут добавить случайную сложность вашему коду.
hostname -h
Тоже твой друг;-)
Надеюсь, поможет!