【问题标题】:How to use vue-socket.io + vuex for realtime?如何实时使用 vue-socket.io + vuex?
【发布时间】:2020-07-11 02:33:05
【问题描述】:

我有一个供稿,用户可以在其中对帖子进行投票

服务器> node,express,socket.io v2.3.0

服务器 > app.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(' ');
    })            
})

服务器 > votePost.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 post 模块(动作内部)

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

此时,我从服务器接收更新的帖子并更新我看到更新的状态。 但是我也需要每次使用都看到更新后的帖子

为什么会这样?我缺少什么?,所有用户都应该在有人更新时看到更改

【问题讨论】:

    标签: node.js express vue.js socket.io vuex


    【解决方案1】:

    目前还不清楚您要做什么,但如果我理解正确,您希望在一个套接字触发“create”事件后将“created”事件发送到所有套接字。如果是这样:

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

    问题是,由于某种原因,您在某个“创建”函数中注册了“连接”事件,这似乎没有多大意义。您的 io.on('connection') 需要在某个高级模块中注册一次,并且在其范围内,您需要为连接套接字注册所有特定事件。我没有你的完整代码,所以我不能说,但这是你需要看的东西。

    【讨论】:

    • 你好@i.brod 请原谅我的解释,我只希望如果用户创建一个新名称,每个用户都可以看到它,就像聊天一样,创建的事件是新数据,当它到来时对于客户端,必须将其更新给每个人,顺便说一下,我要检查双 on.connection 事件,这可以创建重复吗?你有什么不和谐或whatsapp?
    • 我们可以在这里交流...你能解释一下你有什么叫做 create 函数吗?您的 on('create') 事件注册需要在此函数之外。在事件处理程序中,您可以调用此“创建”函数..
    • 我会更新问题让你看清楚,给我一分钟
    • 老兄,我发现了问题!,检查我的答案。但是我和你一样对创建 2 个连接有疑问,知道如何解决这个问题吗?
    【解决方案2】:

    我自己找到了答案。问题是我使用的是

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

    其中 socket.emit 表示更新的数据将发送给创建该操作的用户,但将该事件更改为:

    **io.sockets.emit**
    

    这样每次使用都会获得更新的数据。

    显然我不是 socketio 方面的专家,有什么好的 socket 课程吗?谢谢

    注意:我对使用 2 .on('connection') 方法有很多疑问,有什么建议可以模块化吗?

    【讨论】:

    • on('connection) 应该定义一次。这不是套接字事件,而是 IO 事件。把它放在最上面的模块(或一些专用的 socketIO 配置模块..)中,在那里你设置你的 socketio 。关于课程:我建议参加 Andrew Mead 在 Udemy 上的 nodejs 课程:udemy.com/course/the-complete-nodejs-developer-course-2 那里有一个关于 socketio 的模块
    • 我建议学习整个node课程,而不仅仅是socketio部分,你可以在那里学到很多有用的东西。
    猜你喜欢
    • 2020-04-22
    • 2019-06-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2018-04-17
    相关资源
    最近更新 更多