Chat Application - SocketIo
8/8/25About 1 min
Socket.IO
Socket.io giúp nhiều client có thể giao tiếp realtime với nhau.
1.Install
$ npm i socket.io
2.Setup:
const http = require('http');
const app = express();
const server = http.createServer(app);
const io = require('socket.io')(server, {
cors: {
origin: '*',
}
});
...
function listen() {
server.listen(process.env.PORT || 5000, () => console.log(`App listening on port 5000`));
}
Thay đổi lại hàm listen
3.Connection:
Tạo 2 listener function: join
và sendMessage
.
io.on('connect',
(socket) => {
// join room
socket.on('join', ({roomId, isCreate}, callback) => {
const query = Room
.findById(new ObjectId(roomId))
.populate('messages.user', 'name avatar');
query.exec(function (err, room) {
if (err) return next(err);
if (room) {
socket.join(roomId);
if (isCreate) {
socket.broadcast.emit(`rooms`, room);
}
}
});
});
// Send message
socket.on('sendMessage', ({roomId, message}, callback) => {
const userRequest = socket.request.user;
User.findById(new ObjectId(userRequest._id), (err, user) => {
if (err) return callback(err);
if (user) {
Room.findById(new ObjectId(roomId), (err, room) => {
if (err) return callback(err);
if (room) {
/* Add message */
room.addMessage(user, {
msgType: 'text',
text: message,
user: user._id
});
/* Emit message */
const messageEmit = {
_id: user._id,
avatar: user.avatar,
type: 'text',
text: message,
date: new Date()
}
io.to(roomId).emit(`message:${roomId}`, messageEmit);
}
});
}
})
});
socket.on('disconnect', () => {
})
});
Authentication:
Với socketio cần thêm function wrap để tạo tương thích middleware với passport.
const wrap = middleware => (socket, next) => middleware(socket.request, {}, next);
io.use(wrap(passport.initialize()));
io.use(wrap(passport.authenticate('jwt', {session: false})));
Sau khi socket request qua passport middleware, có thể get dữ liệu user bằng
socket.request.user;
Series: