【问题标题】:redis hash command hang while async callback is present Node.js存在异步回调时,redis 哈希命令挂起 Node.js
【发布时间】:2013-05-18 01:36:57
【问题描述】:

我的目标是进行集成测试,以测试将值保存在 redis 中的节点模块。这是测试:

require('coffee-script');
var should = require('should')
    , redis = require('redis')
    , async = require('async')
    , Domain = require('../index');

async.series([
    function(callback){
        db = redis.createClient();
        callback(null,'zero');
    },
    function(callback){
        db.flushdb( function (err, didSucceed) {
            if(err){
                console.log('error: ' + err.message);
                callback(err, 'one');
            }
        });
        callback(null, 'one');
    },
    function(callback){
        should.exist(Domain);

        domain = new Domain({'attOne':1, 'attTwo':2, 'id':1});

        domain.should.have.property('save');
        domain.should.have.property('attOne');
        domain.should.have.property('attTwo');

        domain.save.should.be.an.instanceof(Function);
        callback(null, 'two');
    },
    function(){
        db.end();
    }
],
    function(err, results){
        if(err){
           console.log('error encountered: ' + err.message);
           db.end();
        }
        console.log('All tests passed');
    }
);

通过这个测试,问题是 redis 连接在 redis 刷新数据库之前关闭(如果我完全删除 db.end(),测试挂起但 redis db 被刷新)。显然,async.series 没有像我预期的那样工作,每个函数都在下一个函数之前运行,或者我误解了?如何确保此测试以串行流执行,以便在刷新之前不会关闭 redis 连接? ...任何库/框架的任何建议可以帮助我在这里尝试完成什么?谢谢你

【问题讨论】:

    标签: node.js mocha.js node-redis


    【解决方案1】:

    好吧,问题在于 redis 哈希命令(即 flushdb、hgetall )中的回调并没有阻止特定的异步进程使其挂起。我不确定'async'模块是否没有正确停止,或者'redis'模块有不同的东西阻止'async'关闭该进程......如果你知道答案,请分享。

    解决方案是“mocha”测试框架。安装(即 npm install mocha)然后运行“mocha test/mytest.js”后,它将退出而不对上述代码进行任何更改......甚至没有根据 Mocha 框架进行格式化,它运行测试并很好地退出。同时,如果使用 'node test/mytest.js' 运行,它会挂起......为什么仍然存在的谜团:)

    我希望这会有所帮助...现在是 Mocha 的时候了:)

    【讨论】:

      【解决方案2】:

      要结束连接并停止挂起,请在适当的位置使用client.quit()client.end()

      例如,把这个放在代码的末尾:

      //...
      setTimeout(function(){ client.quit(); }, 3000);
      // 3000 means wait 3 seconds and quit the redis connection
      

      client.unref() 是另一个实验性功能可以完成这项工作。

      参考:doc

      【讨论】:

        猜你喜欢
        • 2014-09-08
        • 2015-12-01
        • 2015-04-28
        • 1970-01-01
        • 2017-03-20
        • 2013-03-22
        • 1970-01-01
        • 2012-12-13
        • 2015-11-23
        相关资源
        最近更新 更多