skip to Main Content

I am developing an application where chats has to cached and monitored, currently it is an local application where i have installed redis and redis-cli.
The problem i’m facing is (node:5368) UnhandledPromiseRejectionWarning: Error: The client is closed
Attaching code snippet below

//redis setup
const redis = require('redis');
const client = redis.createClient()//kept blank so that default options are available
  

//runs when client connects
io.on("connect", function (socket) {

  //this is client side socket
  //console.log("a new user connected...");

  socket.on("join", function ({ name, room }, callback) {
    //console.log(name, room);
    const { msg, user } = addUser({ id: socket.id, name, room });
   // console.log(user);
    if (msg) return callback(msg); //accessible in frontend

    //emit to all users
    socket.emit("message", {
      user: "Admin",
      text: `Welcome to the room ${user.name}`,
    });
    //emit to all users except current one
  
    socket.broadcast
      .to(user.room)
      .emit("message", { user: "Admin", text: `${user.name} has joined` });

    socket.join(user.room); //pass the room that user wants to join

    //get all users in the room
    io.to(user.room).emit("roomData", {
      room: user.room,
      users: getUsersInRoom(user.room),
    });

    callback();
  }); //end of join

  //user generated messages
  socket.on("sendMessage",  async(message, callback)=>{
    const user = getUser(socket.id);

    //this is where we can store the messages in redis
    await client.set("messages",message);

    io.to(user.room).emit("message", { user: user.name, text: message });
    console.log(client.get('messages'));
    callback();
  }); //end of sendMessage

  //when user disconnects
  socket.on("disconnect", function () {
    const user = removeUser(socket.id);
    if (user) {
     
      console.log(client)

      io.to(user.room).emit("message", {
        user: "Admin",
        text: `${user.name} has left `,
      });
    }
  }); //end of disconnect

I am getting above error when user sends a message to the room or when socket.on("sendMessage") is called.

Where am I going wrong?

Thank you in advance.

8

Answers


  1. You should await client.connect() before using the client

    Login or Signup to reply.
  2. In node-redis V4, the client does not automatically connect to the server, you need to run .connect() before any command, or you will receive error ClientClosedError: The client is closed.

    import { createClient } from 'redis';
    
    const client = createClient();
    
    await client.connect();
    

    Or you can use legacy mode to preserve the backwards compatibility

    const client = createClient({
        legacyMode: true
    });
    
    Login or Signup to reply.
  3. client.connect() returns a promise. You gotta use .then() because you cannot call await outside of a function.

    const client = createClient();  
    client.connect().then(() => {
      ...
    })
    
    Login or Signup to reply.
  4. You cannot call await outside of a function.

    const redis = require('redis');
    const client = redis.createClient();
    
    client
      .connect()
      .then(async (res) => {
        console.log('connected');
        // Write your own code here
    
        // Example
        const value = await client.lRange('data', 0, -1);
        console.log(value.length);
        console.log(value);
        client.quit();
      })
      .catch((err) => {
        console.log('err happened' + err);
      });
    
    Login or Signup to reply.
  5. I was having a similar problem and was able to change the connect code as follows.

    const client = redis.createClient({
      legacyMode: true,
      PORT: 5001
    })
    client.connect().catch(console.error)
    
    Login or Signup to reply.
  6. use "redis": "3.1.2", version.

    Login or Signup to reply.
  7. Tried several options. None worked.

    Followed what mesutpiskin said in using redis 3.1.2

    And that worked for me.

    There is a complex what it connects for redis 4.x.x

    You can try it from the snippet in the documentation redis

    Login or Signup to reply.
  8. you cannot call await outside of a function. This is what i did that worked me.

    const redis = require('redis');
    
    const redisClient = redis.createClient()
    
    redisClient.on('connect', () => {
        console.log('Connected to Redis12345');
    })
    
    redisClient.on('error', (err) => {
        console.log(err.message);
    })
    
    redisClient.on('ready', () => {
        console.log('Redis is ready');
    })
    
    redisClient.on('end', () => {
        console.log('Redis connection ended');
    })
    
    process.on('SIGINT', () => {
        redisClient.quit();
    })
    
    redisClient.connect().then(() => {
        console.log('Connected to Redis');
    }).catch((err) => {
        console.log(err.message);
    })
    

    In app.js

    //just for testing
    
    const redisClient = require('./init_redis')
    
    redisClient.SET('elon', 'musk', redisClient.print)
    

    My data in redis

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search