几种如何判断环境是否连上网方法!推荐最后一种
本文分享自华为云社区《NodeJS里如何判断环境是否连上网》,作者: gentle_zhou。
本文会列举几种可以判断环境是否连上网的方法,推荐可以直接用最后一种方法,可以直接获取有关计算机网络接口的信息。
【不可行】https.get()
一开始我们的想法是直接通过 https.get()返回的 res 里的 statusCode 属性是不是 200,来判断有没有连上网;想法很美好,但是实际测试下来会发现断网情况下,根本不会有 res 返回回来,即我们没办法根据https.get(url, (res : any) => {...}
里的 res.statusCode
来判断有没有连上网。
不可行,排除。
internet-available
A module to verify if there’s an active internet connection with Node.js.
一个配合 Node.js 来验证是否有活跃的因特网连接的模块。
我们可以通过下面这行 npm 命令来下载模块:$ npm install internet-available --save
。
该模块需要 promise 可以正常运行,代码如下:
is-online
Check if the internet connection is up
用来检查因特网连接是否成功的一个模块,可以在 Node.js 和浏览器中(需要 bundler 打包)运行。
我们可以通过下面这行 npm 命令来下载模块:$ npm install is-online
如何使用呢?代码如下:
它会根据是否连上网,直接返回是 true/false。
check-network-status
A Node.js Module to check whether you are connected to network or not. Returns a promise resolves to true with network access and to false without network access.
一个用来检测是否连接到网络的 Node.js 模块;会根据是否连接上网络,返回 true/false。
我们可以通过下面这行 npm 命令来下载模块:$npm install check-network-status
,模块需要 node 的版本大于等于 8.0.0
代码使用如下:
如果需要更改设置,代码这么写即可:
dns
我们可以使用 DNS 协议来解析一个主机名(例如“nodejs.org”)到资源记录数组中。
该回调函数有参数(err, records)。当解析成功时,记录将是一组资源记录。个别结果的类型和结构因 rrtype 而异:!
代码如下:
我们通过解析 www.huaweicloud.com 网址,来判断有没有连接上网。但这个方法有个漏洞,就是当机器已经解析过网站了,且 dns query 已经被缓存在机器里了,那么即使断网了,也会显示连接到了网络。
os.networkInterfaces()
os.networkInterfaces()方法是 os 模块的内置应用程序编程接口,用于获取有关计算机网络接口的信息。
此方法不接受任何参数,然后会返回一个对象,其中包含有关每个网络接口的信息。返回的对象将包含网络接口数组,该数组又由以下属性组成:
address:一个字符串,用于指定分配的网络地址,即 IPv4 或 IPv6
netmask:一个字符串,指定 IPv4 或 IPv6 网络掩码
family:指定 Family 的字符串,值为 IPv4 或 IPv6 之一
mac:一个字符串,指定网络接口的 MAC 地址
internal:布尔值,如果接口为环回一则为 true,否则为 false
scopeid:一个数字,指定 IPv6 的作用域 ID
cidr:一个字符串,用于指定分配的 IPv4 或 IPv6 地址以及 CIDR 表示法中的路由前缀。如果网络掩码无效,则将其设置为 null
代码如下:
会打印出如下信息:
我们只需要枚举这些值,然后枚举某个值的所有信息,获取其中一个字段的信息。
参考链接
https://www.tabnine.com/code/javascript/functions/request/Response/statusCode
https://www.npmjs.com/package/internet-available
https://www.npmjs.com/package/is-online
https://nodejs.org/api/dns.html#dnsresolvehostname-rrtype-callback
https://www.npmjs.com/package/dns
https://stackoverflow.com/questions/15270902/check-for-internet-connectivity-in-nodejs
https://www.geeksforgeeks.org/node-js-os-networkinterfaces-method/
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/cfcb94d8d29ab61936f80a3b1】。文章转载请联系作者。
评论