Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
29 / 26 / 18
Регистрация: 02.04.2015
Сообщений: 316

indexedDB get() возвращает пустой объект. А как получить значение по ключу?!

04.08.2022, 23:13. Показов 1248. Ответов 10

Студворк — интернет-сервис помощи студентам
Доброго времени суток, только столкнулся с indexedDB, пробую по всяким (судя по всему второсортным) статьям накидать минимальный рабочий функционал, на текущий момент времени у меня:
- Создаётся база, в ней создаётся хранилище объектов "cart";
- В хранилище добавляются объекты (в инспекторе они видны);
- Получаю все объекты из хранилища путём перебора курсора (не спрашивайте "зачем" - пробую всё, что кажется полезным/интересным);
- Удаляю объекты из хранилища по ключу;
- Казалось бы - всё гуд, но споткнулся на get(id) - делаю по "шаблону" (работающему в предыдущих операциях), однако получаю на выходе пустой объект. Помогите, пож., разобраться: если мне не нужен курсор и перебор всего, а нужен именно объект по ключу, корректно же делать сразу get() без создания доп.сущности курсора? И если "да", то почему возвращается пустой объект (такой ключ в хранилище существует и ему соответствует вполне конкретный объект)...? Код (выдержка):
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    let openRequest = indexedDB.open('my_db', indexeddb_version);
    openRequest.onsuccess = function() {
        let db = openRequest.result;
        let transaction = db.transaction('cart');
        let cart = transaction.objectStore('cart');
        //let request = cart.get('2495');
        let request = cart.get(2495); // Объект с таким ключом существует
        request.onsuccess = function(e) {
            console.log(JSON.stringify(request)); // возвращает: {}
            console.log(JSON.stringify(request.result)); // возвращает: undefined
            console.log(JSON.stringify(e)); // возвращает: {"isTrusted":true}
        };
        request.onerror = (err)=> {
            console.error(`Error to get cart information: ${err}`);
        }
        transaction.complete;
        db.close();
    }
При этом "выше" в консоли есть вывод всего перебором курсора, тут приведу только вывод, что бы было понятно, что такая запись в хранилище есть:
JSON
1
{"2495":{"id":2495,"count":4,"added":"2022-08-04T19:31:52.273Z"},"7938":{"id":7938,"count":4,"added":"2022-07-26T17:58:28.731Z"},"57858":{"id":57858,"count":4,"added":"2022-07-28T20:27:43.882Z"},"102435":{"id":102435,"count":4,"added":"2022-07-26T17:06:26.415Z"},"134404":{"id":134404,"count":4,"added":"2022-07-25T19:53:27.855Z"},"1014529":{"id":1014529,"count":4,"added":"2022-07-28T20:04:02.815Z"},"1119489":{"id":1119489,"count":4,"added":"2022-07-25T19:52:01.886Z"},"1149528":{"id":1149528,"count":4,"added":"2022-08-04T10:16:18.151Z"}}
Просьба: объясните как "правильно", или ткните носом в ссылку (где код будет отличаться от моего, а то по статьям всё сводится к абсолютно этому же, но вот результат обещают другой).
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.08.2022, 23:13
Ответы с готовыми решениями:

Написать функцию которая возвращает значение по ключу, если ключа нет, то создает ключ со значением 3 и возвращает его
Нельзя использовать if from typing import Any def get_or_set(collection: dict, key: Any) -> Any: result = ? ...

Как получить значение по ключу из SortedList?
Как по ключу получить Value в SortedList???? Почему то не могу найти такой метод...

Как получить значение поля в запросе по ключу
Есть запрос «ПоследниеЗаказы» В нем есть поле «СуммаЗаказа» как получить его значение по ключу номер заказа. Понимаю скорее всего...

10
54 / 32 / 3
Регистрация: 25.07.2022
Сообщений: 212
05.08.2022, 00:05
ИмяПользователя,

Вот так удобнее просматривать JSON структуры...
https://jsonformatter.org/

JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{
  "2495": {
    "id": 2495,
    "count": 4,
    "added": "2022-08-04T19:31:52.273Z"
  },
  "7938": {
    "id": 7938,
    "count": 4,
    "added": "2022-07-26T17:58:28.731Z"
  },
  "57858": {
    "id": 57858,
    "count": 4,
    "added": "2022-07-28T20:27:43.882Z"
  },
  "102435": {
    "id": 102435,
    "count": 4,
    "added": "2022-07-26T17:06:26.415Z"
  },
  "134404": {
    "id": 134404,
    "count": 4,
    "added": "2022-07-25T19:53:27.855Z"
  },
  "1014529": {
    "id": 1014529,
    "count": 4,
    "added": "2022-07-28T20:04:02.815Z"
  },
  "1119489": {
    "id": 1119489,
    "count": 4,
    "added": "2022-07-25T19:52:01.886Z"
  },
  "1149528": {
    "id": 1149528,
    "count": 4,
    "added": "2022-08-04T10:16:18.151Z"
  }
}
Добавлено через 5 минут
ИмяПользователя, У вас есть общий массив, а в нем элементы с именами "2495", "7938", "57858", "102435", "134404", "1014529", "1119489", "1149528". Можно считать их ключами, но вы обращаетесь к ним не по полю/аргументу id, а по самому имени.
То есть условно, если бы имена были такими:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{
  "Петя": {
    "id": 2495,
    "count": 4,
    "added": "2022-08-04T19:31:52.273Z"
  },
  "Машина1": {
    "id": 7938,
    "count": 4,
    "added": "2022-07-26T17:58:28.731Z"
  },
  "Дом": {
    "id": 57858,
    "count": 4,
    "added": "2022-07-28T20:27:43.882Z"
  },
  "Яблоко": {
    "id": 102435,
    "count": 4,
    "added": "2022-07-26T17:06:26.415Z"
  },
  "Апельсин": {
    "id": 134404,
    "count": 4,
    "added": "2022-07-25T19:53:27.855Z"
  },
  "Монитор": {
    "id": 1014529,
    "count": 4,
    "added": "2022-07-28T20:04:02.815Z"
  },
  "Клавиатура": {
    "id": 1119489,
    "count": 4,
    "added": "2022-07-25T19:52:01.886Z"
  },
  "Машина2": {
    "id": 1149528,
    "count": 4,
    "added": "2022-08-04T10:16:18.151Z"
  }
}
и вы бы пытались обратиться к элементу с именем "2495" ничего не получилось, ведь поле/аргумент id и название элемента это не одно и то же.

Добавлено через 1 минуту
ИмяПользователя,
И если "да", то почему возвращается пустой объект (такой ключ в хранилище существует и ему соответствует вполне конкретный объект)...? Код (выдержка):
Ключом может служить только строка (обычно). И нет, объекта правда не существует...

2495 и "2495" это разные вещи.
Число и строка.
Попробуйте искать не 2495, а "2495". :3

Добавлено через 35 секунд
У вас элемент с именем "2495", а вы ищите число 2495, не строку "2495"

Добавлено через 57 секунд
Я в indexedDB не бум бум, но есть опыт работы с другими СУБД. Есть вероятность, что используя просто число, вы ищите объект который по счету находится на 2495-ой позиции, а не ключ "2495".

Добавлено через 7 минут
ИмяПользователя,
https://developer.mozilla.org/... dex/getKey

JavaScript
1
let request = cart.get(2495); // Объект с таким индексом существует
JavaScript
1
let request = cart.getKey("2495"); // Объект с таким ключом существует
0
29 / 26 / 18
Регистрация: 02.04.2015
Сообщений: 316
05.08.2022, 00:11  [ТС]
Цитата Сообщение от Username_name Посмотреть сообщение
Можно считать их ключами, но вы обращаетесь к ним не по полю/аргументу id, а по самому имени.
- перечитал трижды, возвращаясь к "структуре" и "предыдущему" коду... Ничего не понял.
Есть код удаления, который работает, выглядит так:
JavaScript
1
2
3
4
5
6
7
8
    let openRequest = indexedDB.open('my_db', indexeddb_version);
    openRequest.onsuccess = function() {
        let db = openRequest.result;
        let transaction = db.transaction('cart', 'readwrite');
        let cart = transaction.objectStore('cart');
        cart.delete(prod_id);
        transaction.complete;
    }
