Node.js:开玩笑+ redis.quit()但打开句柄警告仍然存在

时间:2018-10-23 00:46:58

标签: node.js jestjs node-redis

我正在尝试对Redis和Jest进行集成测试。

在与--detectOpenHandles一起运行时,它总是抛出“ Jest已检测到以下1个打开的句柄,有可能阻止Jest退出:”错误。

它没有挂起,所以套接字正在关闭,但是我怎么写它,以免引发警告?

我的代码

EXCEPTION

警告

import redis from 'redis';
let red: redis.RedisClient;

beforeAll(() => {
    red = redis.createClient();
});

afterAll((done) => {
    red.quit(() => {
        done();
    });
});

test('redis', (done) => {
    red.set('a', 'b', (err, data) => {
        console.log(err);
        red.get('a', (err, data) => {
            console.log(data);
            done();
        });
    });

});

使用常规玩笑运行编译后的代码会发出相同的警告。编译后的代码看起来几乎相同。

3 个答案:

答案 0 :(得分:1)

在发布后找到答案。我忘了在这里发布答案。

它与redis.quit()处理其回调的方式有关。

它将创建一个新线程,因此我们需要等待整个事件循环堆栈再次循环。解决方法请参见下文。

async shutdown() {
    await new Promise((resolve) => {
        redis.quit(() => {
            resolve();
        });
    });
    // redis.quit() creates a thread to close the connection.
    // We wait until all threads have been run once to ensure the connection closes.
    await new Promise(resolve => setImmediate(resolve));
}

答案 1 :(得分:0)

我有同样的问题。我还没有找到解决的办法,但是我有一个解决方法。 您可以添加jest --forceExit。 有关forceExit的信息:https://jestjs.io/docs/en/cli.html#forceexit

答案 2 :(得分:0)

修正了我的行为

const redis = require("redis");
const { promisify } = require("util");

const createRedisHelper = () => {
  const client = redis.createClient(`redis://${process.env.REDIS_URI}`);

  client.on("error", function (error) {
    console.error(error);
  });

  const setAsync = promisify(client.set).bind(client);
  const setCallValidateData = async (key, data) => {
    return setAsync(key, JSON.stringify(data));
  };

  return {
    setCallValidateData,
    cleanCallValidateData: promisify(client.flushdb).bind(client),
    end: promisify(client.end).bind(client),
  };
};

module.exports = createRedisHelper;

版本: Redis 3.0.2 节点12.6.1