我有一个简单的Node.js程序在我的机器上运行,我想获得我的程序正在运行的PC的本地IP地址。我如何在Node.js中获得它?
当前回答
你可以通过使用os模块找到你机器的任何IP地址-这是Node.js的本机:
var os = require('os');
var networkInterfaces = os.networkInterfaces();
console.log(networkInterfaces);
你所需要做的就是调用os.networkInterfaces(),你会得到一个容易管理的列表——比按联盟运行ifconfig要简单。
其他回答
这是对已接受答案的修改,它不考虑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);
这将返回一个类似192.168.2.169的IP地址,而不是10.55.1.1。
您的本地IP地址总是127.0.0.1。
然后是网络IP地址,可以从ifconfig (*nix)或ipconfig (win)中获取。这只在本地网络中有用。
然后是你的外部/公共IP地址,你只能通过某种方式向路由器请求它,或者你可以设置一个外部服务,在收到请求时返回客户端IP地址。还有其他类似的服务,比如whatismyip.com。
在某些情况下(例如,如果您有一个广域网连接),网络IP地址和公共IP地址是相同的,并且都可以用于外部访问您的计算机。
如果您的网络和公共IP地址不同,您可能需要让网络路由器将所有传入连接转发到您的网络IP地址。
2013年更新:
现在有了一种新的方法。你可以检查连接的套接字对象的localAddress属性,例如net.socket.localAddress。它返回套接字一端的地址。
最简单的方法是打开一个随机端口并监听它,然后获取您的地址并关闭套接字。
2015年更新:
前面的已经不管用了。
根据注释,以下是当前版本Node.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()现在返回一个对象而不是数组。
使用npm ip模块:
var ip = require('ip');
console.log(ip.address());
> '192.168.0.117'
下面的解决方案对我来说是可行的
const ip = Object.values(require("os").networkInterfaces())
.flat()
.filter((item) => !item.internal && item.family === "IPv4")
.find(Boolean).address;
推荐文章
- jQuery等价于JavaScript的addEventListener方法
- jQuery需要避免的陷阱
- JavaScript中变量字符串的XML解析
- 'React'指的是一个UMD全局,但当前文件是一个模块
- 为什么useState不触发重新渲染?
- 如何使用回调与useState挂钩在反应
- 网络请求失败
- 如何使用JavaScript大写字符串中每个单词的第一个字母?
- 如何使用箭头函数(公共类字段)作为类方法?
- 使用Javascript的atob解码base64不能正确解码utf-8字符串
- 禁用包的postinstall脚本
- 如何阻止恶意代码欺骗“Origin”报头来利用CORS?
- Angular JS:当我们已经有了具有作用域的指令控制器时,指令的link函数还需要什么?
- 我如何在JavaScript中转换对象数组为一个对象?
- 如何让一个按钮将我的页面重定向到另一个页面?