Ошибка Redis ERR syntax error при сохранении сессии Express с connect-redis в NestJS
Я получаю ошибку 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'),
}),
}),
);
Проблема:
- Redis-команда SET получает некорректный третий аргумент [object Object]
- Сессии не сохраняются, несмотря на рабочее подключение к Redis
- Непонятно, почему хранилище добавляет этот невалидный аргумент
Что я пробовал:
- Проверил подключение к Redis
- Убедился, что данные сессии валидны перед сохранением
Метод сохранения сессии
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
Источник: Stack Overflow на русском