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

时间:2011-11-27 10:53:24

标签: javascript strophe

示例代码:

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 个答案:

答案 0 :(得分:7)

是的,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是您的自定义连接错误处理程序。

答案 1 :(得分: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));

答案 2 :(得分:0)

我已经和Strophe玩了一段时间了,我不得不修改它的默认错误处理程序来满足我们的需求

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

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

答案 3 :(得分:0)

我有一个类似的问题,我使用上面的tsds给出的方法修复。然而,最小的修改。我创建了两个连接方法,一个是连接,另一个是 connect_bak 我放置了脚本

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

在我的connectHandler函数以及connect函数中。这样功能总是在连接上绑定。