在 Node.js 中获取本地 IP 地址
我的机器上运行着一个简单的 Node.js 程序,我想获取运行我的程序的 PC 的本地 IP 地址。如何使用 Node.js 获取它?
I have a simple Node.js program running on my machine and I want to get the local IP address of a PC on which my program is running. How do I get it with Node.js?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(30)
使用:
Use:
我只使用 Node.js 就能做到这一点。
作为 Node.js:
作为 Bash 脚本(需要安装 Node.js)
I was able to do this using just Node.js.
As Node.js:
As Bash script (needs Node.js installed)
我编写了一个 Node.js 模块,它通过查看哪个来确定您的本地 IP 地址网络接口包含您的默认网关。
这比从 os.networkInterfaces() 中选择接口或主机名的 DNS 查找更可靠。它能够忽略 VMware 虚拟接口、环回和 VPN 接口,并且可以在 Windows、Linux、Mac OS 和 FreeBSD 上运行。在底层,它执行
route.exe
或netstat
并解析输出。I wrote a Node.js module that determines your local IP address by looking at which network interface contains your default gateway.
This is more reliable than picking an interface from
os.networkInterfaces()
or DNS lookups of the hostname. It is able to ignore VMware virtual interfaces, loopback, and VPN interfaces, and it works on Windows, Linux, Mac OS, and FreeBSD. Under the hood, it executesroute.exe
ornetstat
and parses the output.对于 Linux 和 macOS 使用,如果您想通过同步方式获取 IP 地址,请尝试以下操作:
结果将如下所示:
For Linux and macOS uses, if you want to get your IP addresses by a synchronous way, try this:
The result will be something like this:
仅适用于 macOS 第一个本地主机地址的一个衬垫。
在 macOS 上开发应用程序时,您想在手机上测试它,并且需要您的应用程序自动选择本地主机 IP 地址。
One liner for macOS first localhost address only.
When developing applications on macOS, and you want to test it on the phone, and need your app to pick the localhost IP address automatically.
对于任何对简洁感兴趣的人,这里有一些不需要不属于标准 Node.js 安装的插件/依赖项的“一行”:
eth0 的公共 IPv4 和 IPv6 地址作为数组:
eth0 的第一个公共 IP 地址(通常是 IPv4)作为字符串:
For anyone interested in brevity, here are some "one-liners" that do not require plugins/dependencies that aren't part of a standard Node.js installation:
Public IPv4 and IPv6 address of eth0 as an array:
First public IP address of eth0 (usually IPv4) as a string:
以下解决方案对我有用
The following solution works for me
Google 在搜索“Node.js 获取服务器 IP”时向我提出了这个问题,因此,让我们为那些试图在 Node.js 服务器中实现此目标的人提供一个替代答案程序(可能是原海报的情况)。
在服务器仅绑定到一个 IP 地址的最简单情况下,应该不需要确定 IP 地址,因为我们已经知道将其绑定到哪个地址(例如,传递给
listen 的第二个参数) ()
函数)。在服务器绑定到多个 IP 地址的不太重要的情况下,我们可能需要确定客户端连接的接口的 IP 地址。正如 Tor Valamo 简要建议的那样,如今,我们可以轻松地从连接的套接字及其
localAddress
属性获取此信息。例如,如果该程序是一个Web服务器:
如果它是一个通用的TCP服务器:
当运行服务器程序时,该解决方案提供了非常高的可移植性、准确性和效率。
有关更多详细信息,请参阅:
Google directed me to this question while searching for "Node.js get server IP", so let's give an alternative answer for those who are trying to achieve this in their Node.js server program (may be the case of the original poster).
In the most trivial case where the server is bound to only one IP address, there should be no need to determine the IP address since we already know to which address we bound it (for example, the second parameter passed to the
listen()
function).In the less trivial case where the server is bound to multiple IP addresses, we may need to determine the IP address of the interface to which a client connected. And as briefly suggested by Tor Valamo, nowadays, we can easily get this information from the connected socket and its
localAddress
property.For example, if the program is a web server:
And if it's a generic TCP server:
When running a server program, this solution offers very high portability, accuracy and efficiency.
For more details, see:
根据评论,以下是适用于当前版本的 Node.js 的内容:
对上述答案之一的评论缺少对
values()
的调用。看起来 os.networkInterfaces() 现在返回一个对象而不是数组。Based on a comment, here's what's working for the current version of Node.js:
The comment on one of the answers above was missing the call to
values()
. It looks likeos.networkInterfaces()
now returns an object instead of an array.这是前面示例的变体。它需要小心地过滤掉 VMware 接口等。如果您不传递索引返回所有地址。否则,您可能希望将其默认设置为 0,然后只需传递 null 即可获取所有内容,但您会解决这个问题。如果愿意添加,您还可以为正则表达式过滤器传递另一个参数。
Here is a variation of the previous examples. It takes care to filter out VMware interfaces, etc. If you don't pass an index it returns all addresses. Otherwise, you may want to set it default to 0 and then just pass null to get all, but you'll sort that out. You could also pass in another argument for the regex filter if so inclined to add.
如果您喜欢简洁,这里使用 Lodash:
If you're into the whole brevity thing, here it is using Lodash:
这是我的变体,允许以可移植的方式获取 IPv4 和 IPv6 地址:
这是同一函数的 CoffeeScript 版本:
console.log(getLocalIPs())
的输出示例Here's my variant that allows getting both IPv4 and IPv6 addresses in a portable manner:
Here's a CoffeeScript version of the same function:
Example output for
console.log(getLocalIPs())
与其他答案类似但更简洁:
Similar to other answers but more succinct:
很多时候,我发现有多个面向内部和外部的接口可用(例如:
10.0.75.1
、172.100.0.1
、192.168.2.3
),我真正想要的是外部的 (172.100.0.1
)。如果其他人有类似的担忧,这里还有一个对此的看法,希望可以有所帮助......
Many times I find there are multiple internal and external facing interfaces available (example:
10.0.75.1
,172.100.0.1
,192.168.2.3
) , and it's the external one that I'm really after (172.100.0.1
).In case anyone else has a similar concern, here's one more take on this that hopefully may be of some help...
此信息可以在
os.networkInterfaces()
中找到, — 一个对象,将网络接口名称映射到其属性(例如,一个接口可以有多个地址):This information can be found in
os.networkInterfaces()
, — an object, that maps network interface names to its properties (so that one interface can, for example, have several addresses):这是我用的。
这将返回您的第一个网络接口的 IPv4 地址。它也可能有 IPv6,因此为了获取“首先列出的内容”,您可以使用
family:0
(或根本不传递任何选项)或显式获取 IPv6,使用family:6
作为选项。Here's what I use.
This will return your first network interface's IPv4 address. It might also have an IPv6, so in order to get "whatever is listed first" you can use
family:0
(or don't pass any options at all) or to explicitly get the IPv6, usefamily:6
as option instead.https://github.com/indutny/node-ip
https://github.com/indutny/node-ip
您可以使用 os 模块找到您计算机的任何 IP 地址 - 这是 Node.js 本机:
您所需要做的就是调用 os.networkInterfaces(),您将获得一个易于管理的列表 - 比运行更容易ifconfig 按联赛。
Any IP address of your machine you can find by using the os module - and that's native to Node.js:
All you need to do is call os.networkInterfaces() and you'll get an easy manageable list - easier than running ifconfig by leagues.
这是我获取本地 IP 地址的实用方法,假设您正在寻找 IPv4 地址并且机器只有一个真实的网络接口。它可以轻松地重构以返回多接口计算机的 IP 地址数组。
Here's my utility method for getting the local IP address, assuming you are looking for an IPv4 address and the machine only has one real network interface. It could easily be refactored to return an array of IP addresses for multi-interface machines.
安装一个名为
ip
的模块,例如:然后使用以下代码:
Install a module called
ip
like:Then use this code:
使用 npm
ip
模块:Use the npm
ip
module:以下是 Node.js 代码片段,它将解析
ifconfig
的输出并(异步)返回找到的第一个 IP 地址:(已在 Mac OS X v10.6(仅限 Snow Leopard);我希望它也适用于 Linux。)
用法示例:
如果第二个参数为
true
,函数每次都会执行一次系统调用;否则使用缓存的值。更新版本
返回所有本地网络地址的数组。
在 Ubuntu 11.04 (Natty Narwhal) 和 Windows XP 32 上测试
更新版本的使用示例
Here is a snippet of Node.js code that will parse the output of
ifconfig
and (asynchronously) return the first IP address found:(It was tested on Mac OS X v10.6 (Snow Leopard) only; I hope it works on Linux too.)
Usage example:
If the second parameter is
true
, the function will execute a system call every time; otherwise the cached value is used.Updated version
Returns an array of all local network addresses.
Tested on Ubuntu 11.04 (Natty Narwhal) and Windows XP 32
Usage Example for updated version
调用 ifconfig 非常依赖于平台,并且网络层确实知道套接字所在的 IP 地址,因此最好询问它。
Node.js 没有公开执行此操作的直接方法,但您可以打开任何套接字,并询问正在使用的本地 IP 地址。例如,打开一个到www.google.com的套接字:
使用案例:
Calling ifconfig is very platform-dependent, and the networking layer does know what IP addresses a socket is on, so best is to ask it.
Node.js doesn't expose a direct method of doing this, but you can open any socket, and ask what local IP address is in use. For example, opening a socket to www.google.com:
Usage case:
您的本地 IP 地址始终为 127.0.0.1。
然后是网络 IP 地址,您可以从
ifconfig
(*nix) 或ipconfig
(win) 获取该地址。这仅在本地网络内有用。然后是外部/公共 IP 地址,只有当您可以以某种方式向路由器询问该地址时,您才能获得该地址,或者您可以设置一个外部服务,该服务在收到请求时返回客户端 IP 地址。还有其他此类服务,例如whatismyip.com。
在某些情况下(例如,如果您有 WAN 连接),网络 IP 地址和公共 IP 是相同的,并且都可以在外部使用来访问您的计算机。
如果您的网络和公共 IP 地址不同,您可能需要让网络路由器将所有传入连接转发到您的网络 IP 地址。
2013 年更新:
现在有一种新方法可以做到这一点。您可以检查连接的套接字对象是否有名为localAddress
的属性,例如net.socket.localAddress
。它返回套接字一端的地址。最简单的方法是打开一个随机端口并侦听它,然后获取您的地址并关闭套接字。2015 年更新:
以前的已经不行了。
Your local IP address is always 127.0.0.1.
Then there is the network IP address, which you can get from
ifconfig
(*nix) oripconfig
(win). This is only useful within the local network.Then there is your external/public IP address, which you can only get if you can somehow ask the router for it, or you can setup an external service which returns the client IP address whenever it gets a request. There are also other such services in existence, like whatismyip.com.
In some cases (for instance if you have a WAN connection) the network IP address and the public IP are the same, and can both be used externally to reach your computer.
If your network and public IP addresses are different, you may need to have your network router forward all incoming connections to your network IP address.
Update 2013:
There's a new way of doing this now. You can check the socket object of your connection for a property calledlocalAddress
, e.g.net.socket.localAddress
. It returns the address on your end of the socket.The easiest way is to just open a random port and listen on it, and then get your address and close the socket.Update 2015:
The previous doesn't work anymore.
我可能来晚了这个问题,但万一有人想要一个单行 ES6 解决方案来获取 IP 地址数组,那么这应该对你有帮助:
因为
将返回一个数组数组,所以
flat() 用于将其展平为单个数组
将过滤数组以仅包含 IPv4 地址,如果它不是内部的
最后
将仅返回过滤数组的 IPv4 地址,
因此结果将是
[ '192.168.xx.xx ' ]
如果您想要或更改过滤条件,则可以获取该数组的第一个索引
OS
使用的是 WindowsI probably came late to this question, but in case someone wants to a get a one liner ES6 solution to get array of IP addresses then this should help you:
As
will return an array of arrays, so
flat()
is used to flatten it into a single arrayWill filter the array to include only IPv4 Addresses and if it's not internal
Finally
Will return only the IPv4 address of the filtered array
so result would be
[ '192.168.xx.xx' ]
you can then get the first index of that array if you want or change filter condition
OS
used is WindowsUnderscore.js 和 Lodash 是:
The correct one-liner for both Underscore.js and Lodash is:
这可能是最干净、最简单的答案,没有依赖和依赖。适用于所有平台。
Here's what might be the cleanest, simplest answer without dependencies & that works across all platforms.
我所知道的是我想要以
192.168.
开头的 IP 地址。这段代码将为您提供:当然,如果您正在寻找不同的数字,您可以只更改数字。
All I know is I wanted the IP address beginning with
192.168.
. This code will give you that:Of course you can just change the numbers if you're looking for a different one.
这是一个用普通 JavaScript 编写的简化版本,用于获取单个 IP 地址:
Here's a simplified version in vanilla JavaScript to obtain a single IP address: