Sử dụng Socket io trong mô hình MVC Express và Node.js theo 2 (video + source)

Nội dung bài viết

Video học lập trình mỗi ngày

Mô hình MVC cho đến thời điểm này thì theo tôi vẫn giữ một vị trí đặc biệt, mặc dù đã có những pattern khác ra đời. MVC giúp chúng ta chia nhỏ modules mà dễ dàng quản lý, và socketio sẽ được tích hợp như thế nào?

Câu hỏi về Socket io

Trong Fanpage TipJS có post một câu hỏi về SocketIO, giống như tiêu đề của bài viết. Câu hỏi như sau: Mọi người cho em hỏi làm sao để viết socket.io trong controller ạ. Em viết trong file server thì được nhưng không biết viết trong controller. Mọi người chỉ em với ạ.

Tôi nghĩ câu hỏi này rất cần thiết vào lúc này khi lược tương tác câu hỏi này khá nhiều, theo suy nghĩ thì đó là vấn đề được các bạn quan tâm. Hy vọng bài viết này sẽ giúp bạn có một cấu trúc khá đầy đủ theo mô MVC.

Để hiểu tốt nhất về mô hình MVC thì tôi đã giới thiệu một pattern chuẩn trong video Cấu trúc dự án API REST từ lv1 đến lv4 các bạn có thể tham khảo, và nếu như trong quá trình tham khảo bạn nào có ý tưởng hay có một pattern nào hay hơn thì xin mời cùng bàn luận, chúng ta có thể học hỏi lần nhau.

Video Socket io trong mô hình MVC Express

Tích hợp socket io vào controller express theo MVC

Đầu tiên chúng ta sẽ clone một repo được triển khai làm ví dụ trong trang chủ socket.io và sử dụng command sau:

git clone https://github.com/socketio/chat-example.git socket-chat-express-mvc

Vì project này không sử dụng MVC nên chúng ta phải làm lại theo câu hỏi trên. Hay xem xét những đoạn code sau, nếu không hiểu vui lòng xem video mà tôi đã trình bày một cách rõ ràng, và nếu có câu hỏi vui lòng để lại comment dưới video, chúng ta sẽ tiếp tục làm rõ hơn.

File: index.js

const  app  =  require('express')();
const  http  =  require('http').Server(app);
const  io  =  require('socket.io')(http);
const  port  =  process.env.PORT  ||  3000;
const  SocketServices  =  require('./src/services/chat.service')
// can chu y toi khai niem global duoc gioi thieu trong video
global.__basedir  =  __dirname;
global._io  =  io;  // cach 2

// app.get('/', (req, res) => {
// res.sendFile(__dirname + '/index.html');
// });
// io.on('connection', (socket) => {
    // socket.on('chat message', msg => {
    //         io.emit('chat message', msg);
    // });
// });
// cach 1: use middleware express
// app.use( (req, res, next) => {
// res.io = io;
// next()
// })
app.use(require('./src/routes/chat.route'))
global._io.on('connection',  SocketServices.connection)
http.listen(port,  ()  =>  {
    console.log(`Socket.IO server running at http://localhost:${port}/`);
});

File: src/routes/chat.route.js

const  express  =  require('express')
const  route  =  express.Router();
const  {homepage,  message}  =  require('../controllers/chat.controller')

route.get('/',  homepage)
route.get('/api/message',  message)

module.exports  =  route;

File: src/controllers/chat.controller.js

var  that  =  module.exports  =  {

    homepage:  async(req,  res,  next)  =>  {
        res.sendFile(__basedir  +  '/index.html');
    },

    message:  async(req,  res,  next)  =>  {
        const  {  msg  }  =  req.query;
        // const io = res.io;
        _io.emit('chat message',  msg)
        return  res.json({  code:  200,  msg})
    }
}

File: src/services/chat.service.js

class  SocketServices{

    //connection socket
    connection(  socket  ){
        socket.on('disconnect',  ()  =>  {
        console.log(`User disconnect id is ${socket.id}`);
    })

    // event on here

    socket.on('chat message',  msg  =>  {
        console.log(`msg is:::${msg}`)
        _io.emit('chat message',  msg)
    })

    // on room...
}
module.exports  =  new  SocketServices();

Chú ý: File index sẽ require file service.

Source code

Git:

git clone https://github.com/anonystick/socket-express-mvc-structure.git

Tks!

Có thể bạn đã bị missing