Не удалось поймать ошибку ECONNRESET, и это приводит к сбою приложения

#javascript #node.js #socket.io #socket.io-redis

Вопрос:

Мне нужна помощь с адаптером socket.io-redis, так как их документ об обработке ошибок клиента, похоже, исчез.

  1. Я не знаю, как возникает эта ошибка с Redis, имеет ли она отношение к Redis pub/sub? Мой сервер redis работает с ошибкой до конца.
  2. Я просмотрел форумы и github. Я выполнил рекомендуемые действия следующим образом. Однако я все еще не могу уловить приведенные ниже ошибки, и это приводит к сбою моего приложения. Мои серверы redis все в порядке и в то время не отключены, так как у меня есть другие службы, использующие тот же сервер.

Кто-нибудь может дать мне несколько указаний?

«@socket.io/redis-adapter»: «^7.0.0»,

«@socket.io/redis-emitter»: «^4.1.0»,

Обнаружение ошибки как для суб -, так и для пабного клиента-Готово ✅

 // I'm using ioredis and I believe ioredis will auto handle reconnection?
pubClient.on("error", (err) => {
    debug(`REDIS ADAPTOR DISCONNECTED ON pubClient %O`, err)
})
subClient.on("error", (err) => {
    debug(`REDIS ADAPTOR DISCONNECTED ON subClient %O`, err)
})
 

Ошибка перехвата на адаптере — Готово ✅

 // But i think this is not working to catch errors ❌❌❌
io.of('/').adapter.on('error', function(error){

    debug('error: ', error);
    
});
 

Пинг, чтобы поддерживать связь — Готово ✅

 setInterval(() => {
    // emitter.of('/user').emit("time", new Date);
    io.of('/user').emit("time", new Date())
  }, 300000);
 

Я также пробовал использовать как node-redis, так и ioredis, и оба они заканчиваются одной и той же ошибкой ниже. ✅

  Manage to catch this with redis on error event ✅
 socket REDIS ADAPTOR DISCONNECTED ON pubClient Error: read ECONNRESET
  socket     at TCP.onStreamRead (internal/stream_base_commons.js:209:20) {
  socket   errno: -54,
  socket   code: 'ECONNRESET',
  socket   syscall: 'read'
  socket }  5h
  socket error:  Error: read ECONNRESET
    at TCP.onStreamRead (internal/stream_base_commons.js:209:20) {
  errno: -54,
  code: 'ECONNRESET',
  syscall: 'read'
}  0ms

// Unable to catch this event ❌❌❌
// I think this causes my app to crash

events.js:292
      throw er; // Unhandled 'error' event
      ^

Error: read ECONNRESET
    at TCP.onStreamRead (internal/stream_base_commons.js:209:20)
Emitted 'error' event on RedisAdapter instance at:
    at Redis.onError (/Users/Myname/Work/expressjs/api.singa.sg/node_modules/@socket.io/redis-adapter/dist/index.js:61:22)
    at Redis.emit (events.js:327:22)
    at Redis.EventEmitter.emit (domain.js:486:12)
    at Redis.silentEmit (/Users/Myname/Work/expressjs/api.singa.sg/node_modules/ioredis/built/redis/index.js:544:26)
    at Socket.<anonymous> (/Users/Myname/Work/expressjs/api.singa.sg/node_modules/ioredis/built/redis/event_handler.js:190:14)
    at Object.onceWrapper (events.js:422:26)
    at Socket.emit (events.js:327:22)
    at Socket.EventEmitter.emit (domain.js:486:12)
    at emitErrorNT (internal/streams/destroy.js:106:8)
    at emitErrorCloseNT (internal/streams/destroy.js:74:3)
    at processTicksAndRejections (internal/process/task_queues.js:80:21) {
  errno: -54,
  code: 'ECONNRESET',
  syscall: 'read'
}
 

This is snippet of how my server is created;

 ....server declaration codes
const { createAdapter } = require("@socket.io/redis-adapter");
const Redis = require("ioredis");
const pubClient = new Redis({
    host: process.env.SOCKET_IO_REDIS_HOST,
    port: process.env.SOCKET_IO_REDIS_PORT,
    username: process.env.SOCKET_IO_REDIS_USER,
    password: process.env.SOCKET_IO_REDIS_PASSWORD,
    db: process.env.SOCKET_IO_REDIS_DB,
})
const subClient = pubClient.duplicate();

const adapter = createAdapter(pubClient, subClient)
io.adapter(adapter)

pubClient.on("ready", () => {
    debug(`REDIS ADAPTOR CONNECTED`)
})

pubClient.on("error", (err) => {
    debug(`REDIS ADAPTOR DISCONNECTED ON pubClient %O`, err)
})
subClient.on("error", (err) => {
    debug(`REDIS ADAPTOR DISCONNECTED ON subClient %O`, err)
})
pubClient.on("end", (err) => {
    debug(`REDIS ADAPTOR ENDED %O`, err)
})

setInterval(() => {
    // emitter.of('/user').emit("time", new Date);
    io.of('/user').emit("time", new Date())
  }, 300000);



io.of('/').adapter.on('error', function(error){
    debug('error: ', error);
});