es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error de configuración de connect-redis y express-session: UnhandledPromiseRejectionWarning: Error: El cliente está cerrado.

import { MikroORM } from '@mikro-orm/core';
import { ApolloServer } from 'apollo-server-express';
import express from 'express';
import { buildSchema } from 'type-graphql';
import { __prod__ } from './constants';
import mikroOrmConfig from './mikro-orm.config';
import { HelloResolver } from './resolvers/hello';
import { PostResolver } from './resolvers/post';
import { UserResolver } from './resolvers/user';

const main = async () => {
  const orm = await MikroORM.init(mikroOrmConfig);
  await orm.getMigrator().up();

  const app = express();

  const redis = require('redis');
  const connectRedis = require('connect-redis');
  const session = require('express-session');
  const RedisStore = connectRedis(session);

  const redisClient = redis.createClient({
    port: 6379,
    host: 'localhost',
  });

  app.use(
    session({
      name: 'qid',
      saveUninitialized: false,
      secret: 'sdfdsf24342fdsdfdsf23f2fdwf',
      resave: false,
      store: new RedisStore({
        client: redisClient,
        disableTouch: true,
      }),
      cookie: {
        maxAge: 86400 * 10, // 10 days
        httpOnly: true,
        secure: __prod__,
        sameSite: 'lax',
      },
    })
  );

  const apolloServer = new ApolloServer({
    schema: await buildSchema({
      resolvers: [HelloResolver, PostResolver, UserResolver],
      validate: false,
    }),

    // context is an object accessible by all the resolvers
    context: ({ req, res }) => ({ em: orm.em, req, res }),
  });

  apolloServer.applyMiddleware({ app });

  app.listen(4000, () => {
    console.log('El servidor se ha iniciado en el puerto 4000');
  });
};

main().catch(err => {
  console.error(err);
});
$ yarn dev
Resultado: El servidor se ha iniciado en el puerto 4000
Y después de 2 segundos:
UnhandledPromiseRejectionWarning: Error: El cliente está cerrado
    en Comandante. RedisClientsendCommand (/home/hleb/Projects/wreddit-server/node_modules/@node-redis/client/dist/lib/client/index.js:387:31)

¿Qué estoy haciendo mal?
Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Según el fragmento de código proporcionado, es posible que la conexión del cliente de Redis se esté cerrando antes de que expire la sesión, lo que da como resultado el error “The client is closed” (El cliente está cerrado).

    Para resolver este problema, puedes intentar agregar la siguiente línea después de crear el cliente de Redis para manejar cualquier error que pueda ocurrir durante el proceso de conexión y registrar cualquier evento relacionado con la conexión:

    redisClient.on('error', console.error);
    redisClient.on('connect', () => console.log('Cliente de Redis conectado'));
    redisClient.on('ready', () => console.log('Cliente de Redis listo'));
    redisClient.on('reconnecting', () => console.log('Cliente de Redis reconectando'));
    redisClient.on('end', () => console.log('Cliente de Redis cerrado'));
    

    Esto debería ayudar a diagnosticar mejor cualquier problema con la conexión del cliente de Redis y evitar que se cierre prematuramente.

    Además, puedes intentar aumentar la edad máxima de la cookie de sesión para asegurarte de que no expire demasiado rápido, lo cual también podría contribuir al problema:

    cookie: {
        maxAge: 864000000, // 10 días en milisegundos
        httpOnly: true,
        secure: __prod__,
        sameSite: 'lax',
    },
    

    ¡Espero que esto ayude!

Comments are closed.