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
You should
await client.connect()
before using the clientIn 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.
Or you can use legacy mode to preserve the backwards compatibility
client.connect() returns a promise. You gotta use .then() because you cannot call await outside of a function.
You cannot call await outside of a function.
I was having a similar problem and was able to change the connect code as follows.
use
"redis": "3.1.2",
version.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
you cannot call
await
outside of a function. This is what i did that worked me.In app.js