几种如何判断环境是否连上网方法!推荐最后一种
摘要:本文会列举几种可以判断环境是否连上网的方法,推荐可以直接用最后一种方法,可以直接获取有关计算机网络接口的信息。
本文分享自华为云社区《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可以正常运行,代码如下:
var internetAvailable = require("internet-available"); // 最简单的方式 internetAvailable({ // 提供最长的执行时间给验证 timeout: 5000, // 如果它尝试了5次依然失败,那么就说没有网络 retries: 5 }).then(() => { console.log("Internet available"); }).catch(() => { console.log("No internet"); });
is-online
Check if the internet connection is up
用来检查因特网连接是否成功的一个模块,可以在Node.js和浏览器中(需要bundler打包)运行。
我们可以通过下面这行npm命令来下载模块:$ npm install is-online
如何使用呢?代码如下:
const isOnline = require('is-online'); (async () => { console.log(await isOnline()); //=> true })();
它会根据是否连上网,直接返回是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
代码使用如下:
// 默认设置 { timeout: 4500, backUpURL: null, pingDomain: 'huaweicloud.com', method: 'GET' } const { checkNetworkStatus } = require('check-network-status'); // 根据网络连接情况,打印出true/false checkNetworkStatus().then(value => console.log(value));
如果需要更改设置,代码这么写即可:
const { checkNetworkStatus } = require('check-network-status'); checkNetworkStatus({ timeout: 3000, backUpURL: 'https://www.huaweicloud.com', pingDomain: 'huaweicloud.com', method: 'GET' }).then(value => console.log(value));
dns
我们可以使用DNS协议来解析一个主机名(例如“nodejs.org”)到资源记录数组中。
该回调函数有参数(err, records)。当解析成功时,记录将是一组资源记录。个别结果的类型和结构因rrtype而异:
代码如下:
require('dns').resolve('www.huaweicloud.com', function(err) { if (err) { console.log("No connection"); } else { console.log("Connected"); } });
我们通过解析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
代码如下:
// 引入os依赖 const os = require('os'); // 打印出 os.networkInterfaces() 的值 console.log(os.networkInterfaces());
会打印出如下信息:
{ 'Wi-Fi': [ { address: 'fe80::242a:3451:7fb2:3ab1', netmask: 'ffff:ffff:ffff:ffff::', family: 'IPv6', mac: 'b3:52:16:13:de:b9', scopeid: 3, internal: false, cidr: 'fe80::242a:3451:7fb2:3ab1/64' }, { address: '192.168.0.5', netmask: '255.255.255.0', family: 'IPv4', mac: 'b3:52:16:13:de:b9', internal: false, cidr: '192.168.0.5/24' } ], 'Loopback Pseudo-Interface 1': [ { address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', family: 'IPv6', mac: '00:00:00:00:00:00', scopeid: 0, internal: true, cidr: '::1/128' }, { address: '127.0.0.1', netmask: '255.0.0.0', family: 'IPv4', mac: '00:00:00:00:00:00', internal: true, cidr: '127.0.0.1/8' } ] }
我们只需要枚举这些值,然后枚举某个值的所有信息,获取其中一个字段的信息。
参考链接
- 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/
相关文章
- 如何在Word中添加漂亮的代码块 | 很全的方法整理和比较
- 如何应对软件可变性?这4种常用的方法肯定要知道
- 火狐浏览器如何js关闭窗口的几种解决方法
- 一分钟学会《模板方法模式》
- Spring Boot 如何获取 Controller 方法名和注解信息?
- 使用System.getProperty方法,如何配置JVM系统属性
- 统计分析方法以及统计软件详细介绍
- 最简单的 RabbitMQ 监控方法 - 每天5分钟玩转 OpenStack(158)
- ubuntu下crontab编辑方法的设定
- MySql状态查看方法 MySql如何查看连接数和状态?
- blocked because of many connection errors; unblock with 'mysqladmin flush-hosts;MySQL在远程访问时非常慢的解决方法;MySql链接慢的解决方法
- 【GitHub使用方法】如何检索找到想要的项目 || 指定stars数目 || 指定更新时间 || 指定forks数目 || 指定编程语言和followers || 常见搜索条件整理
- 【记录】终端如何 进入conda(base) 环境,如何退出 conda(base)环境,终端快速进入Jupyter notebook的方法
- 技术人员如何培养业务的敏感度?掌握原动力和方法
- 如何系统自学软件测试,看这篇软件测试学习方法万字总结就够了
- Robot framework日志文件大处理方法
- 华为交换机批量加入 Vlan 方法
- 手机端rem如何适配_rem详解及使用方法2
- 高CPU排查方法分享
- Eclipse打包工具 Fatjar clipse插件安装方法 如何使用fat打包运行
- Array 数组去重 总结10方法(7)
- 在vue2.0中父组件如何触发子组件的自定义方法?