Node.js-重新创建navigator.onLine

时间:2018-07-10 11:39:57

标签: javascript node.js

我有一个Node.js应用程序。我正在尝试编写一个实用程序应用程序来进行一些网络检测。我创建这个应用只是为了了解有关Node的更多信息。

在此应用中,我想查看a)我的计算机是否在线以及b)它是否可以访问互联网。如果在浏览器中执行此操作,则可以使用navigator.onLine,然后尝试访问网站。但是,这不是Node中的选项。

我看着OS module's networkInterfaces method,但似乎没有我需要的东西。例如,如果您去星巴克,则可以“在线”,但只有在您同意其网络的服务条款之后才能真正访问Internet。我一直在通过在计算机上切换飞行模式来测试这种情况。无论飞行模式是打开还是关闭,networkInterfaces方法都会返回相同的内容。

如何在Node中重新创建navigator.onLine功能?

4 个答案:

答案 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()之类的函数中,您将一如既往地出色。