"The keyPath option is not a valid key path" when trying to assign keyPath with variable

Viewed 709

I have some JSON which looks like this which is declared as a variable called "jsonObjSuper":

{
"Watchlist": "My Watchlist",
"Instruments": {
"instrument1": [
  "Company ABC",
  [
    {
      "snapshotTimeUTC": "2018-11-01T00:00:00",
      "snapshotTime": "2018/11/01 00:00:00"
    }
  ]
],
"instrument2": [
  "Company XYZ",
  [
    {
      "snapshotTimeUTC": "2018-11-01T00:00:00",
      "snapshotTime": "2018/11/01 00:00:00"
    }
  ]
]
}
}

I'm trying assign a keyPath for an IndexedDB using the "Watchlist" - code below:

request.onupgradeneeded = function(event) {
var db = event.target.result;
var key = jsonObjSuper["Watchlist"]
var objectStore = db.createObjectStore("instruments", { keyPath: key});
}

but when I try this, I get this error:

"Uncaught DOMException: Failed to execute 'createObjectStore' on 'IDBDatabase': The keyPath option is not a valid key path."

If I do a console.log on the "key" variable the value that pulls through is "My Watchlist" as expected.

I did also try to JSON.stringify the "key" variable to see if that made a difference but still got an error.

What could be causing it?

Many thanks

1 Answers

Given your code:

var key = jsonObjSuper["Watchlist"]
var objectStore = db.createObjectStore("instruments", { keyPath: key});

And the data definition:

jsonObjSuper = {
    "Watchlist": "My Watchlist",
    ...
}

You are effectively doing:

db.createObjectStore("instruments", { keyPath: "My Watchlist"});

"My Watchlist" is not a valid key path. A key path for an object store must be a string which is a valid JS identifier or a dot-separated sequence of identifiers or an empty string, or an array of one or more of the previous. (See https://w3c.github.io/IndexedDB/#key-path-construct for the precise definition.) So "My_Watchlist" would be valid, but "My Watchlist" is not.

Related