NodeJS里如何判断环境是否连上网

举报
gentle_zhou 发表于 2022/03/04 15:53:46 2022/03/04
【摘要】 本文会列举几种可以判断环境是否连上网的方法,推荐可以直接用最后一种方法,可以直接获取有关计算机网络接口的信息。

本文会列举几种可以判断环境是否连上网的方法,推荐可以直接用最后一种方法,可以直接获取有关计算机网络接口的信息。

【不可行】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而异:
!image.png

代码如下:

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' } ] }

我们只需要枚举这些值,然后枚举某个值的所有信息,获取其中一个字段的信息。

参考链接

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。