重新与聊天频道重新建立和断开连接

时间:2019-03-10 01:42:52

标签: javascript twilio twilio-api twilio-programmable-chat

请考虑以下情形...

  1. 会员连接到聊天频道
  2. 成员与聊天频道断开连接
  3. 同一成员尝试重新连接到相同的聊天频道

我的问题是以下...在步骤2和3之间,当成员尝试重新连接到同一频道时,出现错误“成员已存在”。为了解决该问题,我尝试了以下步骤:

2.1调用channel.leave()

2.2 channel.leave()成功返回

2.3成员尝试重新连接到同一聊天频道

  1. 会员成功连接到同一聊天频道

成功重新连接后,当成员尝试发送消息时,它会出现两次。不是可行的解决方案。除了尝试使用channel.leave(),还尝试使用channel.removeMember(identity)。重新连接到同一频道后,再次,如果该成员发送一条消息,它将出现两次。最后一个问题的时间了,一个成员如何/应该如何与聊天频道进行顺畅的连接和断开连接,以便它可以像该成员从未离开过频道一样继续进行对话?

谢谢!

编辑:

第1步

  const token = await axios.post('/twilio/chat', 
                { identity: identity , room: channelName }, 
                { headers: header })

第2步。

   const client = await Chat.Client.create(token);

第3步。

   const channel = await client.getChannelByUniqueName(channelName)

第4步。

   const joinedChannel = await channel.join();

第5步

   const messages = await channel.getMessages()

   messages.items.forEach((message) => {                                                          
    //Consume unread messages...                                                                       
   })    

   channel.setAllMessagesConsumed() 

第6步。听添加的消息

   channel.on('messageAdded', (message) => {    
   //When sending a message, this is where I get it duplicated after reconnecting to room
   })
    const previousChannel = await channel.leave()

第7步。离开频道时......

    const previousChannel = await channel.leave()    

经过多次尝试和错误,我终于得出以下结论。为了“解决”问题,我必须刷新选项卡,然后为了重新创建它,请按照上述步骤操作而不刷新选项卡...内存泄漏?

Firefox 65.0.1

铬72.0.3626.53

更新:

已修复。在第7步中,离开房间后,客户端必须正常关闭...

 client.shutdown()            

这不是一个非常友好的修复程序,因为甚至没有将其记录为离开房间的必要步骤。最可能的原因确实是某处内存泄漏。希望此错误能尽快解决...

3 个答案:

答案 0 :(得分:1)

这里是Twilio开发人员的传播者。

我相信您重复的消息是因为您没有将messageAdded处理程序与旧的通道对象断开连接。离开频道后,请尝试同时删除事件监听器。

channel.off('messageAdded', this.messageAdded);

关于离开和重新加入之间的错误,您可能需要在完全确定成员已离开之前先监听频道memberLeft事件。否则,处理错误是一种合理的处理方法。

答案 1 :(得分:0)

一个私人频道无法看到或直接加入。仅通过REST邀请才能进入这些频道。私人频道的创建者和管理员成员将获得访问唯一邀请的权限,他们可以将邀请传递给他人以加入他们的论坛。这些仅对参与者可见,并且将减少客户端启动时的频道同步时间。

答案 2 :(得分:0)

如果用户已加入该频道并尝试再次加入该频道,则会引发错误消息

成员已经存在

要避免这种情况,我要做的是在服务器端创建通道(这是twilio本身建议的),请将两个参与者都添加到该通道(仍在服务器端)。频道docs here

def create_channel_and_add_members(channel_name, identity, invited_identity, channel_type="private")
  channel = @client.chat.services(ENV["TWILIO_CHAT_SERVICE_SID"])
    .channels
    .create(unique_name: channel_name, type: channel_type)
  if channel && add_member(identity, channel.sid) && add_member(invited_identity, channel.sid)
    return channel.sid
  end
end

其中identity是您登录的用户的唯一标识符,而invited_identity是您要与之建立一对一聊天的用户的唯一标识符。
添加成员函数是,我使用了member resource docs

def add_member(identity, channel_id)
  member = @client.chat.services(ENV["TWILIO_CHAT_SERVICE_SID"])
    .channels(channel_id)
    .members
    .create(identity: identity)
  if member
    true
  else
    false
  end
end

create_channel_and_add_members返回了一个频道SID到前端,我曾经使用此代码在前端侧获取了频道本身

chatClient.getChannelBySid(sid_of_channel).then((channel)=>{
  console.log(channel);
  // you can now set event listeners on this channel object directly.
  // no need to call join() on it since, our server side code has already added the members(which means they've joined it)
  //to receive the messages of this channel, set an event listener on the channel
  channel.on('messageAdded', function(message) {
    console.log("Messagge is received", message);
  });
})

下次您要获取用户的频道。您只需获取用户已订阅(即已加入)的频道,

chatClient.getSubscribedChannels().then(function(paginator) {
  console.log("Your subscribed channels are ", paginator.items);
  // each item is a channel, on which you can set event Listeners and do other stuff related to the channel
});

别忘了在项目的前端和后端都包含Twilio sdk。 我希望这对以后的人有所帮助。