Как использовать vue -socket.io + vuex для реального времени? - PullRequest
0 голосов
/ 30 марта 2020

У меня есть канал, где пользователи могут голосовать за сообщения

Сервер> узел, express, socket.io v2.3.0

Сервер> приложение. js

client.on('connection', socket =>{
    socket.emit('success', {message: 'Server Accecpting Connections'});
    // CLients connected
        client.clients((error, clients) => {
            if (error) throw error;
            console.log(`<----- users connected ->`)
            console.log(clients);
            console.log(' ');
        })
    // Disconnected user
    socket.on('disconnect',() =>{
        console.log(`user disconnected  ---> ${socket.id}`);
        console.log(' ');
    })            
})

Сервер> voicePost. js

    const votePost = function(client){
        client.on('connection', socket =>{
            socket.on('votePost',async post =>{
                try {
    // logic
    socket.emit('postVoted', {updatedPost})
    }
                } catch (error) {
                    console.log(error);
                }
module.exports = votePost

Клиент> vue CLI, vuex, socket.io v2 .3.0, vue -socket.io v3.0.7

Клиент> main. js "Конфигурация:"

import VueSocketIO from 'vue-socket.io'
import SocketIO from "socket.io-client"
  Vue.use(new VueSocketIO({
    debug: true,
    connection: SocketIO('http://localhost:3000'), //options object is Optional
    vuex: {
      store,
      actionPrefix: "SOCKET_",
      mutationPrefix: "SOCKET_"
    }
  })
  );

Проверка соединения с сервером на post модуль vuex внутри действий Получение успешного сообщения от сервера (все подключенные сокеты видят это сообщение)

"SOCKET_success"(state, server) {
    console.log(server.message);
},

Передача данных на сервер от компонента внутри методов:

createVote(data){
    const post = {SOMEPOSTDATA}
    this.$socket.emit('votePost', post)
},

Получение данных, созданных с сервера: Модуль почты vuex (внутри действий)

"SOCKET_updatedPost"({commit,state}, server) {
    state.post = server.updatedPost
},

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

Почему это происходит? Что мне не хватает ?, все пользователи предполагают видеть изменения, когда кто-то обновляет его

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Совершенно непонятно, что вы пытаетесь сделать, но если я правильно понимаю, вы хотите, чтобы «созданное» событие было отправлено во все сокеты после того, как один сокет вызовет событие «создать». Если это так:

 socket.on('create',(name)=> {
        io.of('/').emit('created', {name})            
    })

Проблема в том, что по какой-то причине вы регистрируете событие "connection" в некоторой функции "create", что, кажется, не имеет особого смысла. Ваш io.on ('connection') должен быть зарегистрирован один раз, в каком-то модуле высокого уровня, и в его пределах вам нужно зарегистрировать все указанные c события для соединительного сокета. У меня нет вашего полного кода, поэтому я не могу сказать, но это то, на что вам нужно обратить внимание.

0 голосов
/ 30 марта 2020

Я нашел ответ сам. Проблема в том, что я использовал

**socket.emit('postVoted', {updatedPost})**

Где socket.emit Означает, что обновленные данные передаются пользователю, создавшему это действие, но меняя это событие на:

**io.sockets.emit**

Таким образом, каждое использование получает обновленные данные.

Очевидно, я не эксперт по socketio, есть хороший курс по сокетам? спасибо

ПРИМЕЧАНИЕ: У меня есть серьезные сомнения по поводу использования методов 2 .on ('connection'), есть какие-либо советы о том, как это смоделировать?

...