'Socket.io is working on localhost but not working after deploying heroku?
Here is the code of my socket server
const io = require("socket.io")(8080, {
cors: {
// origin: "http://localhost:3000",
origin: "https://mern-bubble.herokuapp.com",
},
});
and herer is my client side code
useEffect(() => {
// socket.current = io("ws://localhost:8800");
socket.current = io("ws://mern-bubble.herokuapp.com:8800");
socket.current.on("getUser", (data) => {
console.log("data from socket", data);
dispatch(updateUserInfo(data));
});
}, [dispatch]);
It works completely fine when i am working on localhost, But when i deploy my project on heroku, socket.io is not responding anything ?
Solution 1:[1]
So I think that port 8800 isn't open on heroku. You should stick to port 3000 and try again. https://devcenter.heroku.com/articles/node-websockets#option-2-socket-io
Solution 2:[2]
Heroku's port are dynamically assigned when starting a Dyno. Instead of hard coding the port 8800
, use the environment variable $PORT
instead.
Solution 3:[3]
Replace your PORT like this.
const port = process.env.PORT || 3200
const io = require("socket.io")(port, {
cors: {
// origin: "http://localhost:3000",
origin: "https://mern-bubble.herokuapp.com",
},
});
Solution 4:[4]
First make sure you have entered the command:
heroku features:enable http-session-affinity
I was stuck on a similar problem when I had everything correct for days, I just needed to enable it on cli. Reference - https://devcenter.heroku.com/articles/node-websockets
On client side, you should enter the url of the site with https:// (conditionally depending on current window location or node_env value):
const newSocket = io('https://my-app.herokuapp.com',
{ transports: ["websocket"] }
);
On server side my MERN app worked by having a single server with a port of 5050 and not having to set anything in particular for the socket server:
import { Server } from "socket.io";
const server = http.createServer(app)
export const io = new Server(server, {
cors: {
origin: 'https://my-app.herokuapp.com',
methods: ["GET", "POST"],
// allowedHeaders: ["my-custom-header"],
credentials: true
}
})
If it works locally and all your urls are correct, try to enter the command mentioned above or look at the heroku node websocket documents.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | DerEchteKroate |
Solution 2 | Jamie Phan |
Solution 3 | Devang Patel |
Solution 4 | DharmanBot |