64

I am trying to save a data object in chrome sync storage and then retrieve it, however the get() function always returns an empty object. The code I am using is,

function storeUserPrefs() {
  var key='myKey', testPrefs = {'val': 10};
  chrome.storage.sync.set({key: testPrefs}, function() {
    console.log('Saved', key, testPrefs);
  });
}

function getUserPrefs() {
  chrome.storage.sync.get('myKey', function (obj) {
    console.log('myKey', obj);
  });
}

Could someone please tell me what I am doing wrong here?

laike9m
  • 18,344
  • 20
  • 107
  • 140
source.rar
  • 8,002
  • 10
  • 50
  • 82
  • 9
    correct me if I am wrong, but with `{key: "something"}` JS creates an object with a property named 'key', not the value of the key variable declared before. You can only use a variable on the right side of the colon. See section 'Creating a Direct Instance' [here](http://www.w3schools.com/js/js_objects.asp) – Ivan Ferrer Villa May 31 '13 at 15:48

7 Answers7

86

The problem is with chrome.storage.sync.set({key: testPrefs}

Your data is stored as

{
    key: "{"val":10}"
}

So, your code chrome.storage.sync.get('myKey') return undefined\empty object.

Solution I

Use string "key" as your key

chrome.storage.sync.get("key", function (obj) {
    console.log(obj);
});

or

Solution II

Set data through "myKey" Key.

chrome.storage.sync.set({"myKey": testPrefs})

P.S : Don't forget chrome.storage.sync is permanent storage API, Use chrome.storage.sync.clear before any further testing to see changes

References

EDIT 1

Use this code to set variable value in Chrome.storage

function storeUserPrefs() {
    var key = "myKey",
        testPrefs = JSON.stringify({
            'val': 10
        });
    var jsonfile = {};
    jsonfile[key] = testPrefs;
    chrome.storage.sync.set(jsonfile, function () {
        console.log('Saved', key, testPrefs);
    });

}

It generates following Output

Object{
    myKey: "{"val":10}"
}
orschiro
  • 19,847
  • 19
  • 64
  • 95
Sudarshan
  • 18,140
  • 7
  • 53
  • 61
  • Thanks this works. So is there any way to use a string variable as a key in the set/get functions? – source.rar Jan 26 '13 at 07:59
  • 2
    @source.rar:Check My **EDIT #1**, in the listed way it is possible, hope this helps : – Sudarshan Jan 26 '13 at 09:53
  • 1
    None of these answers test for failure... quoting https://developer.chrome.com/extensions/storage: "Callback on success, or on failure (in which case runtime.lastError will be set)." – Mitch Jul 25 '15 at 09:09
29

A more fancy way to do it, and it handles errors as well:

const getStorageData = key =>
  new Promise((resolve, reject) =>
    chrome.storage.sync.get(key, result =>
      chrome.runtime.lastError
        ? reject(Error(chrome.runtime.lastError.message))
        : resolve(result)
    )
  )

const { data } = await getStorageData('data')


const setStorageData = data =>
  new Promise((resolve, reject) =>
    chrome.storage.sync.set(data, () =>
      chrome.runtime.lastError
        ? reject(Error(chrome.runtime.lastError.message))
        : resolve()
    )
  )

await setStorageData({ data: [someData] })
bde-maze
  • 299
  • 3
  • 3
13
function storeUserPrefs() {
    var key='myKey', testPrefs = {'val': 10};
    chrome.storage.sync.set({[key]: testPrefs}, function() {
      console.log('Saved', key, testPrefs);
    });
}

You could just force to evaluate the variable key using [key] when saving. That way is easy to set your keys dynamically. Hope that helps.

danieluy
  • 139
  • 1
  • 3
2

As chrome.storage.sync can storage JS objects, you can just do this:

var save = {};
save["myKey"] = testPrefs;

chrome.storage.sync.set(save, function() {
    console.log('Settings saved');
});
Eneas Gesing
  • 533
  • 7
  • 10
0
testPrefs = JSON.stringify({
            'val': 10
        });
    var jsonfile = {};
    jsonfile[key] = testPrefs;
    chrome.storage.sync.set(jsonfile, function () {
        console.log('Saved', key, testPrefs)
Jk1
  • 11,233
  • 9
  • 54
  • 64
0

By using WebExtension browser API Polyfill you can use promises and also use TS and code like below for set sync of chrome and get sync

function getStore() {
    return chrome.storage.sync.get("myKey").then(function (value) {
        return value["myKey"];
    });
}

function setStore() {
    return chrome.storage.sync.set("myKey","value").then(function (value) {
        return "Success!";
    });
}
Josh Correia
  • 3,807
  • 3
  • 33
  • 50
Goutham J.M
  • 1,726
  • 12
  • 25
0

as of then ECMA now got new syntac to simplify Your example

    function storeUserPrefs() {
    var key='myKey', testPrefs = {'val': 10};
        chrome.storage.sync.set({key: testPrefs}, function() {console.log('Saved', key, testPrefs);});
}

function getUserPrefs() {
    chrome.storage.sync.get('myKey', function ({myKey}) {
        console.log('myKey', obj);
    });
}

So now to get rid of object name You just need to destruct argument object and it will unwrap it. Hennce look this syntax:

let ob={a:"me",b:"and" ,c:"myself",d:"and", e:"eye", f:"o_O"}

function someFunction( {c,d,f} ){
 console.log( c,d,f)  //output:   myself and o_O
}
Bujaq
  • 69
  • 6