本文概述
尽管你的用户在你的系统上做某件事的概率很低, 但是在互联网停止工作的那一刻, 很难轻易重复执行某项操作, 但是这种情况确实发生了。在这一刻, 你的用户将立即归咎于你的系统(如果你没有为在浏览器上创建信息的临时备份而设计的内容, 则更多)。在这些情况下, 非常重要的是在进行重要操作之前检查是否有活动的连接, 以防止出现不良情况。
在本文中, 我们将向你展示如何使用2个开源模块检查Node.js中是否存在有效的Internet连接。
A.使用internetAvailable模块
Internet Available是一个有用的模块, 用于轻松验证Node.js是否存在活动的Internet连接。要在你的项目中安装此模块, 请在终端上执行以下命令:
npm install internet-available
该模块由《我们的代码世界》编写。该库依赖于用于从域解析DNS地址的dns-socket模块。但是, 如果默认情况下Node.js已经提供了查找DNS地址方法, 为什么还要使用额外的模块?好问题!没错, Node.js已经提供了一种方法来实现此目的, 但是它没有提供任何方法来限制脚本的执行时间。因此, 我们使用了这个额外的模块, 它使一切变得容易, 并且确实做到了。有关更多信息, 请查看文档或在此处访问Github的官方存储库。
要检查此模块是否有可用的互联网连接, 你可以使用以下代码快速进行连接:
var internetAvailable = require("internet-available");
internetAvailable().then(function(){
console.log("Internet available");
}).catch(function(){
console.log("No internet");
});
如你所见, 它非常简单且实用。如果需要, 可以自定义它, 以设置验证的最大执行时间和可以进行的总尝试次数, 以防任务花费了超过所需的时间:
var internetAvailable = require("internet-available");
// Set a timeout and a limit of attempts to check for connection
internetAvailable({
timeout: 4000, retries: 10, }).then(function(){
console.log("Internet available");
}).catch(function(){
console.log("No internet");
});
如果超时时间到期, 则表示没有可用的连接。
如前所述, internetAvailable解析来自域名google.com的DNS地址。如果你不想使用该域进行验证, 则只需在设置中进行更改即可。以下示例显示了如何使用ourcodeworld.com域而不是google域。主机和端口可以更改, 但是我们将使用默认端口:
var internetAvailable = require("internet-available");
// Make it with a different verification address
internetAvailable({
domainName: "ourcodeworld.com", port: 53, host: '8.8.8.8'
}).then(() => {
console.log("Internet available");
}).catch(() => {
console.log("No internet");
});
另外, 如果你要使用的域有特殊之处, 你可以更改验证的DNS端口和默认使用Google Public DNS的主机地址。
B.使用isOnline模块
isOnline是一个模块, 与internetAvailable不同, 它可以在Node.js和浏览器(带有browserify / webpack)中工作, 并允许你验证是否存在活动的Internet连接。在浏览器中, 你具有navigator.onLine, 但它仅用于告诉你是否存在本地连接, 而不告诉你是否可以访问互联网, 因此没有用。
要在你的项目中安装此模块, 请在终端上执行以下命令:
npm install is-online
该模块执行对不同免费服务的一些请求, 它们全部并行运行:
- 通过HTTPS检索icanhazip.com
- 在OpenDNS上查询myip.opendns.com(仅Node.js)
- 检索Apple的Captive Portal测试页(仅Node.js)
当它们中的任何一个成功时, 返回的Promise都将解析为true, 因此我们可以推断出存在Internet连接。有关此库的更多信息, 请访问Github上的官方存储库。
要检查此模块是否可以连接互联网, 请使用以下代码(在浏览器中和Node.js中):
const isOnline = require('is-online');
isOnline().then(online => {
if(online){
console.log("We have internet");
}else{
console.log("Houston we have a problem");
}
});
该库允许你以与先前库对其选项相同的方式设置超时。此外, 你可以选择要使用的Internet协议版本。这是一个高级选项, 通常不需要设置, 但是对于明确声明IPv6连接性可能会很有用:
const isOnline = require('is-online');
isOnline({
// Break on 5 seconds
timeout: 5000, // v4 or v6
version: "v4"
}).then(online => {
if(online){
console.log("We have internet");
}else{
console.log("Houston we have a problem");
}
});
编码愉快!
评论前必须登录!
注册