Strophe 不使用 javascript 调用 iq addHandler
Strophe does not invoke iq addHandler using javascript
我正在开发使用 Strophejs 与 XMPP openfire 连接的应用程序。问题是 presence 发送正确但 iq 处理程序从未被调用。我在浏览器中检查了控制台,但没有发现错误。
我想发送 presence 和 iq,这将使客户端登录到 openfire 的客户端会话(10 秒内自动关闭会话问题)。
这是我的 js:
function onConnect(status) {
debugger;
if (status == Strophe.Status.CONNECTING) {
alert('Strophe is connecting.');
log('Strophe is connecting.');
} else if (status === Strophe.Status.AUTHENTICATING) {
alert ('status AUTHENTICATING');
} else if (status === Strophe.Status.AUTHFAIL) {
alert ('status AUTHFAIL');
} else if (status === Strophe.Status.ATTACHED) {
alert ('status ATTACHED');
} else if (status == Strophe.Status.CONNFAIL) {
alert('Strophe failed to connect.');
log('Strophe failed to connect.');
} else if (status == Strophe.Status.DISCONNECTING) {
alert('Strophe is disconnecting.');
log('Strophe is disconnecting.');
} else if (status == Strophe.Status.DISCONNECTED) {
alert('Strophe is disconnected.');
log('Strophe is disconnected.');
reConnectTimer = setInterval(reConnect, 3000);
} else if (status == Strophe.Status.CONNECTED) {
connection.addHandler(onOwnMessage, null, 'iq', 'set', null, null);
connection.addHandler(onMessage, null, 'message', null, null, null);
connection.addHandler(on_presence, null, 'presence', null, null, null);
connection.send($pres().tree());
var pres = $pres({ to: 'myroom@support.myroom/' + Math.random() });
connection.send(pres);
alert('Strophe is connected.');
log('Strophe is connected.');
clearInterval(reConnect);
//connection.disconnect();
}
}
function onOwnMessage(msg) {
debugger;
// console.log(msg);
alert('msg is: ' + msg);
var elems = msg.getElementsByTagName('own-message');
if (elems.length > 0) {
var own = elems[0];
var to = $(msg).attr('to');
var from = $(msg).attr('from');
var iq = $iq({
to: from,
type: 'error',
id: $(msg).attr('id')
}).cnode(own).up().c('error', { type: 'cancel', code: '501' })
.c('feature-not-implemented', { xmlns: 'urn:ietf:params:xml:ns:xmpp-stanzas' });
connection.sendIQ(iq);
alert(iq);
}
return true;
}
请告诉我我做错了什么?我试过并用谷歌搜索过,但我仍然无法解决。
提前致谢。
您的代码来自https://gist.github.com/RudyLu/5641350,这是使用Strophe.js连接到facebook聊天的示例代码。
我想您会基于自己的 XMPP 服务器创建一个简单的聊天(例如,使用 post 中的标签所述的 Openfire)。
在这种情况下,您不需要 IQ 处理程序:
connection.addHandler(onOwnMessage, null, 'iq', 'set', null, null)
onMessage 和 on_presence 处理程序就足够了,可以像下面的代码:
function onMessage(msg) {
var to = msg.getAttribute('to');
var from = msg.getAttribute('from');
var type = msg.getAttribute('type');
var elems = msg.getElementsByTagName('body');
if (type == "chat" && elems.length > 0) {
var body = elems[0];
console.log('CHAT: I got a message from ' + from + ': ' + Strophe.getText(body));
}
// we must return true to keep the handler alive.
// returning false would remove it after it finishes.
return true;
}
function on_presence (presence){
console.log('onPresence:');
var presence_type = $(presence).attr('type'); // unavailable, subscribed, etc...
var from = $(presence).attr('from'); // the jabber_id of the contact
console.log(' >'+from+' --> '+presence_type);
if (presence_type != 'error'){
if (presence_type === 'unavailable'){
// Mark contact as offline
}else{
var show = $(presence).find("show").text(); // this is what gives away, dnd, etc.
if (show === 'chat' || show === ''){
// Mark contact as online
}else{
// etc...
}
}
}
return true;
}
以下是发送消息和更改在线状态的函数示例:
function sendMessage(msg, to) {
console.log('CHAT: Send a message to ' + to + ': ' + msg);
var m = $msg({to: to, from: connection.jid, type: 'chat'}).c("body").t(msg);
connection.send(m);
}
function setStatus(s) {
console.log('setStatus: '+s);
var status = $pres().c('show').t(s);
connection.send(status);
}
我正在开发使用 Strophejs 与 XMPP openfire 连接的应用程序。问题是 presence 发送正确但 iq 处理程序从未被调用。我在浏览器中检查了控制台,但没有发现错误。
我想发送 presence 和 iq,这将使客户端登录到 openfire 的客户端会话(10 秒内自动关闭会话问题)。
这是我的 js:
function onConnect(status) {
debugger;
if (status == Strophe.Status.CONNECTING) {
alert('Strophe is connecting.');
log('Strophe is connecting.');
} else if (status === Strophe.Status.AUTHENTICATING) {
alert ('status AUTHENTICATING');
} else if (status === Strophe.Status.AUTHFAIL) {
alert ('status AUTHFAIL');
} else if (status === Strophe.Status.ATTACHED) {
alert ('status ATTACHED');
} else if (status == Strophe.Status.CONNFAIL) {
alert('Strophe failed to connect.');
log('Strophe failed to connect.');
} else if (status == Strophe.Status.DISCONNECTING) {
alert('Strophe is disconnecting.');
log('Strophe is disconnecting.');
} else if (status == Strophe.Status.DISCONNECTED) {
alert('Strophe is disconnected.');
log('Strophe is disconnected.');
reConnectTimer = setInterval(reConnect, 3000);
} else if (status == Strophe.Status.CONNECTED) {
connection.addHandler(onOwnMessage, null, 'iq', 'set', null, null);
connection.addHandler(onMessage, null, 'message', null, null, null);
connection.addHandler(on_presence, null, 'presence', null, null, null);
connection.send($pres().tree());
var pres = $pres({ to: 'myroom@support.myroom/' + Math.random() });
connection.send(pres);
alert('Strophe is connected.');
log('Strophe is connected.');
clearInterval(reConnect);
//connection.disconnect();
}
}
function onOwnMessage(msg) {
debugger;
// console.log(msg);
alert('msg is: ' + msg);
var elems = msg.getElementsByTagName('own-message');
if (elems.length > 0) {
var own = elems[0];
var to = $(msg).attr('to');
var from = $(msg).attr('from');
var iq = $iq({
to: from,
type: 'error',
id: $(msg).attr('id')
}).cnode(own).up().c('error', { type: 'cancel', code: '501' })
.c('feature-not-implemented', { xmlns: 'urn:ietf:params:xml:ns:xmpp-stanzas' });
connection.sendIQ(iq);
alert(iq);
}
return true;
}
请告诉我我做错了什么?我试过并用谷歌搜索过,但我仍然无法解决。
提前致谢。
您的代码来自https://gist.github.com/RudyLu/5641350,这是使用Strophe.js连接到facebook聊天的示例代码。 我想您会基于自己的 XMPP 服务器创建一个简单的聊天(例如,使用 post 中的标签所述的 Openfire)。 在这种情况下,您不需要 IQ 处理程序:
connection.addHandler(onOwnMessage, null, 'iq', 'set', null, null)
onMessage 和 on_presence 处理程序就足够了,可以像下面的代码:
function onMessage(msg) {
var to = msg.getAttribute('to');
var from = msg.getAttribute('from');
var type = msg.getAttribute('type');
var elems = msg.getElementsByTagName('body');
if (type == "chat" && elems.length > 0) {
var body = elems[0];
console.log('CHAT: I got a message from ' + from + ': ' + Strophe.getText(body));
}
// we must return true to keep the handler alive.
// returning false would remove it after it finishes.
return true;
}
function on_presence (presence){
console.log('onPresence:');
var presence_type = $(presence).attr('type'); // unavailable, subscribed, etc...
var from = $(presence).attr('from'); // the jabber_id of the contact
console.log(' >'+from+' --> '+presence_type);
if (presence_type != 'error'){
if (presence_type === 'unavailable'){
// Mark contact as offline
}else{
var show = $(presence).find("show").text(); // this is what gives away, dnd, etc.
if (show === 'chat' || show === ''){
// Mark contact as online
}else{
// etc...
}
}
}
return true;
}
以下是发送消息和更改在线状态的函数示例:
function sendMessage(msg, to) {
console.log('CHAT: Send a message to ' + to + ': ' + msg);
var m = $msg({to: to, from: connection.jid, type: 'chat'}).c("body").t(msg);
connection.send(m);
}
function setStatus(s) {
console.log('setStatus: '+s);
var status = $pres().c('show').t(s);
connection.send(status);
}