Клиент Socket.io отвечает только один раз - PullRequest
0 голосов
/ 04 апреля 2019

Я создаю экспресс-сервер, который заставит страницу index.html перенаправить на новую страницу при получении запроса на публикацию.Все отлично работает, но только в первый раз.Я должен регулярно перезагружать сервер, чтобы он работал.Вот некоторые фрагменты кода.

//server.js

const app = express();
app.use(express.static(`${__dirname}/public`));

const server = http.createServer(app);
const io = socketIo(server, {'force new connection': true });

io.on('connection', (socket) => {
    console.log('New client connected');

    app.post('/redirect', (req,res) => {
        socket.emit('redirect');
        res.status(200).send('Redirected');
    });
});
<body>

   <!-- Jquery CDN -->
   <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
   <!-- Socket.IO -->
   <script src="/socket.io/socket.io.js"></script>

   <script>
   let socket = io.connect({'force new   connection': true });
   socket.on('connect', () => {
       console.log('Connected to Server');
   });

   socket.on('redirect', () => {
       window.location.replace("https://google.com");
   });
   </script>

</body>

1 Ответ

1 голос
/ 04 апреля 2019

Основная проблема заключается в том, что у вас есть маршрут внутри слушателя сокетного соединения. Маршрут должен быть зарегистрирован только один раз . И connection запускается несколько раз.

const app = express();
app.use(express.static(`${__dirname}/public`));

const server = http.createServer(app);
const io = socketIo(server, {'force new connection': true });

app.post('/redirect', (req,res) => {
    res.status(200).send('Redirected');
    io.emit('redirect');
    // io.to(someSocketOrRoom).emit('redirect');

});

io.on('connection', (socket) => {
    console.log('New client connected');     
});

Если вы хотите отправлять сообщения в сокет, когда вы получаете сообщение извне сокета, в данном случае это HTTP Post. Вам необходимо использовать io.emit для передачи на все сокеты или io.to().emit для передачи на конкретный.

Теперь нет смысла перенаправлять с помощью socket.io, если вы публикуете на /redirect, почему бы вам просто не перенаправить пользователя с помощью res.redirect, не испуская ничего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...