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 上都有效。
我已经使用 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 上都有效。