You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask应用Service Worker注册成功但连接失败:接收端不存在求助

Fixing "Could not establish connection. Receiving end does not exist" in Flask + Service Worker Setup

Hey there, let’s work through this frustrating Service Worker connection error you’re seeing. That Unchecked runtime.lastError message almost always boils down to misalignment between your Flask routing, Service Worker registration path, or message timing—here’s how to fix it step by step:

1. Verify Your Service Worker Registration Path

Flask serves static files from the /static/ directory by default, so if your sw.js is in static/sw.js, you need to register it with an absolute path to avoid route-specific relative path bugs.

Instead of this (which breaks on non-root Flask routes like /offerings):

// offerings.js - Bad: relative path fails on nested routes
navigator.serviceWorker.register('./sw.js');

Do this:

// offerings.js - Good: absolute path points directly to static file
navigator.serviceWorker.register('/static/sw.js');

Test this by visiting http://your-localhost:5000/static/sw.js in your browser—if you get a 404, double-check your file placement or Flask static folder configuration.

2. Adjust Service Worker Scope (Critical for Flask Routes)

Service Workers can only control pages in their own directory or subdirectories by default. If sw.js lives in /static/, it can’t control your root Flask routes (like / or /offerings) out of the box. Fix this in two ways:

Option A: Serve sw.js from the Root Directory

Add a Flask route to serve sw.js directly from your app’s root (so it can control all routes):

# app.py
from flask import Flask

app = Flask(__name__)

@app.route('/sw.js')
def service_worker():
    return app.send_static_file('sw.js')

# ... your other routes ...

Then register it with the root path:

// offerings.js
navigator.serviceWorker.register('/sw.js');

Option B: Force Scope Control in the Service Worker

If you want to keep sw.js in /static/, add these listeners to sw.js to claim control over all pages:

// sw.js
self.addEventListener('install', (event) => {
  // Skip waiting to activate new SW immediately
  event.waitUntil(self.skipWaiting());
});

self.addEventListener('activate', (event) => {
  // Claim control over all open clients
  event.waitUntil(self.clients.claim());
});

3. Ensure Message Timing is Correct

That error often pops up if your client-side code (offerings.js) tries to send a message before the Service Worker is fully activated. Always wait for the ready promise before sending messages:

// offerings.js - Safe message sending
navigator.serviceWorker.ready.then(registration => {
  registration.active.postMessage({
    type: 'LOG',
    content: 'Hello from offerings.js!'
  });
});

And make sure your sw.js has a corresponding message listener:

// sw.js - Listen for incoming messages
self.addEventListener('message', (event) => {
  if (event.data.type === 'LOG') {
    console.log('Received log:', event.data.content);
  }
});

4. Clean Up Old Service Worker Caches

Old, leftover Service Workers can cause connection conflicts. Do this in Chrome DevTools:

  • Open the Application tab
  • Go to Service Workers
  • Click "Unregister" for your worker
  • Navigate to Clear storage > Check all boxes > Click "Clear site data"
  • Refresh your app to re-register the updated Service Worker

That should cover the most common causes of this error in a Flask + Service Worker setup. Let me know if you hit any snags!

内容的提问来源于stack exchange,提问作者Marc J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:09:46