服务工作程序不使用nodejs服务器在脱机模式下运行

时间:2017-03-29 10:23:58

标签: node.js service-worker progressive-web-apps

我一直在创建新项目PWA。 当我开发不使用节点js(socket.io运行)只是在线下运行时,就像我期望和需要的那样。

但与nodejs服务器集成时。当上网时,运行良好的应用程序没有任何问题。但是当我更改为离线模式时,我的服务工作没有运行,而是显示离线浏览器。

这是我的代码节点js server:

 HashMap<String, String> postDataParams=new HashMap<>();
        postDataParams.put("u_phone",CN);
        postDataParams.put("u_code",st);
        postDataParams.put("device_flag",mob_device);
        postDataParams.put("app_type","PRO");
        HostnameVerifier hostnameVerifier = new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                HostnameVerifier hv =
                        HttpsURLConnection.getDefaultHostnameVerifier();
                return hv.verify("companyname.com", session);
            }
        };


        try{

            URL url = new URL("https://www.appname.com/sync/validatecheck.php");
            HttpsURLConnection urlConnection =
                    (HttpsURLConnection)url.openConnection();
            //urlConnection.setHostnameVerifier(hostnameVerifier);
            urlConnection.setReadTimeout(10000);
            urlConnection.setConnectTimeout(15000);
            urlConnection.setRequestMethod("POST");
            urlConnection.setDoInput(true);
            urlConnection.setDoOutput(true);

            OutputStream os = urlConnection.getOutputStream();
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(os, "UTF-8"));
            writer.write(getPostDataString(postDataParams));

            writer.flush();
            writer.close();
            os.close();
            int responseCode=urlConnection.getResponseCode();

            if (responseCode == HttpsURLConnection.HTTP_OK) {
                String line;
                BufferedReader br=new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                while ((line=br.readLine()) != null) {
                    result+=line;
                }
            }
            else {
                result="";

            }
        } catch (Exception e) {
            Log.e("log_tag", "Error in http connection "+e.toString());
        }

这是我在索引js

中的服务注册

var express = require('express');
var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var cors = require('cors');

app.use(cors());
app.use(express.static(__dirname + '/'));

app.use(function(req, res, next){
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  next();
});


io.on('connection', function(socket) {
  console.log('new connection');

  socket.on('afterBid', function(data) {
    io.emit('bcCurrentBid', {
      current_bidding: data.auction_current_bidding,
      user_id_dominated: data.user_id_dominated
    });
  });

});

server.listen(9991, function() {
  console.log('server up and running at 2205 port');
});

这是我的service-worker.js文件:

if ('serviceWorker' in navigator && 'PushManager' in window) {
		console.log('Service Worker and Push is supported');

	  window.addEventListener('load', function() {
			navigator.serviceWorker
             .register('./service-worker.js')
             .then(function() { console.log('Service Worker Registered'); });
	  });
	}

谢谢也许有人可以给我解决方案

2 个答案:

答案 0 :(得分:2)

我在这里发布了一个类似的问题并得到了答案: Service Worker not working in Offline mode with node js server

要做到简短,请记住服务工作者的范围是它自己的目录和下面的文件夹......并且它无法访问您的lib或app目录...

更详细地说,这意味着如果您的内容从https://example.com/开始,则您的服务工作人员必须住在https://example.com/service-worker.js。如果你把它设为https://example.com/js/service-worker.js,它就不会起作用。

答案 1 :(得分:1)

服务工作者只是从您的网络服务器提供的javascript文件。它是不是node.js并不重要。

您是否检查了chrome调试工具中的“应用程序”选项卡,以查看是否已加载服务工作者?如果是,请分享您的'service-worker.js'文件的代码。 您还可以在注册服务工作者时添加“catch”部分。如果无法加载服务工作者,这可能会显示正在发生的事情。

window.addEventListener('load', function() {
		navigator.serviceWorker
    .register('./service-worker.js')
    .then(function() { console.log('Service Worker Registered'); })
    
    .catch(function (err) {
            console.log('ServiceWorker registration failed: ', err);
    });
    
});