服务人员注册错误:不支持的MIME类型('text / html')

Mat*_*dor 13 javascript express reactjs service-worker create-react-app

我正在将Express服务器与create-react-app一起使用。

create-react-app有一个预先配置的ServiceWorker,用于缓存本地资产(https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/template/README.md#making-a-progressive-web -app)。

尝试在服务器上发布时遇到的问题是service-worker.js文件可用,但是尝试注册该文件时浏览器控制台出现错误。

在Firefox上,出现以下错误:

服务人员注册期间发生错误:

类型错误:在ServiceWorker脚本https://my-domain.com/service-worker.js的范围https://my-domain.com/安装过程中遇到错误。

在Chrome上,我得到了更具描述性的错误:

注册Service Worker时出错:DOMException:无法注册ServiceWorker:脚本具有不受支持的MIME类型('text / html')。

果然,如果我在开发人员工具的“网络”选项卡中查找并搜索该service-worker.js文件,则可以看到该文件在HTTP标头中具有错误的MIME类型。

但是,我不明白为什么它的MIME类型错误?

Mir*_*ili 25

更换:

'/service-worker.js'
Run Code Online (Sandbox Code Playgroud)

和:

'./service-worker.js'  // Add a dot before slash.
Run Code Online (Sandbox Code Playgroud)

解决了我的类似问题。

(在navigator.serviceWorker.register('/service-worker.js'))

  • 这是正确的答案。MIME 类型错误是由于找不到文件而导致的。 (10认同)
  • 我的将其更改为“%PUBLIC_URL%/serviceworker.js”。但你让我意识到这是错误的路径,而不是 MIME 类型 (2认同)

Fac*_*uez 17

我认为 service worker 文件不存在,http://localhost:3000/service-worker.js所以服务器返回 index.html 代替。然后注册函数不知道如何处理 index.html 文件并告诉您 MIME 类型不正确。

一个快速的解决方法是将 service-worker.js 文件复制到public文件夹中,这样当你点击时你就http://localhost:3000/service-worker.js可以在浏览器中看到该文件。

请记住转到 ChromeDev > Applications > ServiceWorkers 并点击取消订阅。为了删除错误的。记住还要禁用缓存


Mat*_*dor 12

在我的Express服务器应用程序中,我有一个通配符(星号/ *)路由,它重定向到index.html

// Load React App
// Serve HTML file for production
if (env.name === "production") {
  app.get("*", function response(req, res) {
    res.sendFile(path.join(__dirname, "public", "index.html"));
  });
}
Run Code Online (Sandbox Code Playgroud)

这是一种非常常见的设计模式。但是,这意味着对未知文本文件的任何请求最初都会重定向到index.html,因此以MIME类型返回"text/html",即使它实际上是JavaScript或SVG或其他某种纯文本文件。

我发现的解决方案是在通配符路由service-worker.js 之前添加特定的路由:

app.get("/service-worker.js", (req, res) => {
  res.sendFile(path.resolve(__dirname, "public", "service-worker.js"));
});
app.get("*", function response(req, res) {
  res.sendFile(path.join(__dirname, "public", "index.html"));
});
Run Code Online (Sandbox Code Playgroud)

现在,当浏览器查找时service-worker.js,Express将以正确的MIME类型返回它。

(请注意,如果您尝试service-worker.js在通配符后添加路由,则将无法使用,因为通配符路由将被覆盖。)


Wap*_*vam 6

ServiceWorker 支持的 MIME 类型是“text/javascript”、application/javascript 和 application/x-javascript。转到您的服务器文件并设置

    response.writeHead(201, {
        'Content-Type': 'application/javascript'
    });
Run Code Online (Sandbox Code Playgroud)


Hoa*_*ong 5

如果您正在使用 NodeJS,serviceWorker 文件应放置在 public 文件夹中。如果您使用 Webpack 将 serviceWorker 导出到公共,则需要使用“copy-webpack-plugin”。