This is my server.js file. I am unable to connect user in the websocket to server file. I have tried multiple approaches but none of them worked. I am using the same version of the socket-io file. My db connection is successful and server is listening as well but unable to connect socket io in the backend.
import express from 'express';
import dotenv from 'dotenv';
import cookieParser from 'cookie-parser';
import connectDB from './databaseConnection/connectDatabase.js';
import userRoutes from "./routes/userRoutes.js";
import postRoutes from "./routes/postRoutes.js";
import messageRoutes from "./routes/messageRoutes.js";
import { v2 as cloudinary } from "cloudinary";
import { server, app } from './socket/socket.js';
dotenv.config();
connectDB();
cloudinary.config({
cloud_name: process.env.CLOUDINARY_CLOUD_NAME,
api_key: process.env.CLOUDINARY_API_KEY,
api_secret: process.env.CLOUDINARY_API_SECRET,
});
// Middlewares
app.use(express.json({ limit: "50mb" }));
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser());
// Routes
app.use("/api/users", userRoutes);
app.use("/api/posts", postRoutes);
app.use("/api/messages", messageRoutes);
server.listen(3000, () => {
console.log(`Server listening at http://localhost:3000`);
});
and this is socket.js file
import { Server } from "socket.io";
import http from "http";
import express from "express";
import Message from "../models/messageModel.js";
import Conversation from "../models/conversationModel.js";
const app = express();
const server = http.createServer(app);
const io = new Server(server, {
cors: {
origin: "http://localhost:3001",
methods: ["GET", "POST"],
},
});
export const getRecipientSocketId = (recipientId) => {
return userSocketMap[recipientId];
};
const userSocketMap = {}; // userId: socketId
io.on("connection", (socket) => {
console.log("User connected: ", socket.id);
const userId = socket.handshake.query.userId;
if (userId != "undefined") userSocketMap[userId] = socket.id;
io.emit("getOnlineUsers", Object.keys(userSocketMap));
socket.on("markMessagesAsSeen", async ({ conversationId, userId }) => {
try {
await Message.updateMany({ conversationId: conversationId, seen: false }, { $set: { seen: true } });
await Conversation.updateOne({ _id: conversationId }, { $set: { "lastMessage.seen": true } });
io.to(userSocketMap[userId]).emit("messagesSeen", { conversationId });
} catch (error) {
console.log(error);
}
});
socket.on("disconnect", () => {
console.log("user disconnected");
delete userSocketMap[userId];
io.emit("getOnlineUsers", Object.keys(userSocketMap));
});
});
export { io, server, app };
I am unable to connect socket in the backend.
I have tried multiple things and this is my SocketContext.js file
import { createContext, useContext, useEffect, useState } from "react";
import { useRecoilValue } from "recoil";
import io from "socket.io-client";
import userAtom from "../atoms/userAtom";
const SocketContext = createContext();
export const useSocket = () => {
return useContext(SocketContext);
};
export const SocketContextProvider = ({ children }) => {
const [socket, setSocket] = useState(null);
const [onlineUsers, setOnlineUsers] = useState([]);
const user = useRecoilValue(userAtom);
useEffect(() => {
const socket = io("/", {
query: {
userId: user?._id,
},
});
setSocket(socket);
socket.on("getOnlineUsers", (users) => {
setOnlineUsers(users);
});
return () => socket && socket.close();
}, [user?._id]);
return <SocketContext.Provider value={{ socket, onlineUsers }}>{children}</SocketContext.Provider>;
};
New contributor
Karan Kaushal is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.