Приложение Heroku w / socket.io отказывается от соединения или отправляет 404 - PullRequest
1 голос
/ 13 мая 2019

После нескольких дней попыток выяснить, в чем дело, я пришел сюда за помощью.Мое приложение Heroku использует React в качестве внешнего интерфейса и Socket.io в качестве внутреннего.Вот упражнение: Heroku запускает dyno с командой «npm run start», которая установлена ​​на concurrently 'npm run react' 'npm run server' для запуска как переднего, так и заднего конца.

Но даже если я заставлю это работать (не могу даже объяснитькак), это работает только на моем компьютере.Если я пытаюсь перейти на ту же страницу на моем телефоне, запросы не поступают, и я даже не могу сказать, почему, поскольку нет журнала отладки.

Вот мой файл /src/server/index.js:

const express = require("express");
const app = express();
const server = require("http").Server(app);
const io = module.exports.io = require('socket.io')(server)

const port = process.env.PORT || 80

const socketManager = require('./SocketManager') // All functions there

io.on('connection', socketManager);
// app.use(express.static(__dirname + '/../../build'))
server.listen(port,() => {
    console.log("Listening on port", port)
})

Я использую файл конфигурации для динамического изменения URL-адреса сервера.

let server = 'https://hidden-waters-73936.herokuapp.com/socket.io/?EIO=4&transport=websocket'; // 404

// let server = window.location.hostname; // 404, same as above
// let server = 'http://localhost:4001'; // works locally on heroku
// let server = '/'; // 404, not found, AND CONNECTION_REFUSED
// let server = 'https://127.0.0.1:4001'; // CONNECTUIN_REFUSED
// let server = 'http://0.0.0.0:4001'; // Doesn't work at all

module.exports = server;

Я закомментировал строки, которые я пробовал.Последней попыткой было изменение https на ws, как кто-то рекомендовал ранее, затем я попытался добавить .com:80/socket.io..., но все равно не повезло.Каждый раз, когда возникает другая ошибка

Вот как выглядят ошибки с незакомментированной серверной переменной: https://imgur.com/Lf0BxV3

Я ожидаю, что она сделает успешные запросы как на моем компьютере, так и на телефоне.Я попробую свой ноутбук, чтобы просмотреть журналы и проверю, не найду ли я что-нибудь полезное.

** ОБНОВЛЕНИЕ для @ Ashish

React component

import server from '../../config/serverConfig'
const socket = socketIOClient(server);

componentDidMount() {
socket.emit("test", {});
}

** РЕДАКТИРОВАТЬ: Кажется, что мои журналы Heroku говоряту меня что-то еще происходит:

2019-05-13T16:59:55.472135+00:00 app[web.1]: [1] [33m[nodemon] 1.19.0[39m
2019-05-13T16:59:55.474073+00:00 app[web.1]: [1] [33m[nodemon] to restart at any time, enter `rs`[39m
2019-05-13T16:59:55.475362+00:00 app[web.1]: [1] [33m[nodemon] watching: *.*[39m
2019-05-13T16:59:55.477060+00:00 app[web.1]: [1] [32m[nodemon] starting `node src/server/index.js`[39m
2019-05-13T16:59:56.164302+00:00 app[web.1]: [1] Listening on port 40497
2019-05-13T16:59:56.573081+00:00 heroku[web.1]: State changed from starting to up
2019-05-13T16:59:57.538639+00:00 app[web.1]: [0] Something is already running on port 40497.
2019-05-13T16:59:57.585807+00:00 app[web.1]: [0] npm run react exited with code 0
2019-05-13T17:01:19.780332+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=GET path="/" host=hidden-waters-73936.herokuapp.com request_id=42a6c345-94b7-441a-afde-82c1e9c52e97 fwd="90.191.14.93" dyno=web.1 connect=1ms service=30004ms status=503 bytes=0 protocol=https

1 Ответ

0 голосов
/ 14 мая 2019

Решение:

По крайней мере, для меня это пока работает. Вот что я изменил: файл конфигурации сервера (AKA, что клиент слушает)

let server = window.location.hostname;

const env = process.env.NODE_ENV;

if (env === 'development') {
    server = 'http://localhost:4001';
    console.log("Using dev port")
}
module.exports = server;

package.json

"scripts": {
    "client-install": "npm install",
    "start": "node src/server/index.js",
    "server": "nodemon src/server/index.js",
    "client": "npm start",
    "build": "react-scripts build",
    "react": "react-scripts start",
    "dev": "concurrently \"npm run server\" \"npm run client\"",
    "heroku-postbuild": "NPM_CONFIG_PRODUCTION=false npm install && npm run build"

Heroku procfile: web: npm start

ОДНАКО. Я использую React Router для навигации по разным страницам. Как только страница обновляется на геройку, возвращается «Не найдено». Я предполагаю, что он ищет файл .html с именем пути, но мне нужно, чтобы он переписал в index.html, как это делает Firebase. Я попытался использовать create-реагировать-app-buildpack, с nginx, и, похоже, мой сервер Failed to load resource: the server responded with a status of 405 (Not Allowed) а затем меняет точку прослушивания (я полагаю) polling-xhr.js:269 POST https://XXXXXXXXXX.herokuapp.com/socket.io/?EIO=3&transport=polling&t=MgpToRX 405 (Not Allowed)

Есть ли способ определить причину проблемы? Журналы Heroku, кажется, не говорят ничего полезного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...