И да, в prod_id "лежит" та же инфа: 2495 (потом я этот же товар снова кидаю в "корзину", добавление работает и в качестве "ключа" я указываю именно id позиции, в хранимом объекте структура же может быть, условно, любой. Поэтому id из структуры объекта это не то поле, по которому должен работать метод get(), правильно? Он (get) должен искать именно по "именам/индексам" объектов в "массиве"... кстати, как такового массива там нет - я его создаю пустым и наполняю при каждой итерации обхода через "cart.openCursor()".
Почему удаление "по имени/ключу" работает, а получение объекта не хочет...?!
Как должен выглядеть рабочий код получения элемента??! Или с indexedDB в принципе надо работать только через курсоры? М.б. я это упустил где-то в размытых описаниях? Не хочется плодить лишнего кода/сущностей.

Добавлено через 4 минуты
Цитата Сообщение от Username_name Посмотреть сообщение
let request = cart.getKey("2495"); // Объект с таким ключом существует
- Замена get() на getKey() результата не дала (проверил - тот же результат);
Разницу между строкой/числом понимаю, изначально везде подставляется переменная, в ней строка, потом уже плюнул на переменные начал явно писать в наколенке значение в том и ином виде (в первом посте закоменченая шестая строка когда не сработала - появилась седьмая, просто что бы убедиться, что дело не в этом).
0
54 / 32 / 3
Регистрация: 25.07.2022
Сообщений: 212
05.08.2022, 00:13
ИмяПользователя,
- перечитал трижды, возвращаясь к "структуре" и "предыдущему" коду... Ничего не понял.
Есть несколько сущностей с уникальными именами: "2495", "7938", "57858", "102435", "134404", "1014529", "1119489", "1149528". У каждого есть свой уникальный айди. Но когда мы к ним обращаемся. Мы обращаемся не по айди, а по уникальному имени. Допустим
Привет "2495", скажи мне свой айди.
.

Так вот у вас там небольшая неразбериха. Раз имена у объектов итак уникальные, зачем добавлять ещё и поля айди. Можно просто от него отказаться. Поле айди нужно если имена могут совпать.

Допустим если бы вместо "2495" было бы "Петя" и могло быть несколько Петь: "Петя", "Петя", "Петя":

JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
  "Петя": {
    "рост": 170,
    "дата последнего кормления": "2022-07-25T19:53:27.855Z"
  },
  "Петя": {
    "рост": 170,
    "дата последнего кормления": "2022-07-25T19:53:27.855Z"
  },
  "Петя": {
    "рост": 170,
    "дата последнего кормления": "2022-07-25T19:53:27.855Z"
  },
  "Петя": {
    "рост": 170,
    "дата последнего кормления": "2022-07-25T19:53:27.855Z"
  },
  "Петя": {
    "рост": 170,
    "дата последнего кормления": "2022-07-25T19:53:27.855Z"
  }
}
0
29 / 26 / 18
Регистрация: 02.04.2015
Сообщений: 316
05.08.2022, 00:14  [ТС]
Цитата Сообщение от Username_name Посмотреть сообщение
Есть вероятность, что используя просто число, вы ищите объект который по счету находится на 2495-ой позиции, а не ключ "2495".
- Испугался, проверил, не - всё нормально: оно одинаково не ищет как "2495", так и "1", хоть тут всё предсказуемо! ))
0
54 / 32 / 3
Регистрация: 25.07.2022
Сообщений: 212
05.08.2022, 00:20
Тогда бы пришлось им давать уникальные id:

JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
  "Петя": {
    "id": 1,
    "рост": 170,
    "дата последнего кормления": "2022-07-25T19:53:27.855Z"
  },
  "Петя": {
    "id": 2,
    "рост": 170,
    "дата последнего кормления": "2022-07-25T19:53:27.855Z"
  },
  "Петя": {
    "id": 3,
    "рост": 170,
    "дата последнего кормления": "2022-07-25T19:53:27.855Z"
  },
  "Петя": {
    "id": 4,
    "рост": 170,
    "дата последнего кормления": "2022-07-25T19:53:27.855Z"
  },
  "Петя": {
    "id": 5,
    "рост": 170,
    "дата последнего кормления": "2022-07-25T19:53:27.855Z"
  }
}
Добавлено через 21 секунду
Чтобы отличать объекты с одинаковыми именами по id.

Добавлено через 34 секунды
ИмяПользователя,
- Испугался, проверил, не - всё нормально: оно одинаково не ищет как "2495", так и "1", хоть тут всё предсказуемо! ))
а getKey пробовали?

Добавлено через 1 минуту
PS: Хотя вверху не совсем дата последнего кормления, а скорее TimeStamp отпечаток времени (дата, время) бывают ещё с часовым поясом...

Добавлено через 3 минуты
Не стесняйтесь, спрашивайте
Ведь кто тут ещё так хорошо объяснит что-либо, кроме меня
0
29 / 26 / 18
Регистрация: 02.04.2015
Сообщений: 316
05.08.2022, 00:21  [ТС]
Цитата Сообщение от Username_name Посмотреть сообщение
Раз имена у объектов итак уникальные, зачем добавлять ещё и поля айди.
- На сколько я понимаю, это сейчас абсолютно не важно. Так как во-первых - наколенка собирается. что бы понять как оно вообще работает, а во-вторых - красивую/рациональную структуру сейчас не есть целью создавать. Цель - получить значение (объект) из хранилища объектов (аналог таблиц в реляционках), по ключу (те самые "имена", на сленге статей, описывающих работу с indexedDB называют ключами).
Каждый ключ - уникальный, по идее должно быть всё просто: запрашивая инфу по ключу я должен получить либо пустой объект (что у меня и происходит), либо объект, хранящийся под этим ключом - то, чего ожидаю, но не получаю...

Подозреваю - запутался в асинхронности вызовов. Подозреваю, что пытаюсь получить значения через get раньше, чем та же транзакция создалась, но подозрения - плохо, круто, когда знаешь, а не подозреваешь! ))
0
54 / 32 / 3
Регистрация: 25.07.2022
Сообщений: 212
05.08.2022, 00:29
Кроме меня тут и спросить некого . Все остальные наверное уже спят ...

Добавлено через 49 секунд
Подозреваю, что пытаюсь получить значения через get раньше, чем та же транзакция создалась, но подозрения - плохо, круто, когда знаешь, а не подозреваешь! ))
сейчас перечитаю код и отвечу

Добавлено через 1 минуту
ИмяПользователя,
Подозреваю, что пытаюсь получить значения через get раньше, чем та же транзакция создалась
Так вы же не весь код выложили, а лишь выдержку. Мне для полноты картины нужен код добавляющий эти элементы тоже

Добавлено через 1 минуту
Жду полный код

Добавлено через 3 минуты

Не по теме:

смайлик описывающий debug процесс. Добивать код пока тот не перестанет мучаться...

PS: смайлики под тегом OFF не видны поэтому оставил его вне тега...

0
29 / 26 / 18
Регистрация: 02.04.2015
Сообщений: 316
05.08.2022, 11:37  [ТС]
Цитата Сообщение от ИмяПользователя Посмотреть сообщение
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let openRequest = indexedDB.open('my_db', indexeddb_version);
    openRequest.onsuccess = function() {
        let db = openRequest.result;
        let transaction = db.transaction('cart');
        let cart = transaction.objectStore('cart');
        //let request = cart.get('2495');
        let request = cart.get(2495); // Объект с таким ключом существует
        request.onsuccess = function(e) {
            console.log(JSON.stringify(request)); // возвращает: {}
            console.log(JSON.stringify(request.result)); // возвращает: undefined
            console.log(JSON.stringify(e)); // возвращает: {"isTrusted":true}
        };
        request.onerror = (err)=> {
            console.error(`Error to get cart information: ${err}`);
        }
        transaction.complete;
        db.close();
    }
