Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.03.2020, 00:16
Новичок на форуме
Отправить личное сообщение для amon--ra Посмотреть профиль Найти все сообщения от amon--ra
 
Регистрация: 17.03.2020
Сообщений: 6

Не могу прочитать данные из IndexedDB
Здравствуйте.
Есть такой код:

function getRec(Rec, f){
connectDB(function(db){
var request = db.transaction([storeName], "readonly").objectStore(storeName).get(id=0);
request.onerror = logerr;
request.onsuccess = function(){
Rec = request.result;
console.log(Rec);
f(request.result ? request.result : -1);
}
});
}

Вывод в консоль самого Rec я вижу в хроме.
Но, например, Rec.width консоль выдает undefined.

Записать объект Rec {width : 1000, .....} мне удалось, а вот прочитать записанное из другого файла js не могу.

Я только пытаюсь освоить js.
Помогите, может кто-то рабочий код подкинет?
Дальше я сам попробую разобраться.
Заранее благодарен.
Ответить с цитированием
  #2 (permalink)  
Старый 18.03.2020, 18:18
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Что значит из "другого файла js"?
С другой html страницы? Вы их запускаете с сервера из одного домена?
Ответить с цитированием
  #3 (permalink)  
Старый 19.03.2020, 21:08
Новичок на форуме
Отправить личное сообщение для amon--ra Посмотреть профиль Найти все сообщения от amon--ra
 
Регистрация: 17.03.2020
Сообщений: 6

Я запускаю на локальном компьютере без серверов и прочего.
Планирую сделать расширение, способное работать вообще без сети.
Что-то похожее на speed dial 2.
Ответить с цитированием
  #4 (permalink)  
Старый 19.03.2020, 21:36
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

IndexedDB работает по политике одного источника. Т.е базу данных могут использовать страницы только с того же домена, что и страница создавшая базу. При загрузке страниц с локального компьютера из файловой системы понятия домена нет. Поэтому и не работает.
Ответить с цитированием
  #5 (permalink)  
Старый 19.03.2020, 21:45
Новичок на форуме
Отправить личное сообщение для amon--ra Посмотреть профиль Найти все сообщения от amon--ra
 
Регистрация: 17.03.2020
Сообщений: 6

Вы не поняли.
У меня все работает. Я, например, могу записать в IDB запись, т. е. объект вида let D = {"length" : 100, "Q" : 200 ...}. И прочитать D могу при помощи транзакции - в консоли он виден. Но вот к его свойствам доступа нет, например, D.width и т.д. Я подозреваю, что вообще детскую ошибку делаю, возможно, на уровне лексики языка. Поэтому и прошу посмотреть рабочий код, который читает из БД, записывает в нее и редактирует выбранную запись. Я только начинаю изучать JS, поэтому возможны элементарные ляпы.
А Вам спасибо большое - Вы хотя бы откликнулись на зов чайника.
Ответить с цитированием
  #6 (permalink)  
Старый 19.03.2020, 23:29
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Сообщение от amon--ra Посмотреть сообщение
Вы не поняли.
У меня все работает. Я, например, могу записать в IDB запись, т. е. объект вида let D = {"length" : 100, "Q" : 200 ...}. И прочитать D могу при помощи транзакции - в консоли он виден. Но вот к его свойствам доступа нет, например, D.width и т.д. Я подозреваю, что вообще детскую ошибку делаю, возможно, на уровне лексики языка. Поэтому и прошу посмотреть рабочий код, который читает из БД, записывает в нее и редактирует выбранную запись.
Ну так покажите код, что было ясно, что записываете, что читаете.
Что именно видно в консоле?

console.log(Rec);
Что выводится?
Ответить с цитированием
  #7 (permalink)  
Старый 20.03.2020, 13:33
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

взял тут https://developers.google.com/web/il...with-indexeddb
dbPromise.then(function(db) {
  var tx = db.transaction('store', 'readonly');
  var store = tx.objectStore('store');
  return store.get('sandwich');
}).then(function(val) {
  console.dir(val);
});


