Команда redis hash зависает, пока присутствует асинхронный обратный вызов Node.js

Моя цель — провести интеграционный тест, который проверяет модуль узла, который сохраняет значения в файле 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 не закрывалось перед сбросом? ... любые рекомендации любых библиотек/фреймворков, которые могли бы помочь мне в том, что я пытаюсь здесь сделать? Благодарю вас


person latvian    schedule 22.05.2013    source источник


Ответы (2)


ну, проблема в том, что обратный вызов в хеш-командах redis (например, flushdb, hgetall ) не останавливает конкретный асинхронный процесс, из-за чего он зависает. Я не уверен, что модуль «асинхронный» не останавливается должным образом, или модуль «redis» имеет что-то другое, что запрещает «асинхронному» закрывать этот процесс .... если вы знаете ответ, пожалуйста, поделитесь.

Решением стала тестовая структура mocha. После установки (т.е. npm install mocha) и последующего запуска «mocha test/mytest.js» он выйдет без каких-либо изменений в приведенном выше коде... даже не форматируя его в соответствии с Mocha framework, он запускает тест и завершает работу красиво. В то же время он будет зависать при запуске с 'node test/mytest.js'....загадка, почему так, до сих пор остается :)

Я надеюсь, что это поможет... Пришло время для мокко :)

person latvian    schedule 23.05.2013

Чтобы завершить соединение и остановить зависание, используйте client.quit() или client.end() в нужном месте.

Например, поместите это в конце кодов:

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

client.unref() — еще одна экспериментальная функция, которая может выполнять эту работу.

Относится к: документу.

person Andrew_1510    schedule 29.04.2014