Redis ReJSON систематически возвращает мне две ошибки: отсутствует ключ на нетерминальном пути и новый объект должен быть создан в корне

Вторая ошибка относительно проста для понимания. Первый немного сложнее.

Я пробовал разные комбинации, чтобы преодолеть эту ошибку, но никаких улучшений не произошло. Моя консоль возвращает меня:

// журнал консоли > первое обещание { ReplyError: ERR новые объекты должны быть созданы в корне в parseError (node_modules/redis-parser/lib/parser.js:193:12) в parseType (node_modules/redis-parser/lib/parser .js:303:14) команда: 'JSON.SET', аргументы: [ 'jsonTest7', '.user.here.now', '{".nestedValue": "Я вложенное значение"}' ], код : 'ERR' } // журнал консоли > второе обещание // журнал консоли > ответ jsonTest7: null

Вот мой snippet.js:

const redis=require("redis"); 
rejson = require('redis-rejson');
const {promisify} = require('util'); 

rejson(redis); /* important - this must come BEFORE creating the client */
let client= redis.createClient({
    port:6380,
    host:'localhost', 
});  

const setAsync = promisify(client.json_set).bind(client);
const getAsync = promisify(client.json_get).bind(client);
const existsAsync= promisify(client.exists).bind(client);
client.exists('jsonTest2', function(err, reply) {
    if (reply === 1) {
        return true
    } else {
        return false
    }
});

async function isExist(object){ 
    var isExist= await existsAsync(object).then(data=> data)
        .catch((err) => console.error(err)); 
    console.log("isExist: ", typeof isExist)
    if(isExist !== 1) { 
        console.log("creating object...")
        await setAsync(object, '.', '{"here":"something"}');
        console.log("object created: " + object)
    } 
}
async function myFunc(object, rootKey) { 
    console.log("then 1")
    await isExist(object)
    await setAsync(object,  ".user.here.now", '{".nestedValue": "I am a nested value"}')
                .catch((err) => console.error(err));
    console.log("then 2")
    const res = await getAsync(object,  '.user.here.now')
                .catch((err) => console.error(err)); 
    console.log(object + " response: ", res) 

}
myFunc("jsonTest7")

Любой намек был бы замечательным, спасибо


person Webwoman    schedule 03.03.2019    source источник
comment
если я хорошо понимаю, что вам нужно повторять для каждого объекта, я предполагаю, что это очень мало эффективно, надеюсь, есть более эффективный способ добиться этого   -  person Webwoman    schedule 03.03.2019


Ответы (1)


Первая ошибка означает, что вы пытаетесь создать новый документ, т. е. ключ RedisJSON не существует, но предоставляете только вложенный документ (т. е. «.user.here.now»). Новые ключи должны быть установлены на корневой уровень ('.'), как показано в вашем текущем примере кода.

person Itamar Haber    schedule 03.03.2019
comment
Эй, Итамар, хорошо, рад, если я на пути, но мой текущий образец возвращает меня: ERR missing key at non-terminal path level, я пытался гуглить, но пока ничего не нашел для решения проблемы, может быть, у вас есть подсказка? - person Webwoman; 03.03.2019
comment
в моем тесте кажется, что мне приходится повторять создание каждого уровня один за другим вручную после создания корня, но я предполагаю, что есть функция построения, которая наверняка справится с этим. - person Webwoman; 04.03.2019