Javascript 在node.js中捕获异常

Javascript 在node.js中捕获异常,javascript,exception,node.js,Javascript,Exception,Node.js,我有一个简单的程序,需要确保我可以连接到Redis服务器。我使用节点redis进行连接,需要等待redis启动。我使用这段代码: function initializeRedis(callback) { (function createClient(){ var runner; try { client = redis.createClient(); } catch (e) { setTime

我有一个简单的程序,需要确保我可以连接到Redis服务器。我使用节点redis进行连接,需要等待redis启动。我使用这段代码:

function initializeRedis(callback) {
    (function createClient(){
        var runner;
        try {
            client = redis.createClient();
        } catch (e) {
            setTimeout(createClient, 1000);
        }
        callback();
    })();
};

initializeRedis(function() {
// Work here
});
这是因为没有try/catch,我从node.js得到了一个异常:

 node.js:134
         throw e; // process.nextTick error, or 'error' event on first tick
         ^ Error: Redis connection to 127.0.0.1:6379 failed - ECONNREFUSED, Connection refused
     at Socket.<anonymous> (/var/www/php-jobs/node_modules/redis/index.js:88:28)
     at Socket.emit (events.js:64:17)
     at Array.<anonymous> (net.js:830:27)
     at EventEmitter._tickCallback (node.js:126:26)
node.js:134
抛出e;//process.nextTick错误,或第一次勾选时的“error”事件
^错误:到127.0.0.1:6379的Redis连接失败-ECONREFUSSED,连接被拒绝
在插座上。(/var/www/php jobs/node_modules/redis/index.js:88:28)
位于Socket.emit(events.js:64:17)
在阵列上。(net.js:830:27)
在EventEmitter上进行回调(node.js:126:26)

当我启动redis服务器(Ubuntu机器)并启动这个脚本时,一切正常。如果我停止redis服务器并启动脚本,它不会捕获异常并仍然抛出相同的异常。这怎么可能?我有一个try/catch语句

client=redis.createClient()之后
,为
错误
事件设置处理程序:

client.on('error', function(err) {
  // handle async errors here
});

查看堆栈跟踪-您的代码不在堆栈跟踪中,因此try/catch无法捕获错误。

如果错误是异步的,我如何才能等到有了有效的连接?我的启动周期中的问题是,这个节点脚本是用upstart启动的,而redis是用init.d启动的。显然,节点启动得更早,我必须等到redis也准备好了。这就是我在这里尝试的setTimeout()和回调。@JurianSluiman:你不需要等待它,你需要倾听它。不要用setTimeout来做这类事情,它会让小猫死去!显然,setTimeout()无法与此客户端一起使用。在('error')处理程序上,但问题是我需要等待才能继续,因为我依赖于客户端。回调()现在被触发,因为没有引发异常,在此之后,我可能会触发此错误。对错误进行非同步处理很糟糕,因为如果你依赖于结果,你就真的无能为力了?@JurianSluiman:嗯,什么?我不明白你想说什么;DR:我不能只是异步地“等待”错误,因为我同步地依赖于客户端。因此,回调句柄不是解决方案。请参见我关于等待部分的问题: