React 应用程序错误:无法构建“WebSocket”:可能无法从通过 HTTPS 加载的页面启动不安全的 WebSocket 连接

IT技术 node.js reactjs
2021-04-10 06:44:14

我正在部署一个 React 应用程序,但是当我通过 https 访问该页面时出现一个奇怪的错误。

当我通过 https 访问页面时,我收到以下错误:

SecurityError:无法构建“WebSocket”:可能无法从通过 HTTPS 加载的页面启动不安全的 WebSocket 连接。

但是当我通过 http 访问该页面时,它运行良好。

问题是据我所知,我没有使用 websockets。我搜索了代码,看看是否有对 http 的请求应该是 https 或 ws: 而不是 wss: 但我什么也没看到。

有没有人遇到过这个?

我包含了 package.json 文件的副本。如果您需要我上传任何其他代码部分以帮助调试,请告诉我。

提前致谢。

{
  "name": "client",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^4.2.4",
    "@testing-library/react": "^9.3.2",
    "@testing-library/user-event": "^7.1.2",
    "baffle": "^0.3.6",
    "cross-env": "^6.0.3",
    "react": "^16.12.0",
    "react-dom": "^16.12.0",
    "react-player": "^1.14.2",
    "react-router-dom": "^5.1.2",
    "react-scripts": "3.3.0",
    "react-typist": "^2.0.5",
    "webpack-hot-dev-clients": "^2.0.2"
  },
  "scripts": {
    "start": "cross-env react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}
6个回答

对于等待补丁的react脚本的人们:

对于通过 https 进行本地测试,您可以手动编辑

node_modules/react-dev-utils/webpackHotDevClient.js

这是您需要在该文件的第 62 行的代码:

protocol: window.location.protocol === 'https:' ? 'wss' : 'ws',

对于部署,请按照以下步骤操作:

npm install -g serve // This can be done locally too

npm run build

然后在你的 package.json 中添加一个部署脚本来使用服务:

"scripts": {
    "deploy": "serve -s build",
}

接着

npm deploy or yarn deploy

希望这个答案可以帮助您摆脱错误。

有关更多信息,请参阅此处`

此错误已在最新版本的发行版中修复。 点击这里查看源文件

所以我遇到了同样的问题,我正在将我的应用程序部署到 heroku。我什至只强行提交了 websocket 文件并将其部署到 heroku,但我仍然遇到同样的错误,有人可以解决这个问题吗?我唯一没有尝试的是提交整个 node_modules 目录。
2021-05-23 06:44:14
可能不应该node_modules手动修改,因为这些不会提交到共享存储库
2021-06-04 06:44:14
@Versifiction 是的。这必须在新的 react-sripts 补丁发布之前完成。
2021-06-17 06:44:14
@TylerStrouth 是否有可能在 Heroku 中编辑节点module?一旦你部署到 heroku,它就会安装 package.json 中提到的包。这样,您在上述文件中所做的更改也会被覆盖。尝试在 heroku 中编辑节点module内的文件。
2021-06-18 06:44:14
我有同样的问题,所以我只需要在节点module中编辑这个文件?
2021-06-21 06:44:14

这里的很多答案确实解决了这个问题,但自从我问这个问题以来,我找到的最简单的方法是将 npm package serve添加到您的依赖项中。

yarn add serve 或者 npm i serve

然后用以下内容替换您的启动脚本:

"scripts": {
    "start": "serve -s build",
}

这实际上直接出自 create-react-app文档

抱歉回复晚了,您需要为本地开发创建另一个脚本。例如。 "dev": "react scripts start" 您将运行npm run dev以在本地运行。
2021-06-11 06:44:14
这对我不起作用 我在本地启动服务器时收到 404 错误
2021-06-14 06:44:14

这是一个更简单的解决方案。将你的降级react-scripts3.2.0你的package.json(我的在3.3.0)。

您可能需要删除您的package-lock.jsonnode_modules( rm -rf package-lock.json node_modules),然后执行npm i. 提交新的package.jsonpackage-lock.json回购的。

为我工作。最初它一直恢复到 3.3.0,因为在 npm install 完成后我本能地运行建议的审计修复。
2021-05-24 06:44:14

我已经有一段时间没有使用 react 了,但是react-scripts如果我没记错的话,它是建立在 webpack 之上的,所以它很可能使用 webpack-dev-server 来加速开发。它使用 websockets 来与客户端通信以在发现磁盘更改时触发热重载。

您可能只是在开发模式下启动应用程序,因此如果您要将它部署到生产环境,您应该运行npm run build它会创建一组可以与您最喜欢的网络服务器一起使用的 javascript 文件。

@Ganesha,那你做错了。您需要执行npm run build并只上传目录中的内容build
2021-05-26 06:44:14
@monsterpiece,奇怪。这不是我测试时的结果,虽然我没有在 heroku 上测试,而是在本地测试。可能是 env 是一个问题,所以最好明确提及它。NODE_ENV=production npm run build,然后只将build目录上传到heroku(也就是说,构建将成为您在网络服务器上的webroot,除非使用ssr,否则不需要服务器上的节点)。生产版本甚至应该包含 webpack 开发服务器,我会说在这种情况下这是一个错误。
2021-05-27 06:44:14
我遇到了完全相同的问题,我已经运行 npm run build 以将其部署到 GitHub 页面但它没有用,所以尝试了 Heroku 我得到了上述错误,如果我选择加载不安全,它可以在 HTTP 上运行脚本。使其安全并解决此错误的解决方案将很有帮助!
2021-05-28 06:44:14
这是反应脚本 3.3.0 版本的问题。你可以在这里找到详细的文档“ github.com/facebook/create-react-app/pull/8079 ”。我降级了对脚本的反应 - 3.2.0 现在我没有收到任何错误
2021-05-30 06:44:14
听起来不错,谢谢!我会尝试这样做,并让您知道它是否有效。
2021-06-11 06:44:14
  • 在文件夹和node.js app后面创建
  • 在您的应用程序的根目录中创建快速路由器
  • 制作一个 server.js 文件

将此代码添加到 server.js

const express = require('express')
const path = require('path')
const app = express()

if (process.env.NODE_ENV === 'production') {
  // Serve any static files
  app.use(express.static(path.join(__dirname, 'client/build')))
  // Handle React routing, return all requests to React app
  app.get('*', (request, response) => {
    response.sendFile(path.join(__dirname, 'client/build', 'index.html'))
  })
}
const port = process.env.PORT || 8080
app.listen(port, () => {
  console.log(`API listening on port ${port}...`)
})

进入到pakage.json

,
  "scripts": {
    "start": "node server.js",
    "heroku-postbuild": "cd client && yarn && yarn run build"
  }

并将路由代理添加到 /folder-name-react-app/pakage.json

  "proxy": "http://localhost:8080"