You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js+Express集成Redis时出现The client is closed错误排查

问题:Node.js集成Redis时出现"The client is closed"错误

我在Node.js+Express搭建的REST API中集成Redis时遇到错误:The client is closed。已确认Redis服务正常运行:

  • Windows系统安装Redis
  • 命令行启动redis-server
  • 通过redis-cli执行ping命令返回PONG

相关代码

init_redis.js

const redis = require('redis');

const createConnectedClient = async () => {
    const client = redis.createClient({
        host: 'localhost',
        port:  6379,
    });

    client.on('error', (err) => {
        console.log('Redis client error', err);
    });

    await client.connect();

    return client;
};

module.exports = createConnectedClient;

server.js

const createConnectedClient = require('./middleware/init_redis');

let redisClient;

(async () => {
    try {
        redisClient = await createConnectedClient();
        redisClient.on('error', (err) => {
            console.log('Redis client error', err);
        });
    } catch (error) {
        console.error('Failed to connect to Redis:', error);
    }
})();

(async () => {
    if (redisClient) {
        try {
            await redisClient.set('foo', 'bar');
            const value = await redisClient.get('foo');
            console.log(value);
        } catch (err) {
            console.error('Error setting or getting key from Redis:', err);
        }
    }
})();

启动Node.js服务器时触发The client is closed错误,且异步函数执行后控制台无输出,请问原因是什么?


原因分析

核心问题是两个独立的立即执行异步函数存在竞态条件:第二个异步函数会在Redis客户端完成连接并赋值给redisClient之前就开始执行。此时要么redisClient还是undefined(导致if判断不执行,无控制台输出),要么客户端连接未完成就被调用,最终触发The client is closed错误。

解决方案

将Redis连接和读写操作合并到同一个异步流程中,确保客户端连接成功后再执行数据操作:

修改后的server.js:

const createConnectedClient = require('./middleware/init_redis');

(async () => {
    let redisClient;
    try {
        redisClient = await createConnectedClient();
        // 连接成功后执行读写操作
        await redisClient.set('foo', 'bar');
        const value = await redisClient.get('foo');
        console.log(value);
    } catch (error) {
        console.error('Redis相关操作失败:', error);
    }
})();

额外注意事项

  • 若要在Express路由中复用Redis客户端,需确保客户端连接成功后再启动Express服务(比如把app.listen放在连接成功的await之后),避免路由调用时客户端未就绪
  • init_redis.js中已添加错误监听,无需在server.js重复添加,若有额外错误处理逻辑可另行补充

内容的提问来源于stack exchange,提问作者tukitooo1998

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:07:25