Ошибка Redis ERR syntax error при сохранении сессии Express с connect-redis в NestJS

Рейтинг: 0Ответов: 1Опубликовано: 17.07.2025

Я получаю ошибку ReplyError: ERR syntax error при попытке сохранить сессии в Redis с использованием express-session и connect-redis в моем NestJS-приложении. Ошибка возникает во время операций сохранения сессии.

Детали ошибки:

ReplyError: ERR syntax error
at parseError (C:\Users\Админ\OneDrive\Рабочий стол\Portfolio\fullstack-authorization\backend\node_modules\redis-parser\lib\parser.js:179:12)
at parseType (C:\Users\Админ\OneDrive\Рабочий стол\Portfolio\fullstack-authorization\backend\node_modules\redis-parser\lib\parser.js:302:14) {
command: {
    name: 'set',
    args: [
      'sessions:wSJAVffMPLgvFIvQI8yYCmynTKsS835d',
      '{"cookie":{"originalMaxAge":2592000000,"expires":"2025-08-16T13:13:52.669Z","secure":false,"httpOnly":true,"domain":"localhost","path":"/","sameSite":"lax"},"userId":"6878f50eb6f0bf322b6ddfbe"}',
      '[object Object]'
    ]
  }
}

Конфигурация:

const redis = new IORedis({
        host: config.getOrThrow('REDIS_HOST'),
        port: parseInt(config.getOrThrow('REDIS_PORT'), 10),
        username: config.get('REDIS_USER'),
        password: config.get('REDIS_PASSWORD'),
    });

app.use(
        session({
            name: config.getOrThrow('SESSION_NAME'),
            secret: config.getOrThrow('SESSION_SECRET'),
            resave: true,
            saveUninitialized: false,
            rolling: true,
            cookie: {
                domain: config.getOrThrow('SESSION_DOMAIN'),
                maxAge: ms(config.getOrThrow('SESSION_MAX_AGE')),
                httpOnly: parseBoolean(config.getOrThrow('SESSION_HTTP_ONLY')),
                secure: parseBoolean(config.getOrThrow('SESSION_SECURE')),
                sameSite: 'lax',
            },
            store: new RedisStore({
                client: redis,
                prefix: config.getOrThrow('SESSION_FOLDER'),
            }),
        }),
    );

Проблема:

  1. Redis-команда SET получает некорректный третий аргумент [object Object]
  2. Сессии не сохраняются, несмотря на рабочее подключение к Redis
  3. Непонятно, почему хранилище добавляет этот невалидный аргумент

Что я пробовал:

  1. Проверил подключение к Redis
  2. Убедился, что данные сессии валидны перед сохранением

Метод сохранения сессии

async saveSession(req: Request, user: UserDocument): Promise<{ user: UserDocument }> {
        return new Promise((resolve, reject) => {
            req.session.userId = user._id.toString();
            console.log('Before saved', req.session);
            req.session.save((err) => {
                if (err) {
                    console.log('Error', err);
                    console.log('Saving session:', req.session);
                    return reject(new InternalServerErrorException('Не удалось сохранить сессию'));
                }

                resolve({ user });
            });
        });
    }

Логи после вызова

    Before saved Session {
  cookie: {
    path: '/',
    _expires: 2025-08-16T13:55:06.941Z,
    originalMaxAge: 2592000000,
    httpOnly: true,
    domain: 'localhost',
    secure: false,
    sameSite: 'lax'
  },
  userId: '6878f50eb6f0bf322b6ddfbe'
}
Error ReplyError: ERR syntax error
    at parseError (C:\Users\Админ\OneDrive\Рабочий стол\Portfolio\fullstack-authorization\backend\node_modules\redis-parser\lib\parser.js:179:12)
    at parseType (C:\Users\Админ\OneDrive\Рабочий стол\Portfolio\fullstack-authorization\backend\node_modules\redis-parser\lib\parser.js:302:14) {
  command: {
    name: 'set',
    args: [
      'sessions:nn0Yc6pI__SOxPbXDsKLCNNaiLwJdvVz',
      '{"cookie":{"originalMaxAge":2592000000,"expires":"2025-08-16T13:55:06.941Z","secure":false,"httpOnly":true,"domain":"localhost","path":"/","sameSite":"lax"},"userId":"6878f50eb6f0bf322b6ddfbe"}',
      '[object Object]'
    ]
  }
}
Saving session: Session {
  cookie: {
    path: '/',
    _expires: 2025-08-16T13:55:06.941Z,
    originalMaxAge: 2592000000,
    httpOnly: true,
    domain: 'localhost',
    secure: false,
    sameSite: 'lax'
  },
  userId: '6878f50eb6f0bf322b6ddfbe'
}

Докер:

services:
  mongodb:
    image: mongo:7.0
    restart: always
    container_name: nestjs_mongodb
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: ${MONGODB_USER}
      MONGO_INITDB_ROOT_PASSWORD: ${MONGODB_PASSWORD}
      MONGO_INITDB_DATABASE: ${MONGODB_DATABASE}
    volumes:
      - mongodb_data:/data/db
    healthcheck:
      test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
      interval: 30s
      timeout: 10s
      retries: 3
    networks:
      - backend

  redis:
    image: redis:7.2-alpine
    restart: always
    container_name: redis
    ports:
      - "6379:6379"
    command: redis-server --requirepass ${REDIS_PASSWORD}
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
      interval: 30s
      timeout: 10s
      retries: 3
    networks:
      - backend

volumes:
  mongodb_data:
  redis_data:

networks:
  backend:
    driver: bridge

Вопрос: Что вызывает генерацию этой неверной Redis-команды в connect-redis и как правильно настроить хранилище сессий, чтобы избежать синтаксической ошибки?

Окружение: NestJS 11.0.7

express-session ^1.18.1

connect-redis ^9.0.0

ioredis ^5.6.1 (Docker)

redis 7.2-alpine

Ответы

▲ 0

Мне помогло понизить версию connect-redis до версии ^7.1.1.