为什么使用Strophe.js时没有抛出错误?

6

示例代码:

var connection = null;

function onConnect(status) {
    im_a_big_error.log('wtf');
    // Why it doesn't throw me an error here ??                                                                                                                                                                                                
}

$().ready(function() {
    connection = new Strophe.Connection('http://localhost:8080/http-bind');
    connection.connect('admin@localhost', 'admin', onConnect);
});

在我的Chrome控制台中没有报错。

你有解决这个问题的想法吗?


onConnect 被调用了吗?它应该会抛出 undefined is not a function 或类似的错误。 - alex
这里调用了 connection.connect('admin@localhost', 'admin', onConnect); - Unitech
1
顺便提一下,$().ready(..) 在一个空的 jQuery 集合上注册了 ready 事件。你应该使用 $(document).ready(..) 或它的简写形式 $(..); - .. 是你的回调函数。 - ThiefMaster
谢谢你的回答。无论如何使用 $(document).ready(..) 都不会抛出错误 :( - Unitech
4个回答

8

是的,Strophe通常会自行捕获错误,但目前不提供获取连接错误信息的能力。虽然错误捕获可以正常工作,但无法自行捕获错误并不是很好。但您可以使用以下代码来解决:

$().ready(function() {
    connection = new Strophe.Connection('http://localhost:8080/http-bind');
    connection._hitError = function (reqStatus) {
        this.errors++;
        Strophe.warn("request errored, status: " + reqStatus + ", 
                number of errors: " + this.errors);
        if (this.errors > 4) this._onDisconnectTimeout();
        myErrorHandler(reqStatus, this.errors);
    };
    connection.connect('admin@localhost', 'admin', onConnect);
});

这里的myErrorHandler是你的自定义连接错误处理程序。


2
我认为应该是connection._proto._hitError,因为_hitError是Bosh的一个方法。也许自从你回答这个问题2.5年过去了,情况有所改变。 - Gilad Beeri

4
是的,Strophe会吞噬错误。更糟糕的是,当错误被抛出后,回调函数不会像应该的那样返回true,而且Strophe会移除处理程序。一旦出现错误,回调函数将永远不会再被调用。
我发现当前答案中的代码有些难以使用。在内部,我们为每个回调函数使用以下包装器;
function callback(cb) {
// Callback wrapper with
// (1) proper error reporting (Strophe swallows errors)
// (2) always returns true to keep the handler installed
return function() {
    try {
        cb.apply(this, arguments);
    } catch (e){
        console.log('ERROR: ' + (e.stack ? e.stack : e));
    }

    // Return true to keep calling the callback.
    return true;
};
}

这个包装器在问题代码中的使用方式如下:
connection.connect('admin@localhost', 'admin', callback(onConnect));

非常抱歉;之前的代码存在一个bug,如果回调函数带有多个参数进行调用,则可能会破坏这些参数。如果您使用了旧代码,请进行修正。 - TinkerTank

0

我已经使用Strophe一段时间了,不得不修改其默认的错误处理程序以适应我们的需求

  • Strophe.js - log函数 - 默认情况下不包含任何内容 - 我添加了对我的服务器端日志记录服务的调用,用于level === ERROR和level === FATAL
  • Strophe.js - run函数 - 错误的默认行为是删除处理程序并重新抛出错误 - 由于我已经在服务器端记录了错误,所以我不会重新抛出错误,并决定保留处理程序(即使它失败)。这种行为可能有意义(或不)取决于您自己的实现 - 由于我使用自定义消息并且有一个相当复杂的消息处理例程,所以我不希望客户端因发送的消息未正确格式化而停止,因此我想保留处理程序,无论是否出错。我将运行函数中的throw e行替换为result = true;
  • Strope.js _hitError - 正如我所提到的,我不希望客户端断开连接,因此我重写了默认行为,永远不会断开连接(无论错误计数器多高)

希望这些想法对其他人有所帮助 - 如果您有问题/需要详细信息,请留言。


0

我曾经碰到过一个类似的问题,使用 tsds 提供的方法解决了它,但稍加修改。我创建了两种连接方法,一种是connect,另一种是connect_bak。我将脚本放在了里面。

this.connection._hitError=function (reqStatus) {
client.connect_bak();
};

在我的connectHandler函数以及connect函数中,使函数始终绑定在connect上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接