提示:ClientClosedError: The client is closed ,检查了服务器和代码正常;求解决 ?

新手上路,请多包涵

核心提示:ClientClosedError: The client is closed

已经解决: "redis": "^4.7.0", —— 4的版本和3引入 redis不一样了。将require('redis') 改成require('ioredis'),解决了。

<-- GET /square
/Users/ann/Documents/Nodejs/wbproject/kwc/node_modules/@redis/client/dist/lib/client/index.js:520

    return Promise.reject(new errors_1.ClientClosedError());
                          ^

ClientClosedError: The client is closed

at Commander._RedisClient_sendCommand (/Users/ann/Documents/Nodejs/wbproject/kwc/node_modules/@redis/client/dist/lib/client/index.js:520:31)
at Commander.commandsExecutor (/Users/ann/Documents/Nodejs/wbproject/kwc/node_modules/@redis/client/dist/lib/client/index.js:190:154)
at BaseClass.<computed> [as get] (/Users/ann/Documents/Nodejs/wbproject/kwc/node_modules/@redis/client/dist/lib/commander.js:8:29)

** at /Users/ann/Documents/Nodejs/wbproject/kwc/src/cache/_redis.js:37:21

at new Promise (<anonymous>)

at get **(/Users/ann/Documents/Nodejs/wbproject/kwc/src/cache/_redis.js:36:21)

检查了代码;没问题。代码如下:
const redisClient = redis.createClient(REDIS_CONF.port, REDIS_CONF.host)
redisClient.on('error', err => {

console.error('Redis error: ',err)

})

package文件也有
redis ,
"dependencies": {

"ajv": "^8.17.1",
"debug": "^4.1.1",
"ejs": "~2.3.3",
"formidable-upload-koa": "^1.0.1",
"fs-extra": "^11.3.0",
"koa": "^2.7.0",
"koa-bodyparser": "^4.2.1",
"koa-convert": "^1.2.0",
"koa-generic-session": "^2.3.1",
"koa-json": "^2.0.2",
"koa-logger": "^3.2.0",
"koa-onerror": "^4.1.0",
"koa-redis": "^4.0.1",
"koa-router": "^7.4.0",
"koa-static": "^5.0.0",
"koa-views": "^6.2.0",
"mysql2": "^3.12.0",
"redis": "^4.7.0",
"sequelize": "^6.37.5",
"xss": "^1.0.15"

},
redis,keys 也有数据:
127.0.0.1:6379> keys *
1) "wbs.sessbuwR0EyEe3M6sx5jbJwxFXPQLDXktheJ"
2) "wbs.sess60hQWxlju3KofqzhmN_4ADd2C7LLLNoA"
3) "wbs.sess9hwiMnbO_fdNBoiHeHNcBJhm-8pmB810"
4) "wbs.sessO4z7ac5u9W4gYa_fg2ndzvPI-_ZgHq3D"
5) "wbs.sessu2LXMu1O8GVfR2dmaFgoXwsn7ewlt6wi"
6) "wbs.sessTzXu2b7gaTtXaRSrlT13SHhNXxHH-3L-"
7) "wbs.sess4G3UfaTpgvv-YCavfMkvhIoLMa3RKlE5"
8) "wbs.sessdgRBwy7Lb6QU0zjki3FY7Vk6-yB1-_h2"
9) "wbs.sesss5trw7ZxSn4WEDTfMSl7zg143QMWXvyR"
10) "wbs.sess9lU9c9mRKlwl3aBvcPscDS0ebMNqqj9c"
11) "wbs.sessHjm7CRpL4EwikPYVEnyIZSZgjAm79Tnc"
12) "wbs.sess9NfGiwbyI7dUsA29br0q0bGN95s_nDDx"
13) "wbs.sessc9KyWYo9cQazo2G6UR7-E-Y3fecxzbqt"
14) "wbs.sess4p_QWkY2tIfURR-dXQVkXwAnB4a81IA-"
15) "wbs.sessKnfVjT9I6ekCEAVUxfNzOSVSWQNQeK4G"
127.0.0.1:6379>

阅读 698
avatarAI BotBETA
### 解决方案

**问题原因**:
`ClientClosedError: The client is closed` 错误通常表明在尝试使用 Redis 客户端发送命令时,该客户端已经被关闭或未正确连接。尽管你的代码中已经设置了错误监听,但可能在某个地方(如请求处理过程中)客户端被意外关闭或未正确初始化。

**可能的原因**:
1. **客户端被显式关闭**:在代码的某个部分,可能调用了 `redisClient.quit()` 或 `redisClient.disconnect()`。
2. **连接未成功建立**:由于网络问题、Redis 服务器配置错误或端口/主机配置错误,连接可能未能成功建立。
3. **异步编程错误**:在异步操作中,可能在连接建立之前就尝试使用客户端。

**解决方案**:
1. **确保连接成功**:
   - 在使用客户端之前,确保连接已成功建立。可以使用 `redisClient.connect().then(() => { /* 使用客户端的代码 */ })` 来确保连接已建立。
   - 检查 `REDIS_CONF.port` 和 `REDIS_CONF.host` 是否正确,确保它们指向正确的 Redis 服务器和端口。

2. **错误处理和重试机制**:
   - 在尝试执行 Redis 命令时,添加错误处理逻辑来捕获 `ClientClosedError` 并重新尝试连接。
   - 可以使用库如 `async-retry` 来实现简单的重试逻辑。

3. **检查代码中的关闭逻辑**:
   - 审查代码,确保没有在请求处理过程中意外关闭 Redis 客户端。
   - 如果使用了中间件或框架,确保没有在这些地方关闭客户端。

4. **日志记录**:
   - 增加更多的日志记录,特别是在创建和关闭客户端的地方,这有助于诊断问题。

5. **更新依赖**:
   - 确保所有相关的依赖(包括 `redis` 客户端库)都是最新的,有时候错误是由库的旧版本中的已知问题引起的。

通过上述步骤,你应该能够定位并解决 `ClientClosedError: The client is closed` 的问题。如果问题仍然存在,可能需要更详细地检查代码的执行流程和 Redis 服务器的状态。
1 个回答

我把你的代码修改了一下

const Redis = require('ioredis');
const redisClient = new Redis({
    port: REDIS_CONF.port,
    host: REDIS_CONF.host
});

redisClient.on('error', err => {
    console.error('Redis error: ', err);
});

// 你的代码
(async () => {
    try {
        await redisClient.set('key', 'value');
        const value = await redisClient.get('key');
        console.log('Value:', value);
    } catch (err) {
        console.error('Redis operation error:', err);
    }
})();
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