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 控制台中引发错误。

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

4

4 回答 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您的自定义连接错误处理程序在哪里。

于 2012-02-24T08:15:30.440 回答
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));
于 2012-11-07T14:09:07.107 回答
0

我玩 Strophe 已经有一段时间了,我不得不修改它的默认错误处理例程以满足我们的需要

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

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

于 2012-10-22T11:29:40.207 回答
0

我有一个类似的问题,我使用上面 tsds 给出的方法解决了这个问题。但是,只需进行最小的修改。我创建了两个连接方法,一个作为connect,另一个作为connect_bak我放置了脚本

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

在我的 connectHandler 函数以及 connect 函数中。这样该函数始终绑定在连接上。

于 2013-12-14T16:37:51.633 回答