本文分享自华为云社区《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/

点击关注,第一时间了解华为云新鲜技术~​

几种如何判断环境是否连上网方法,推荐最后一种相关推荐

  1. 【页面传值6种方式】- 【JSP 页面传值方法总结:4种】 - 【跨页面传值的几种简单方式3种】...

    页面传值--最佳答案6种方式: 一. 使用QueryString变量 QueryString是一种非常简单也是使用比较多的一种传值方式,但是它将传递的值显示在浏览器的地址栏中,如果是传递一个或多个安全 ...

  2. 后氧传感器损坏的危害_几种快速判断氧传感器故障的简便方法

    氧传感器异常时,不仅会使汽车尾气中的有害气体含量超标,而且还会使发动机的燃油消耗增加.1. 观察氧传感器外观颜色01外部破损的检查 先从排气管上拆下氧传感器,直观检查氧传感器外壳上的通风孔是否被堵塞, ...

  3. 在java里如何跨网页传参_【页面传值6种方式】- 【JSP 页面传值方法总结:4种】 - 【跨页面传值的几种简单方式3种】...

    JSP 页面间传递参数是项目中经常需要的,这应该算是 web 基本功吧. 试着将各种方式总结下来,需要时可以进行权衡利弊选择最合适的方式. 1. URL 链接后追加参数 URL 后面追加参数 resp ...

  4. 引流方法有几种,推广引流有哪些方法?盘点8种最有效的引流方法

    无论是做服务的还是卖产品,流量都是一切生意的来源.有流量,才会有客户,有客户才有机会转化成交.每个人都希望自己的的客户跟打开水龙头一样,哗啦啦的自己流出来.那么我们推广引流的方法有哪些呢? 一.评论引 ...

  5. c 判断文件是否存在_C++基础:判断文件是否存在的方法

    C++基础:判断文件是否存在的方法 使用以下几种函数判断文件是否存在 #include <fstream> --> 使用ifstream打开文件流,成功则存在,失败则不存在; #in ...

  6. 点云迭代最近邻点配准法_一种激光扫描数据与数码照片的配准方法

    一种激光扫描数据与数码照片的配准方法 提出了一种激光扫描数据和数字图像配准的方法.该方法基于立体像对匹配点与三维扫描点云的最近邻迭代配准. (本文共4页) 阅读全文>> 文中以基于网络的数 ...

  7. chatgpt赋能python:Python断句:一种快速且便利的文本处理方法

    Python 断句:一种快速且便利的文本处理方法 Python作为一种通用编程语言,在文本处理方面也有很强的能力.其中,断句是在Python中应用广泛的一种文本处理方法.本篇文章将介绍如何使用Pyth ...

  8. 十二种抓龙头妖股的实战方法

    十二种抓龙头妖股的实战方法,每一种方法都非常实用,不过想要实战操作就要知道什么是龙头股,所谓的龙头股就是当前涨幅最大的个股,也是引领一个行业的妖股,所以想要提前介入,就得有很多的实战之后才能总结的秘诀 ...

  9. lua判断字符不为空或空格_Lua判断字符串前缀是否为指定字符的3种方法

    在写 lua debugger 的时候,我需要判断一个字符串的前缀是不是 "@" . 有三个方案: 1.比较直观的是 string.sub(str,1,1) == "@& ...

最新文章

  1. .net下绘制统计图工具-请推荐
  2. 21天学通HTML5和CSS3第二版,21天学通HTML5+CSS3
  3. 老子今天不加班,程序员也需要自由
  4. Mysql主备延迟的原因
  5. echo count(“abc”); 输出什么?
  6. Spark 1.2 发布,开源集群计算系统
  7. PHP socket
  8. 在保护继承中基类的共有成员_C++面向对象:C++ 继承
  9. 腾讯、阿里能像 Facebook 一样发币吗?
  10. UnityParticle1:粒子系统简介
  11. 基于C++ Qt实现的红色警戒3修改器
  12. 小米机器如何无root激活XPOSED框架的流程
  13. 网络营销的方案及技巧
  14. Typora编辑数学公式
  15. 世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。
  16. Excel批量选中表格中所有图片
  17. 用Java开发50个棋类游戏
  18. CAAI演讲实录丨李德毅院士:交互认知——从图灵测试的漏洞谈开去
  19. 【论文】 Skeletonization of Ribbon-Like Shapes Based on Regularity and Singularity Analyses
  20. 山东大学人机交互考试重点

热门文章

  1. 演变模型_开放组织的演变
  2. LeetCode 410. 分割数组的最大值
  3. 学习 | egg.js 中间件和插件
  4. Bootstrap 按钮的尺寸
  5. Bootstrap按钮支持的元素
  6. Vrep中将物体变得透明的方法
  7. ROS笔记(17) Gazebo
  8. ROS笔记(9) launch文件
  9. mysql pconnect_mysql_pconnect()
  10. abs 不会整数 方法 溢出_asp cint clng的范围与防止cint和clng的溢出解决方法大全