Socket.io 在 heroku 服务器上不工作,可能是端口问题

Socket.io is not working on heroku server, probably a problem with ports

我已经使用 Socket.io 进行消息传递,创建了一个 MERN 堆栈项目。该应用程序在本地主机上完美运行,但由于某种原因,当我将其部署到 Heroku 时,Socket.io 位停止工作,其余工作正常。我几乎可以肯定这与我处理端口的方式有关。

server.js

const express = require('express');
const path = require('path');
const dataBase = require('./config/db');
const io = require('socket.io')(4000, {
    cors: {
        origin: 'http://localhost:3000',
    },
});

const app = express();

const authRoutes = require('./routes/auth');
const managerRoutes = require('./routes/manager');
const leadRoutes = require('./routes/lead');
const resourceRoutes = require('./routes/resource');

dataBase();

app.use(express.json());

const port = process.env.PORT || 5000;

if (process.env.NODE_ENV === 'production') {
    app.use(express.static(path.join(__dirname, 'client/build')));

    app.get('*', function (req, res) {
        res.sendFile(path.join(__dirname, 'client/build', 'index.html'));
    });
}

io.on('connection', (socket) => {
    socket.on('join', async ({ userId }, callback) => {
         ......some code here
});

app.listen(port, (error) => {
    if (error) console.log(error);
    console.log(`Server started on port ${port}`);
});

chat.jsx 客户端文件

import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';

import { io } from 'socket.io-client';

import Messages from './messages';

let socket;
const Chat = ({ leadId, resourceId, projectId, user }) => {
    const [message, setMessage] = useState('');
    const [messages, setMessages] = useState([]);

    useEffect(() => {
        socket = io(':4000');

        socket.emit(
            'join',
            {
                userId: user._id,
            },
            (error) => {
                if (error) console.log(error);
            }
        );

        return () => {
            socket.emit('disconnection');
            socket.off();
        };
    }, [user]);

    (some code here)

package.json 客户端文件

{
    "name": "task-camp-client",
    "version": "0.1.0",
    "private": true,
    "proxy": "http://localhost:5000",
    "dependencies": {
        "@testing-library/jest-dom": "^5.11.4",
        "@testing-library/react": "^11.1.0",
        "@testing-library/user-event": "^12.1.10",
        ......
}

我试图只包含相关代码,整个项目都在 Github 上。 https://github.com/G-Samarth/taskCamp

如有任何帮助,我们将不胜感激。

因此,在阅读了几篇博客和 Whosebug 帖子后,我找到了解决此问题的方法。希望这对面临类似问题的任何人有所帮助。

server.js

所以,基本上,删除所有出现的静态端口并将 socket.io 和节点服务器连接到同一端口。

const express = require('express');
const http = require('http');
const cors = require('cors');
const path = require('path');
const dataBase = require('./config/db');

const app = express();
const server = http.createServer(app);
const io = require('socket.io')(server);

const authRoutes = require('./routes/auth');
const managerRoutes = require('./routes/manager');
const leadRoutes = require('./routes/lead');
const resourceRoutes = require('./routes/resource');

dataBase();

app.use(express.json());
app.use(cors());

const port = process.env.PORT || 5000;

if (process.env.NODE_ENV === 'production') {
    app.use(express.static(path.join(__dirname, 'client/build')));

    app.get('*', function (req, res) {
        res.sendFile(path.join(__dirname, 'client/build', 'index.html'));
    });
}

io.on('connection', (socket) => {
    socket.on('join', async ({ userId }, callback) => {
         ......some code here
});

server.listen(port, (error) => {
    if (error) console.log(error);
    console.log(`Server started on port ${port}`);
});

chat.jsx

在这里,只需删除静态本地主机URL/port。

    ......
    useEffect(() => {
        socket = io();
            ......

此代码在本地和 Heroku 上都有效。