在页面卸载 strophe.js 发送请求两次!为啥?

Posted

技术标签:

【中文标题】在页面卸载 strophe.js 发送请求两次!为啥?【英文标题】:On page unload strophe.js sends request twice! why?在页面卸载 strophe.js 发送请求两次!为什么? 【发布时间】:2014-01-24 16:08:48 【问题描述】:

我是 Xmpp 服务器和 strophe.js 的新手,我将它实现到我的网站中以进行消息传递。发送消息时出现问题,它工作正常,但是在发送消息后,如果我立即重新加载页面,然后我看到该消息,我在重新加载之前发送的消息保存在 Xmpp 服务器中两次,当我从服务器检索消息时显然它返回重复的消息。好尴尬。

谁能告诉我在页面加载时停止两次请求的任何解决方案?

我看到一个帖子,其中一位开发人员告诉他面临同样的问题并联系 strophe 团队,他们建议他用此代码替换 strophe.js 文件的第 2566 行 if (req.sends == 0) sendFunc();

我已经完成了,但我的问题仍然存在。 :(

谢谢,

比斯瓦吉特戈什

【问题讨论】:

为什么要立即重新加载页面?您的“发送消息”功能是什么样的? var message = $msg( unitno: unit__no, conversationdept:dept, conversationID:conversationID, to: frd_uName, from: usrName, type: 'groupchat', id: 'forward_message' ).c('body').t('notification'); conn.send(message.tree()); 以上是我们实现发送消息的代码,在我们的系统中,我们正在开发一个用户可以从不同的用户获取多条消息,也可以从同一页面向多个用户发送消息。我们正在显示消息从活动到关闭的状态变化,这就是用户刷新页面以查看所有消息状态的原因。 你在使用 muc 插件吗? frd_uName 是房间 jid 还是人? “关闭”消息的意义是什么?消息传递应用程序有什么用? 此消息应用程序用于一次与多个客户聊天。所以他/她需要重新加载页面才能知道是否有任何新消息。当他/她为客户 A 写消息并立即重新加载页面时,客户 A 收到了两次消息。我们的客户不会接受这个。那么你有什么解决方案来解决这个问题吗? 我在我的网络聊天窗口上收到聊天时遇到了同样的问题,它来了两次,但是我刷新页面,然后我来自 DB,它显示为单一的。所以当然是 JS 文件的问题。我在此处为多个聊天提供单独的 iframe。 【参考方案1】:

您需要为每个聊天创建多个 div/窗口。 Strophe 是异步的,所以你不必重新加载。重新加载会破坏 strophe 的目的。附加/连接后,将处理程序添加到您的连接。

connection.addHandler(onMsg, null, 'message');

在您的消息处理程序中,您可以确定该消息属于哪个会话并将其附加到适当的 div。

var onMsg = function (msg) 
 var elems = msg.getElementsByTagName('body');
  if (elems.length > 0) 
   var type = msg.getAttribute('type');
   var from = msg.getAttribute('from');
   if (type == "chat") 
    //new chat message
   
  
 return true;

【讨论】:

嗨,马克!抱歉回复晚了,我应用了您的代码,这对我和我的项目非常有帮助,但仍然存在问题。我正在使用 XMPP 服务器的归档插件,因此,如果我(strophe)发送两次,它(XMPP 归档插件)将保存消息两次。 为什么要发送两次? 只是为了澄清当前的要求,有必要重新加载页面。问题是在发送消息之后,如果页面被刷新,它会被发送两次。在这篇 SO 帖子中也提到了同样的问题 ***.com/questions/7752475/… 但在关注了这篇文章的答案之后,它并没有解决我们的问题。所以我们的主要问题是为什么 Strophe 在发送消息后立即在页面卸载时发送消息两次,并且最近有任何修复吗?

以上是关于在页面卸载 strophe.js 发送请求两次!为啥?的主要内容,如果未能解决你的问题,请参考以下文章

在页面加载 Strophe js 上检索消息

Strophe.js Jabber 搜索 (XEP-0055)

< 在使用 strophe.js 时变为 <

使用 strophe js 在聊天中发送图像

axios发送两次请求原因及解决方法

AngularJs + Strophe.js 接收消息