Socket IO отлично работает на локальной машине, но не работает на Heroku - PullRequest
3 голосов
/ 27 мая 2019

Ситуация:

Я создаю веб-приложение (SPA) с ReactJS и ExpressJS.Я использую Socket.IO для чата в реальном времени.Когда я собираю свое приложение и запускаю его на локальном хосте, все работает нормально, поэтому я решил развернуть его на Heroku.Мое приложение успешно собрано на Heroku и готово к использованию.

Проблема:

Поэтому я вхожу в свое приложение, чтобы посмотреть, нормально ли оно работает на Heroku.Приложение кажется нормальным, когда я захожу на страницу входа и страницу регистрации (эти страницы не работают с Socket.IO).Но когда я захожу на страницу чата (эта страница использует Socket.IO для чата в реальном времени), клиент падает, он не загружается и выдает следующую ошибку.

Ошибка:

Я получаю следующую ошибку:

> Uncaught TypeError: Cannot read property 'DEBUG' of undefined
    at load (browser.js:168)
    at Object.eval (browser.js:178)
    at eval (browser.js:197)
    at Object../node_modules/socket.io-client/node_modules/debug/src/browser.js (vendor.js:2639)
    at __webpack_require__ (main.js:788)
    at fn (main.js:151)
    at eval (url.js:7)
    at Object../node_modules/socket.io-client/lib/url.js (vendor.js:2628)
    at __webpack_require__ (main.js:788)
    at fn (main.js:151)

Когда я смотрю на модуль онлайн, он имеет следующую проверку:

// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
  if (!r && typeof process !== 'undefined' && 'env' in process) {
    r = undefined.DEBUG; //the error is showed here
  }

Итак, я запускаю свое приложение наlocalhost и поиск по вышеуказанному коду, я получаю это:

// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
  if (!r && typeof process !== 'undefined' && 'env' in process) {
    r = { /*A JSON object contains .env variables*/ }.DEBUG;
  }

код:

Это мой сервер:

//requirements...
const socket = require("./server/socket");

const app = express();
const server = http.createServer(app);
const port = process.env.PORT || 3000;

//middlewares...
//routes...
//database connection...

socket(server);

server.listen(port);
console.log("Server started on: " + port);

Мой сокетsetup:

const socketIO = require("socket.io");

const socket = server => {
    const io = socketIO(server);
    const chat = io.of("/chat");

    chat.on("connection", client => {
        console.log("User started chat!");

        client.on("disconnect", () => {
            console.log("User left chat!");
        });

        client.on("sendMessage", msg => {
            const data = msg;
            client.broadcast.emit("incomingMessage", { data });
        });
    });
};

module.exports = socket;

Реагировать на компонент, который использует Socket.IO:

const _ChatBox = ({ props }) => {
    const [connection] = useState(io("/chat"));

    useEffect(() => {
        connection.on("incomingMessage", message => {
            //receive message...
        });
    }, []);

    const sendMessageToSocket = data => {
        connection.emit("sendMessage", data);
    };

    return (
        /* JSX here */
    );
};

Что я хочу:

Я хочу знать, есть лиЕсть какие-либо проблемы с моим кодом.Когда я развертываю свое приложение в Heroku, нужно ли выполнять какие-либо дополнительные настройки в Heroku, чтобы приложение работало с Socket.IO?

Ответы [ 2 ]

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

Проведя часы, изучая и просматривая мой код, я выяснил, почему мое приложение не работает на Heroku.Это потому, что клиент использует модуль dotenv, а я настраиваю его в webpack.config.js:

//...requirements
const dotenv = require("dotenv");
const webpack = require("webpack");

module.exports = {
    //...configs
    plugins: [
        //...other plugins
        new webpack.DefinePlugin({
            "process.env": JSON.stringify(dotenv.parsed)
        })
    ]
};

Затем, когда я разверну свое приложение на Heroku, Heroku соберет мой клиент из исходного кода, и сервер будет искатьчасть интерфейса в папке dist.Теперь клиент не может найти файл .env в Heroku, поэтому он не может загрузить переменные среды, из-за которых выдается ошибка.

Я удалил dotenv, потому что он мне сейчас не нужен.

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

Проблема не в том коде, который вы вставили, или, по крайней мере, я в этом сомневаюсь. Если вы посмотрите на модуль онлайн, вы увидите, что он имеет следующую проверку:

    // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
    if (!r && typeof process !== 'undefined' && 'env' in process) {
        r = process.env.DEBUG;
    }

Вы заметите, что он читает это process.env, это вещь Узла / Электрон. Внутри консоли вашего клиента введите window.process, если вы что-то получаете, это, вероятно, так. Он проверяет process ... вероятно, веб-пакет

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