это Promise
return store.get('sandwich')


потом идет then и там уже значение...
Ответить с цитированием
  #8 (permalink)  
Старый 20.03.2020, 17:14
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Сообщение от voraa Посмотреть сообщение
IndexedDB работает по политике одного источника. Т.е базу данных могут использовать страницы только с того же домена, что и страница создавшая базу. При загрузке страниц с локального компьютера из файловой системы понятия домена нет. Поэтому и не работает.
Я ошибался. Файрфокс действительно не работает при загрузке с локального файла, но Хромовые браузеры работают. Причем им доступна база данных, независимо от того, из какого каталога запускается страница.
Ответить с цитированием
  #9 (permalink)  
Старый 21.03.2020, 01:19
Новичок на форуме
Отправить личное сообщение для amon--ra Посмотреть профиль Найти все сообщения от amon--ra
 
Регистрация: 17.03.2020
Сообщений: 6

Доброго времени суток.
Вот весь код.


var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB,
IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction,
baseName = "Base_0",
storeName = "Options";
storeName1 = "List";

let f = function() {};
let Rec = {};


function logerr(err){
console.log(err);
}

function connectDB(f){
var request = indexedDB.open(baseName, 1);
request.onerror = logerr;
request.onsuccess = function(){
f(request.result);
}
request.onupgradeneeded = function(e){
e.currentTarget.result.createObjectStore(storeName , { keyPath: "id" });
e.currentTarget.result.createObjectStore(storeName 1, { keyPath: "path" });
connectDB(f);
}
}

function getRec(Rec, f){
connectDB(function(db){
var request = db.transaction([storeName], "readonly").objectStore(storeName).get(id=0);
request.onerror = logerr;
request.onsuccess = function(){
Rec = request.result;
console.log(Rec);
f(request.result ? request.result : -1);
}
});
}

function getStorage(f){
connectDB(function(db){
var rows = [],
store = db.transaction([storeName], "readonly").objectStore(storeName);

if(store.mozGetAll)
store.mozGetAll().onsuccess = function(e){
f(e.target.result);
};
else
store.openCursor().onsuccess = function(e) {
var cursor = e.target.result;
if(cursor){
rows.push(cursor.value);
cursor.continue();
}
else {
f(rows);
}
};
});
}

function setRec(Rec){
connectDB(function(db){
var request = db.transaction([storeName], "readwrite").objectStore(storeName).put({Value : Rec, "id": 0});
request.onerror = logerr;
request.onsuccess = function(){
return request.result;
}
});
}

function delRec(Rec){
connectDB(function(db){
var request = db.transaction([storeName], "readwrite").objectStore(storeName).delete(Rec );
request.onerror = logerr;
request.onsuccess = function(){
console.log("Record delete from DB:", Rec);
}
});
}
document.addEventListener('DOMContentLoaded', function init() {

connectDB(f);

//Rec.width = 500;
//setRec(Rec);
//console.log(Rec);

getRec(Rec, f);

console.log(Rec);

}, false);

Это будущее расширение хром.
Оно работает в браузере на локальной машине.
Там нет никаких серверов.
У Вас может есть рабочий код работы с IndexedDB?
Такой что бы читал и писал.
Последнее не обязательно - запись целого объекта из этого кода работает.
Мне всего-то нужно прочитать поля объекта, а не объект целиком.
Целиком он читается.
Ответить с цитированием
  #10 (permalink)  
Старый 21.03.2020, 01:32
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

amon--ra,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как спарсить POST данные в Google Plus ChenghisKhan Общие вопросы Javascript 0 16.01.2017 10:31
не отправляются данные XMLHttpRequest() sinefighter AJAX и COMET 1 07.07.2014 08:30
Как отобразить данные из базы на форме? ascherbakov AJAX и COMET 2 12.03.2014 15:55
JSON данные принять на стороне клиента tenatin Общие вопросы Javascript 5 05.03.2014 16:32
Контекстное меню как считать данные из таблицы xela1980 jQuery 25 31.05.2013 14:20