Также опубликовано в Stack Overflow: http://stackoverflow.com/questions/43858414/error-with-node-redis-deprecated-the-set-command-contains-a-argument-of-type-o
Я использую модуль connect-redis-crypto (https://github.com/jas-/connect-redis-crypto), который создан для шифрования данных сеанса redis поверх connect-redis (https: // github. com / tj / connect-redis). Моя версия Redis - 3.2.8.
Я столкнулся с ошибкой node-redis: Устарело: команда SET содержит аргумент типа Object. Судя по более крупному сообщению об ошибке, похоже, что это происходит из-за попытки проанализировать строку [object Object], когда она не является строкой JSON. Я помещаю вложенные объекты, которые содержат информацию о пользователе, в req.session, которая напрямую сохраняется (и в идеале зашифровывается) в redis.
Из некоторых источников я узнал, что вложенные объекты в Redis не разрешены, что может вызвать эту ошибку, но я считаю, что эта библиотека хранит данные как JSON, чтобы разрешить вложенные объекты. connect-redis отлично работает для меня, но когда эта библиотека connect-redis-crypto пытается проанализировать зашифрованные данные JSON, она выдает мне именно эту ошибку.
Был бы очень признателен за вашу помощь!
node_redis: Deprecated: The SET command contains a argument of type Object.
This is converted to "[object Object]" by using .toString() now and will return an error from v.3.0 on.
Please handle this in your code to make sure everything works as you intended it to.
8 May 18:24:48 - ---NEW REQUEST---
REQUEST : GET /api/somePath/client
QUERY : {}
BODY : {}
data [object Object]
err SyntaxError: Unexpected token o in JSON at position 1
at JSON.parse (<anonymous>)
at Command.callback (/Users/Documents/web-AOT/server/node_modules/connect-redis-crypto/lib/connect-redis.js:262:35)
at normal_reply (/Users/Documents/web-AOT/server/node_modules/redis/index.js:721:21)
at RedisClient.return_reply (/Users/Documents/web-AOT/server/node_modules/redis/index.js:819:9)
at JavascriptRedisParser.returnReply (/Users/Documents/web-AOT/server/node_modules/redis/index.js:192:18)
at JavascriptRedisParser.execute (/Users/Documents/web-AOT/server/node_modules/redis-parser/lib/parser.js:560:12)
at Socket.<anonymous> (/Users/Documents/web-AOT/server/node_modules/redis/index.js:274:27)
at emitOne (events.js:96:13)
at Socket.emit (events.js:189:7)
at readableAddChunk (_stream_readable.js:176:18)
at Socket.Readable.push (_stream_readable.js:134:10)
at TCP.onread (net.js:551:20)
node_redis не преобразует объект в строку, если он предоставляется. Причина в том, что он не знает, когда разбирать строку, а когда нет.
Следовательно, вы фактически сохранили [object Object]
в Redis, как указано в предупреждении. И вы столкнулись с ошибкой синтаксического анализа, потому что [object Object]
недействителен JSON. Поэтому, пожалуйста, сделайте свой объект строковым, прежде чем передавать его node_redis.
Используйте: client.set ('ключ', JSON.stringify ({пример: {поле: 'тестирование', поле1: 333}, поле: 123}, () => {});
client.get ('key', (err, data) => {
console.log (JSON.parse (данные);
});
можно ли получить обратный вызов по этому предупреждению? На больших проектах всегда сложно найти причину этого предупреждения.
Самый полезный комментарий
node_redis не преобразует объект в строку, если он предоставляется. Причина в том, что он не знает, когда разбирать строку, а когда нет.
Следовательно, вы фактически сохранили
[object Object]
в Redis, как указано в предупреждении. И вы столкнулись с ошибкой синтаксического анализа, потому что[object Object]
недействителен JSON. Поэтому, пожалуйста, сделайте свой объект строковым, прежде чем передавать его node_redis.