@postya

Как разделить логику socket io на файлы(роуты) в express js?

Делаю приложение.
Фронтенд на Vue JS
Бэкенд на Node JS(express)
Имеется общий файл с методами socket.io - server.js
В этом файле описано вообще всё.
Я бы хотел перенести методы для каждого роута в отдельный файл, и чтобы каждый компонент на клиенте слушал и отправлял сообщения только на конкретный роут

Текущий результат:
Во vue js в кмопоненте прописан роут, по которому нужно отправлять или слушать методы:
import io from "socket.io-client";
const socket = io("http://localhost:11050");

created() {
    this.$socket.$subscribe("newNumber", (user) => {
      this.addUser(user);
    });
  },
addUser(user) {
      console.log(user);
      this.usersSeries[0].data.push(user);
      this.usersSeries = [
        {
          data: this.usersSeries[0].data,
        },
      ];
    },
  }


В express все методы прописаны в одном файле:
const express = require("express");
const app = express();

server = app.listen(11050, function () {
  console.log("server is running on port 11050");
});

const io = require("socket.io")(server);

io.on("connection", (socket) => {
  console.log("Users component is connected");

  socket.on("disconnect", () => {
    console.log("Users component was disconnected");
  });

  setInterval(() => {
    socket.emit("newNumber", generateRandomNumber());
  }, 1000);
});

function generateRandomNumber() {
  let number = Math.floor(Math.random() * 100);
  const dateTime = new Date().getTime();
  let item = {
    x: dateTime,
    y: number,
  };
  return item;
}


Ожидаемый результат:
Во vue js прописывается конкретный путь в каждом компоненте,и идет прослушка методов толкьо конкретного роута
const socket = io("localhost:11050/users");

В express как-то нужно создать файл и переместить методы из общего файла в файл только для конкретного роута

Как это можно сделать?
  • Вопрос задан
  • 245 просмотров
Решения вопроса 1
@historydev
Острая аллергия на анимешников
Файл донор:

const express = require("express");
const app = express();

server = app.listen(11050, function () {
  console.log("server is running on port 11050");
});

const io = require("socket.io")(server);

io.on("connection", (socket) => {
  console.log("Users component is connected");

  socket.on("disconnect", () => {
    console.log("Users component was disconnected");
  });

  setInterval(() => {
    socket.emit("newNumber", generateRandomNumber());
  }, 1000);
});

function generateRandomNumber() {
  let number = Math.floor(Math.random() * 100);
  const dateTime = new Date().getTime();
  let item = {
    x: dateTime,
    y: number,
  };
  return item;
}

module.exports = { io };


Файл наследник:

const { io } = require('путь_к_файлу_донору');

io.on('connection', (socket) => {

   // Логика текущего роута

})


А если ты хочешь app.post('/socketRoute') - то читай документацию сокетов, там про румы всё разжёвано до мелочей, будешь вешать пустые роуты в экспресс по типу => app.post('/needFuckingSocketRoom', (req, res) => {}); и уже открывать сокет соединение определённого рума после запроса на этот роут, это костыль как по мне, не копался в подобном глубоко
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы