我有一个Node.js应用程序。我正在尝试编写一个实用程序应用程序来进行一些网络检测。我创建这个应用只是为了了解有关Node的更多信息。
在此应用中,我想查看a)我的计算机是否在线以及b)它是否可以访问互联网。如果在浏览器中执行此操作,则可以使用navigator.onLine
,然后尝试访问网站。但是,这不是Node中的选项。
我看着OS module's networkInterfaces method,但似乎没有我需要的东西。例如,如果您去星巴克,则可以“在线”,但只有在您同意其网络的服务条款之后才能真正访问Internet。我一直在通过在计算机上切换飞行模式来测试这种情况。无论飞行模式是打开还是关闭,networkInterfaces
方法都会返回相同的内容。
如何在Node中重新创建navigator.onLine
功能?
答案 0 :(得分:2)
这里是检查互联网是否可用的代码。
为此安装is-online模块:npm i is-online
index.js:
const isOnline = require('is-online');
isOnline({
timeout: 1000
}).then(online =>{
if(online)
console.log('Internet is available')
else
console.log('Internet is not available')
})
答案 1 :(得分:1)
通过调用 onConnected 并传递建立连接时将调用的回调函数
paragraphs
答案 2 :(得分:0)
您可以全局定义 <?xml version="1.0" encoding="utf-8"?><manifest
xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.sademo.SademoEvent" android:installLocation="preferExternal">
<uses-sdk android:minSdkVersion="15" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<permission android:name="android.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="android.permission.C2D_MESSAGE" />
<application android:label="SademoEvent.Android">
<meta-data android:name="com.google.android.geo.API_KEY" android:value="AIzaSyDxmjIsYXJ1OMWpqqheenbBoK5GKLWzAvg" />
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="yourAplicationName" />
</intent-filter>
</receiver>
<provider android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
</provider>
</application>
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:enabled="true" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="${applicationId}" />
</intent-filter>
</receiver>
变量,并将navigator
参数设置为true或false。
onLine
答案 3 :(得分:0)
我会走
的路线var exec = require('child_process').exec, child;
child = exec('ping -c 1 8.8.8.8', function(error, stdout, stderr){
if(error !== null)
console.log("Not available")
else
console.log("Available")
});
或尝试进行DNS查找
require('dns').lookupService('8.8.8.8', 53, function(err, hostname, service){
console.log(hostname, service);
// google-public-dns-a.google.com domain
});
也许正在尝试解析域名
function checkNameResolution(cb) {
require('dns').lookup('google.com',function(err) {
if (err && err.code == "ENOTFOUND") {
cb(false);
} else {
cb(true);
}
})
}
真的取决于您的用例。
我个人希望能通过dnslookup获得一个可用的地址。但是,如果您在解析域名的某种DNS掩码后面使用本地主机,则它可能无效,这反过来又增加了测试名称解析的需求。将它们组合到checkInternetConnection()
之类的函数中,您将一如既往地出色。