我一直在寻找并回答我的问题,但似乎找不到类似的东西。 我的代码返回了预期的值!
我正在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)从其可调用函数中删除,并内嵌代码。 另外,如果我没有保存电子邮件和令牌,而只是将其添加到变量中并在返回中使用它,那么它就可以正常工作,但这并不好,因为用户每次打开应用程序时都必须登录。
完全困惑。很高兴回答任何问题,我已经尝试了很多尝试,因此我们可以进行良好的旧聊天,或者,如果您可以提出其他处理登录的方法,我也很乐意听到!
为什么值正确时为什么不能使用该值,但是可以对同一内容进行硬编码?
谢谢!
答案 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
回调之前运行。
一个简单的解决方法是使用.then
或async/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"
换句话说,由于某种原因,令牌用引号引起来。
足以简单地替换引号,但有点奇怪。