Ошибка React-приложения: Не удалось создать 'WebSocket': Нельзя инициировать небезопасное соединение WebSocket со страницы, загруженной через HTTPS
Описание проблемы:
Я развертываю приложение на React, но при попытке зайти на страницу через HTTPS получаю странную ошибку.
Когда я захожу на страницу по протоколу HTTPS, возникает следующая ошибка:
SecurityError: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.
Однако при заходе на ту же страницу через HTTP всё работает прекрасно.
Проблема в том, что, насколько я могу судить, я не использую WebSocket. Я проверил код на наличие запросов к 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"
]
}
}
5 ответ(ов)
Для обеспечения транспортной безопасности, как вы могли бы запросить страницу с использованием https://
, замените ws://
на wss://
.
Это указывает на то, что вы хотите установить безопасное соединение WebSocket.
Вот более простое решение. Понизьте версию react-scripts
до 3.2.0
в вашем package.json
(у меня была версия 3.3.0
).
Вам может понадобиться удалить файл package-lock.json
и папку node_modules
(rm -rf package-lock.json node_modules
), затем выполните команду npm i
. Зафиксируйте изменения в вашем package.json
и package-lock.json
в репозитории.
Вам не будет трудно вспомнить, что react-scripts
основан на webpack, и, если я не ошибаюсь, использует webpack-dev-server
для ускорения разработки. Он применяет веб-сокеты для связи с клиентом, чтобы инициировать горячую перезагрузку при обнаружении изменений в файлах на диске.
Скорее всего, вы просто запускаете приложение в режиме разработки. Если вы собираетесь развернуть его в производственной среде, вам следует выполнить команду npm run build
, которая создаст набор JavaScript файлов, которые вы сможете обслуживать с помощью вашего любимого веб-сервера.
Чтобы создать базовую структуру для вашего приложения на Node.js с использованием Express, выполните следующие шаги:
- Создайте папку в корне вашего проекта для вашего приложения Node.js.
- В этой папке создайте файл
server.js
, который будет служить основным серверным файлом вашего приложения. - Затем добавьте следующий код в
server.js
:
const express = require('express')
const path = require('path')
const app = express()
if (process.env.NODE_ENV === 'production') {
// Обслуживаем статические файлы
app.use(express.static(path.join(__dirname, 'client/build')))
// Обрабатываем маршруты React, возвращая все запросы в React-приложение
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 слушает на порту ${port}...`)
})
- В вашем
package.json
добавьте следующее в раздел"scripts"
:
"scripts": {
"start": "node server.js",
"heroku-postbuild": "cd client && yarn && yarn run build"
}
- Также добавьте прокси-маршрут в ваш
package.json
в папке вашего React-приложения (по пути/folder-name-react-app/package.json
):
"proxy": "http://localhost:8080"
Следуя этим шагам, вы сможете настроить серверное приложение, которое будет обслуживать ваши статические файлы для React в production-среде. Не забудьте, что в режиме разработки для запуска приложения может потребоваться дополнительная настройка.
Если вы сталкиваетесь с проблемой развертывания на Heroku, рекомендую понизить версию модуля react-scripts
до 3.2.0
. Для этого выполните следующие шаги:
- Удалите файл
package-lock.json
. - Удалите папку
node_modules
. - Измените версию
react-scripts
на3.2.0
в вашемpackage.json
. - Запустите команду
npm install
, чтобы установить все модули заново.
Это должно помочь решить вашу проблему с развертыванием.
Обнаружена ошибка: Невозможное нарушение: Неверный тип элемента: ожидался строковый тип (для встроенных компонентов) или класс/функция, но получен объект
Что делает npm install --legacy-peer-deps? Когда рекомендуется использовать и какой потенциальный случай?
React - Изменение неконтролируемого ввода
Использование IndexRoute в react-router v4 с React
Как остановить Babel от трансформации 'this' в 'undefined' и добавления "use strict"