请考虑以下情形...
我的问题是以下...在步骤2和3之间,当成员尝试重新连接到同一频道时,出现错误“成员已存在”。为了解决该问题,我尝试了以下步骤:
2.1调用channel.leave()
2.2 channel.leave()成功返回
2.3成员尝试重新连接到同一聊天频道
成功重新连接后,当成员尝试发送消息时,它会出现两次。不是可行的解决方案。除了尝试使用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()
这不是一个非常友好的修复程序,因为甚至没有将其记录为离开房间的必要步骤。最可能的原因确实是某处内存泄漏。希望此错误能尽快解决...
答案 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。 我希望这对以后的人有所帮助。