Uncaught TypeError: Ошибка типа в Chrome при использовании indexedDB - PullRequest
1 голос
/ 16 марта 2012

Я пытаюсь настроить хранилище indexeddb для использования в chrome.Но я получаю Uncaught TypeError, когда пытаюсь настроить транзакцию READ_WRITE.

Мне не удалось найти хорошую, актуальную информацию об использовании webkitIDB.Так что я в основном летаю вслепую здесь.Есть идеи, что я сделал не так?Есть ли здесь хорошие пропуски, которые я пропустил?

Настройка:

function OfflineStorage() {
  this.saveJSONString = __bind(this.saveJSONString, this);
  var request,
    _this = this;
  this.dbkeyRange = window.webkitIDBKeyRange;
  this.dbTransaction = window.webkitIDBTransaction;
  this.db = window.webkitIndexedDB;
  request = this.db.open("lucidFrog");
  request.onsuccess = function(e) {
    _this.db = e.target.result;
    return _this.setupDB(); //setupDB() ensures the objectStores have been created.
  };
}    

Функция сохранения:

OfflineStorage.prototype.saveJSONString = function(objectStore, json_string, obj_id) {
  var request, store, transaction;

  //PROBLEM AREA, gives "Uncaught TypeError: Type error"
  transaction = this.db.transaction([objectStore], this.dbTransaction.READ_WRITE, 0);
  ////////////////////

  store = transaction.objectStore(objectStore);
  request = store.put({
    "json": json_string,
    "id": obj_id
  });
  request.onsuccess = function(e) {
    return console.log("YYYYYYEEEEEAAAAAHHHHHH!!!");
  };
};

Запрошенный objectStore создан,и подтвердил, что this.dbTransaction определен.

1 Ответ

5 голосов
/ 21 марта 2012

Это не ошибка IndexedDB, генерируемая из хранилища объектов, а что-то в настройке.Этот тип ошибки возникает, когда вы передаете неверный тип объекта вызову, поэтому я предположил, что переменная objectStore на самом деле не является строкой.

На основании исключения this.db не является неопределенным (иначе это приведет к ошибке транзакции), транзакция является функцией (иначе она вызовет не-функциональный вызов).Поэтому я должен догадаться, что this.dbTransaction.READ_WRITE должен возвращать 1 просто отлично (дважды проверьте это).

Поэтому я сильно подозреваю, что это ваш третий параметр, вызывающий проблемы.Я совершенно уверен, что никогда не использовал 3-й параметр, показанный в спецификации (необязательно timeout ), и считаю, что в этом нет необходимости, поскольку время ожидания по умолчанию уже равно 0 (неопределенно).Можете ли вы попробовать изменить эту строку на следующую и посмотреть, работает ли она?

транзакция = this.db.transaction ([objectStore], this.dbTransaction.READ_WRITE);

ОБНОВЛЕНИЕ: обратите внимание, что константы версии теперь устарели.Вместо этих числовых значений вам нужно передать строку: readwrite, readonly или versionchange.

...