skip to Main Content
const express = require("express");
const redis = require("redis");
const app = express();

const client = redis.createClient({
  url: "redis://[email protected]",
});

client.on("connect", function () {
  console.log("redis connected");
  console.log(`connected ${redisClient.connected}`);
});

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

app.listen(process.env.PORT || 3000, () => {
  console.log("Node server started");
});

The above code does not show any connection to redis server even though I have checked the EC2 redis instance by connecting using Redsmin.
hosting details in Redsmin

This is a very simple thing to do but the error that I get cannot be googled.

Node server started C:UsersSithira_105661DesktopProjectsLearningRedisnode_modules@node-redisclientdistlibclientindex.js:387
return Promise.reject(new errors_1.ClientClosedError());
^

ClientClosedError: The client is closed
at Commander._RedisClient_sendCommand (C:UsersSithira_105661DesktopProjectsLearningRedisnode_modules@node-redisclientdistlibclientindex.js:387:31)
at Commander.commandsExecutor (C:UsersSithira_105661DesktopProjectsLearningRedisnode_modules@node-redisclientdistlibclientindex.js:160:154)
at Commander.BaseClass. [as set] (C:UsersSithira_105661DesktopProjectsLearningRedisnode_modules@node-redisclientdistlibcommander.js:8:29)
at Object. (C:UsersSithira_105661DesktopProjectsLearningRedisredis.js:19:8)
at Module._compile (node:internal/modules/cjs/loader:1101:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:17:47

Help me understand the issue. Thanks in advance.

13

Answers


  1. Chosen as BEST ANSWER

    finally found the solution. I used node-redis 3.0.0 rather than 4 and the code works fine. I do not know why it does not work in latest node-redis . If any of you guys are getting this issue use node-redis 3


  2. Please check your ec2 redis connection

        const client = redis.createClient({
           url: "redis://username:password@ec2_endpoint:port",
         });
    

    Connection string format: redis[s]://[[username][:password]@][host][:port]

    Login or Signup to reply.
  3. I used node-redis 3.1.2 rather than 4 and the code works fine.

    Login or Signup to reply.
  4. You are using a very old version of Redis, an abandoned project by Microsoft called OpenTech Redis.

    I suggest you checkout Memurai.
    Memurai is an up-to-date native Windows port of Redis that derives from that project (see this commit).

    Memurai is also available with a free Developer Edition.

    Disclaimer: I work in Memurai.

    Login or Signup to reply.
  5. If you’re using redis ^4.0.0, you can do this:

    const { createClient } = require('redis');
    const { REDIS_HOST_URL } = require('../config');
    
    const client = createClient({ url: REDIS_HOST_URL });
    
    (async () => {
        await client.connect();
    })();
    
    client.on('connect', () => console.log('::> Redis Client Connected'));
    client.on('error', (err) => console.log('<:: Redis Client Error', err));
    

    You can read more on their documentation here.

    Login or Signup to reply.
  6. I don’t thing we should decrease the version from 4 to 3.

    we can use –

    const redis = require('redis');
    
    const client = redis.createClient();
    
       
    (async () => {
        await client.connect();
    })();
    
    client.on('connect', () => console.log('Redis Client Connected'));
    client.on('error', (err) => console.log('Redis Client Connection Error', err));
    
    Login or Signup to reply.
  7. In version 4.0.1, we have to add .connect() to run redis.

    They have migration guide

    This is my code, but it seems to not work well.

    async function connectRedis(){
    
        try {
    
            const redisURL = '<link-redis-provider>';
    
            const client = createClient({
               url: redisURL
            });
    
            await client.connect();
            console.log('Cache is ready');
    
        } catch (error) {
           console.log('Connect to cache is failed')
        }
    }
    module.exports = {connectRedis}
    
    Login or Signup to reply.
  8. const redis = require('redis');
    const client = redis.createClient({
        host: '<hostname>',
        port: <port>,
        password: '<password>'
    });
    
    client.on('error', err => {
        console.log('Error ' + err);
    });
    

    you can read detail at here
    https://docs.redis.com/latest/rs/references/client_references/client_nodejs/

    Login or Signup to reply.
  9. Change to Version
    3.1.2

    1. remove node_modules and package-lock
    2. open package.json
    3. edit redis to version 3.1.2 and save it
    4. run npm install

    if you just want to install direct :

    npm i [email protected]
    
    Login or Signup to reply.
  10. i think the issue may be due to v4+ using typescript in source code. if your server code is not typescript compatible. could be the issue .

    Login or Signup to reply.
  11. I had a similar experience. I attributed the cause of the issue with the redis server I am using which is older than 5.0. So, perhaps you are in a similar situation.

    According to the node-redis documentation,

    "Node Redis should work with older versions of Redis, but it is not fully tested and we cannot offer support." However, "< 5.0" is marked not supported.

    Login or Signup to reply.
  12. install the redis client 3.1.2
    just put 3.1.2 in dependencies in package.json next to redis

    "dependencies" : {
    "redis": "3.1.2"
    }

    Login or Signup to reply.
  13. Most of the previous answers point in the correct direction. However, one minor change which caused me an hour to figure out was semi-colon and parenthesis.

    Error:

    
    (async () => { client.on('error', (err) => console.log('Redis Client Error', err)); })
        ^
        
    TypeError: (intermediate value)(...) is not a function
    
    

    It was happening due to change in redis package of nodejs. From 4.x.x versions, the API to connect database has significantly changed.

    The correct syntax now is:

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

    Inside immediately Invoked Function Expressions (IIFE) require parenthesis to invoke them.

    PS: async and await are necessary as Node Redis now uses native Promises by default for all functions.

    Documentation: https://github.com/redis/node-redis/blob/master/docs/v3-to-v4.md

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