Ничего не происходит при отправке из контроллера экспресс-маршрута

#node.js #sockets #express #websocket #socket.io

#node.js #сокеты #экспресс #websocket #socket.io

Вопрос:

Мне действительно нужна помощь в решении этой проблемы, с которой я сталкиваюсь socket.io. Поверьте мне, я просмотрел практически каждый пост на эту тему…

App.js

 const app = express();
const http = require('http').Server(app);
const io = require('socket.io')(http);

io.on('connection', function (socket) {
  console.log('a user connected');
  socket.on('disconnect', function () {
    console.log('User Disconnected');
  });
  socket.on('example_message', (msg) => {
    console.log('message: '   msg);
  });
});

app.set('socketio', io);

const port = process.env.PORT || 7777;
app.listen(port);
console.log(`Server listening at ${port}`);

module.exports = app;
  

Routes.js

 const express = require('express');
const router = require('express-promise-router')();


router.route('/test-route')
    .put(TestController.testEmit);

module.exports = router;
  

TestController.js

 module.exports = {

  testEmit: async (req, res, next) => {
    const io = req.app.get("socketio");
    console.log(io); // this ACTUALLY logs the entire socketio object!
    io.emit('example_message', 'abc'); // NOTHING HAPPENS
  }

}
  

Каждый раз, когда я перезагружаю свой клиент, я вижу «подключенный пользователь» в окне терминала. Однако, когда я пытаюсь выполнить отправку из контроллера testEmit, в итоге ничего не происходит.

Комментарии:

1. Вы хотите передать сообщение всем клиентам? Также, пожалуйста, покажите настройки клиентского кода для получения сообщения.

2. Существует только один клиент, предназначенный для получения сообщения по этому маршруту. Я еще ничего не настроил на стороне клиента для получения сообщения, так как я не смог заставить серверную часть работать!

3. если часть, на которую вы ссылаетесь, которая не работает, io.emit то это потому, что у вас нет настройки клиента для получения события. socket.on на сервере будут прослушиваться только исходящие сообщения клиента , а не сервера.

4. Итак, что, по вашему мнению, было бы лучшим способом решить следующий случай: пользователь отправляет данные в форму на клиенте № 1 -> данные хранятся в БД с использованием экспресс-маршрута -> данные объединяются с другими данными, извлеченными из БД -> данные передаются клиенту № 2?

5. все зависит от того, как вы определяете, какой клиент должен получить сообщение. Вероятно, самым надежным способом было бы использовать room , это продолжало бы работать по мере масштабирования вашего приложения. io.emit будет транслироваться сообщение на все подключенные сокеты.