- Утро, просто запустил и... работает. Не поверил, отмотал гитом до "вчерашнего обеда" (когда начало только сбоить и ещё не накидал тысячи и одной мелкой правки в попытках накнопать где ж собака порылась) - и... всё работает. Изначальный вариант, почти полностью копипастом взятый с инета - сегодня работает, а вчера - не хотел. Ну и как такое на проде люди пользуют, если оно то работает, то нет??!

PS. В моём случае находит и возвращает записи если либо как в примере - цифру написать, либо явно привести:
JavaScript
1
let request = cart.get(parseInt(prod_id));
PS2. Ребят, в ру.сегменте очень мало толкового (не сумбурного) описания концепции indexedDB (ну или я искать совсем разучился). Просьба, если у кого-то есть под рукой статья/дока по теме "для новичков и не только" (именно на ру) - покидайте ссылки просто в тему пож., на выходных почитаю, а то гуглится перевод одной и той же статьи везде.
Всем спасибо)
0
Эксперт JS
 Аватар для DrType
6553 / 3624 / 1075
Регистрация: 07.09.2019
Сообщений: 5,877
Записей в блоге: 1
05.08.2022, 14:36
Лучший ответ Сообщение было отмечено ИмяПользователя как решение

Решение

Цитата Сообщение от ИмяПользователя Посмотреть сообщение
(именно на ру)
Из русскоязычного одно из самых подробных — https://learn.javascript.ru/indexeddb .

Не по теме:

Англоязычных вчера сам много пересмотрел, пока вашу тему читал )

2
29 / 26 / 18
Регистрация: 02.04.2015
Сообщений: 316
05.08.2022, 16:42  [ТС]
Цитата Сообщение от ИмяПользователя Посмотреть сообщение
- Утро, просто запустил и... работает.
- В продолжение темы, вдруг когда кому поможет не сойти с ума: добавил метод изменения существующей записи .put(). В нём всё абсолютно идентично методу добавления .add(). И вроде бы, судя по выводу в консоли - всё действительно работает, а именно - я изменяю кол-во в товаре, после чего опять запускаю перебор по курсору и вижу, что да - выведенные в консоли данные изменились, НО!!!
Что я только не делал в инспекторе объектов (и обновлял "таблицу", и всю базу "обновить" нажимал, и даже закрыл/открыл браузер) - данные, отображаемые в хроме, в инспекторе объектов на вкладке Application ОТЛИЧАЮТСЯ от данных, возвращаемых после запроса из базы!! В инспекторе показывается первоначальное "состояние" объекта (каким он был ДОБАВЛЕН в хранилище), при этом если его удалить - он удаляется и в инспекторе, если добавить - добавляется заново (конечно после ручного нажатия рефреша в инспекторе), НО(!) при изменении (.put()) заставить инспектора перечитать/изменить вывод я так и не смог!!
"С" - стабильность!!! ))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.08.2022, 16:42
Помогаю со студенческими работами здесь

Получить адрес на переменную\объект, потом от этого адреса создать указатель на объект и изменить значение. Как?
int a=55; uintptr_t adr=&a; int *b=*adr; *b=88; cout << "a=" << a << "b=" << b; Добавлено через 16 минут так...

Объект не возвращает значение
В данном кривом(ужасном) коде obj.sum выводит 0 , как тут правильно вернуть значение получаемое из for? #include <cmath> // ...

Получить значение по ключу в treeview
Есть функция treeview.Nodes.Add(string key, string text, int imageindex), в ней задается ключ. Как потом можно получить этот ключ обратно...

Получить значение из массива по ключу
Здравствуйте, товарищи программисты и сисадмины! У меня возникли трудности с выводом значений из массива: Array ( => stdClass...

Получить значение по ключу из Map
У меня есть такой Map:{v1234546=} Подскажите, пожалуйста, как получить значение для ключа v12.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru