写点什么

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

  • 2022 年 3 月 07 日
  • 本文字数:2499 字

    阅读完需:约 8 分钟

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


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

发布于: 刚刚阅读数: 2
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
几种如何判断环境是否连上网方法!推荐最后一种_网络_华为云开发者社区_InfoQ写作平台