How to export redis client in node-redis after connection

Viewed 530

I'm using node-redis 4.0.2, and I want to be able to connect to Redis once, then use this connection afterwards. However, I couldn't do it, I get TypeError: client.set is not a function because I don't know how to export the client after the connection is established.

How can I achieve it?

import { createClient } from 'redis'

export const client = (async () => {
  const client = createClient({
    url: 'redis://default:mypassishere@127.0.0.1:6380',
  })

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

  await client.connect()

  return client
})()


export async function test () {
  await client.set('testdata', 'ok')
  const answer = await client.get('testdata')
  console.log(answer)
}

I used to do it like below (node-redis 3.1.2), but given that I can't use async like that, I can't implement the same solution now.

import { createClient } from 'redis'

const { promisify } = require('util')

const client = createClient({ port: 6379 })

client.auth('mypassishere', () => {
  console.log('Redis: connection successful.')
})

client.on('error', e => {
  console.log(`Redis connection error: ${e}`)
})

const smembers = promisify(client.smembers).bind(client)
const get = promisify(client.get).bind(client)
const set = promisify(client.set).bind(client)
const hmset = promisify(client.hmset).bind(client)
const hset = promisify(client.hset).bind(client)
const del = promisify(client.del).bind(client)
const hdel = promisify(client.hdel).bind(client)
const sadd = promisify(client.sadd).bind(client)
const hgetall = promisify(client.hgetall).bind(client)
const srem = promisify(client.srem).bind(client)
const keys = promisify(client.keys).bind(client)
const incr = promisify(client.incr).bind(client)
const hget = promisify(client.hget).bind(client)
const lrange = promisify(client.lrange).bind(client)
const rpush = promisify(client.rpush).bind(client)
const hincrby = promisify(client.hincrby).bind(client)
const ttl = promisify(client.ttl).bind(client)
const expire = promisify(client.expire).bind(client)


export {
  smembers, get, set, hmset, del, sadd, hgetall, srem, hset, hdel, keys, incr, ttl, expire, hget, lrange, hincrby, rpush
}
1 Answers
import * as redis from 'redis';

export const redisClient = redis.createClient();

(async () => {
   redisClient.on('error', (err) => console.log(err));
   await redisClient.connect();
})();

export const getRedisAsync = async (key) => {
   const value = await redisClient.get(key);
   return value;
};
export const setRedisAsync = async (key, value) => {
   await redisClient.set(key, value);
};

export const onConnectCallback = (callback) => {
   redisClient.on('connect', () => {
   callback();
  });
};
Related