chrome.storage.local.get возвращает неопределенное значение при запуске браузера, но только для определенного значения - PullRequest
0 голосов
/ 11 октября 2019

Я разрабатываю расширение Chrome, и внутри фонового скрипта во время запуска браузера я пытаюсь получить сохраненные переменные для обновления расширения. Это работает нормально в первый раз, однако, как только я получаю переменные, я затем вызываю сетевой скрипт, и когда этот файл пытается получить переменную, он перестает работать.

Фоновый скрипт:

chrome.storage.local.get(["accessToken", "fileId", "date"], (result) => {
            if(result.accessToken && result.fileId && result.date) {
                axios.defaults.headers.common["Authorization"] = "Bearer " + result.accessToken;

                getLastChanged(result.fileId)
                    .then(date => {
                        if(date !== result.date) {
                            getFile(result.fileId)
                                .then(file => {
                                    chrome.storage.local.set({links:file, date:date});
                                });
                        }
                    })
        });

Сетевой сценарий:

 chrome.storage.local.get(["refreshToken"], (result) => {
                if(result.refreshToken){
                    axios.post("https://oauth2.googleapis.com/token", {
                        refresh_token:result.refreshToken,
                        client_id:clientId.installed.client_id,
                        client_secret:clientId.installed.client_secret,
                        grant_type:"refresh_token"
                    }).then(res => {
                        axios.defaults.headers.common["Authorization"] = "Bearer " + res.data.accessToken;
                        chrome.storage.local.set({accessToken:res.data.access_token});
                        resolve();
                    }).catch(err => reject(err));
                }

                reject("no refresh token");
            });

Фоновый сценарий может получить эти три значения очень хорошо, но когда сетевой сценарий пытается получить токен обновления, он возвращает неопределенное значение. Когда я проверяю локальное хранилище, там есть токен обновления, и когда я открываю окно расширения, я запускаю точно такой же сетевой сценарий, чтобы проверить, обновлен ли он, и он работает нормально. Это только во время запуска браузера, и только с этим единственным значением, которое не работает.

Ответы [ 2 ]

2 голосов
/ 12 октября 2019

Проблема вызвана тем, что во время запуска Chrome запускает активную веб-страницу и сценарии ее содержимого перед запуском persistent background page (объявленной без "persistent": false в manifest.json), см. crbug.com / 314686 и crbug.com / 767844 .

Вы можете подождать, пока фоновая страница установит значение:

readOrWaitStorage('refreshToken').then(refreshToken => {
  axios.post('https://oauth2.googleapis.com/token', {
    refresh_token: refreshToken,
    // ......................
  });
});

function readOrWaitStorage(key) {
  return new Promise(resolve => {
    chrome.storage.local.get(key, data => {
      if (key in data) {
        resolve(data[key]);
        return;
      }
      chrome.storage.onChanged.addListener(function fn(changes) {
        if (key in changes) {
          chrome.storage.onChanged.removeListener(fn);
          resolve(changes[key].newValue);
        }
      });
    });
  });
}

Или вы можете переключиться на "persistent": false фоновый скрипт и использовать обмен сообщениями.

0 голосов
/ 11 октября 2019

Вам лучше получить доступ к localStorage из фонового скрипта, а не напрямую из скрипта контента. Либо используйте chrome.extension.getBackgroundPage, чтобы получить фоновый сценарий, а затем получите доступ к хранилищу, либо отправьте сообщение на background_script, чтобы получить необходимое значение, и верните его обратно в свой контентный («сетевой») сценарий. Как @wOxxOm предложил включить постоянный: false для фонового сценария

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...