无法在React Native中使用从AsyncStorage / SecureStore返回的电子邮件和令牌?

时间:2019-04-04 00:57:51

标签: javascript react-native callback expo asyncstorage

我一直在寻找并回答我的问题,但似乎找不到类似的东西。 我的代码返回了预期的值!

我正在React-Native中构建一个应用程序,目前正在进行登录。我需要保存userId,userEmail和userToken,并使用AsyncStorage和Expo的SecureStore作为选项,但是我遇到了一个我从未见过的非常奇怪的问题。

我可以设置和读取所需的数据,但是当我尝试使用它时,它根本不起作用,但是当我对其进行硬编码时,它可以吗? (有点难以解释)。

这就是问题所在。为了便于阅读,我省略了其余代码,如果我对下面的值进行硬编码,它就可以正常工作。

    // Set the email and token
    // Before setting these, I logged the key's values and (of course), they were null
    // After setting them I logged them out again and they're set

/** from promise (no problems) **/

    SecureStore.setItemAsync('shifterEmail', responseJson.email);
    SecureStore.setItemAsync('shifterToken', responseJson.token);

/** returns response (no problems) **/

...同时,在页面的下方...

/** another function **/
    let shifterEmail = '';
    let shifterToken = '';

    SecureStore.getItemAsync('shifterEmail')
        .then((email) => {
            shifterEmail = email;
            console.log('API email: ', shifterEmail); // my@email.com <- good!
        })
        .catch((error) => {
            console.log('API email error: ', error);
        });

    SecureStore.getItemAsync('shifterToken')
        .then((token) => {
            shifterToken = token;
            console.log('API token: ', shifterToken); // random token <- good!
        })
        .catch((error) => {
            console.log('API token error: ', error);
        });

    return {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
        'Authorization': 'Token' +
        ' token=' + shifterToken + // WHAAAT <- doesn't work
        ', email=' + shifterEmail, // WHAAAT <- doesn't work
    };

我脑子里充满了头脑,虽然这可能是很好的旧异步性,并尝试将它们嵌套在回调中,但这没有什么区别。 我在这里显示了SecureStore的代码,但是与AsyncStorage相同,我可以获取电子邮件和令牌的期望值,但是它不起作用。

但是,这有点奇怪,我不明白...

如果我在回执中对令牌和电子邮件进行硬编码,那么就可以了!

头脑=炸毁

  • 我可以使用typeof来确保其为字符串。
  • 我已经尝试过JSON.stringify()JSON.parse()的设置和获取。
  • 我尝试设置并使其内联,并作为可调用函数。
  • 我尝试过嵌套回调,并让它们保持顺序。
  • 我什至尝试在返回值中添加超时,以确保所有设置均已设置。

...什么都不起作用:(

在旁边的注释中:这两个都是字符串,但是我对数字也有同样的问题,而让它起作用的唯一方法是带来“ get”(来自两个AsyncStorage和SecureStore)从其可调用函数中删除,并内嵌代码。 另外,如果我没有保存电子邮件和令牌,而只是将其添加到变量中并在返回中使用它,那么它就可以正常工作,但这并不好,因为用户每次打开应用程序时都必须登录。

完全困惑。很高兴回答任何问题,我已经尝试了很多尝试,因此我们可以进行良好的旧聊天,或者,如果您可以提出其他处理登录的方法,我也很乐意听到!

为什么值正确时为什么不能使用该值,但是可以对同一内容进行硬编码?

谢谢!

3 个答案:

答案 0 :(得分:0)

上面的代码异步运行,因此,尚未设置return语句中的下面的代码。

您尚未发布整个函数,但是return语句可能无法在此处运行,并且您需要传递回调函数。

const doSomethingWithLogin = headers =>
  console.log(headers)
  
Promise.all([
  SecureStore.getItemAsync('shifterEmail'),
  SecureStore.getItemAsync('shifterToken')  
])
  .then(([shifterEmail, shifterToken]) =>
    Promise.resolve({
      'Accept': 'application/json',
      'Content-Type': 'application/json',
      'Authorization': 'Token' +
      ' token=' + shifterToken + 
      ', email=' + shifterEmail,
    })
  )
  .then(doSomethingWithLogin)

答案 1 :(得分:0)

似乎是一个异步问题。根据您提供的代码片段,return语句可能在调用Traceback (most recent call last): File "extract1.py", line 11, in <module> tree = etree.fromstring(html) File "src\lxml\etree.pyx", line 3222, in lxml.etree.fromstring File "src\lxml\parser.pxi", line 1877, in lxml.etree._parseMemoryDocument File "src\lxml\parser.pxi", line 1765, in lxml.etree._parseDoc File "src\lxml\parser.pxi", line 1127, in lxml.etree._BaseParser._parseDoc File "src\lxml\parser.pxi", line 601, in lxml.etree._ParserContext._handleParseResultDoc File "src\lxml\parser.pxi", line 711, in lxml.etree._handleParseResult File "src\lxml\parser.pxi", line 640, in lxml.etree._raiseParseError File "<string>", line 42 lxml.etree.XMLSyntaxError: Opening and ending tag mismatch: meta line 24 and head, line 42, column 8 回调之前运行。

一个简单的解决方法是使用.thenasync/await

例如:

异步/等待

Promise.all

Promise.all

const getToken = async () => {
    try{
      const email = await SecureStore.getItemAsync('shifterEmail')
      const token = await SecureStore.getItemAsync('shifterToken')

      return {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
        'Authorization': 'Token' +
        ' token=' + token + 
        ', email=' + email
      };
    } catch(error) {
      console.error(error);
      throw error;
    }
 }

答案 2 :(得分:0)

确实是个老问题,但我遇到了同样的问题,并认为我知道答案。

从存储中获取令牌后,执行以下操作:

'token=' + token 实际结果是: token="sadfaswerw" 换句话说,由于某种原因,令牌用引号引起来。 足以简单地替换引号,但有点奇怪。