localstorage.getitem('key') 有时返回 null - 在反应应用程序中

Posted

技术标签:

【中文标题】localstorage.getitem(\'key\') 有时返回 null - 在反应应用程序中【英文标题】:localstorage.getitem('key') sometimes returns null - in a react applocalstorage.getitem('key') 有时返回 null - 在反应应用程序中 【发布时间】:2018-03-08 19:24:04 【问题描述】:

这是一个非常奇怪的问题!我正在尝试构建一个在localstorage 中设置JWT 令牌的登录表单。然后其他表单使用该令牌发布请求。我可以在我的console.log 中看到令牌,但有时(比如 5 次中有 3 次),当我设置 localstorage.getitem('idToken') 时,它显示为 null。当我从我的 loginUser() 函数中删除 console.log(idToken) 时,这种行为最为明显(actions.js 文件中的代码 - 如下所示)。我究竟做错了什么?我的应用是使用 React/Redux 构建的。

action.js

export function loginUser(creds) 

const data = querystring.stringify(_username: creds.username, _password: creds.password);

let config = 
    method: 'POST',
    headers:  'Content-Type':'application/x-www-form-urlencoded' ,
    body: data
;

return dispatch => 
    // We dispatch requestLogin to kickoff the call to the API
    dispatch(requestLogin(creds));

    return fetch(BASE_URL+'login_check', config)
        .then(response =>
            response.json().then(user => ( user, response ))
        ).then(( user, response ) =>  
            if (!response.ok) 
                // If there was a problem, we want to
                // dispatch the error condition
                dispatch(loginError(user.message));
                return Promise.reject(user)
             else 

                localStorage.setItem('idToken', user.token);
                let token = localStorage.getItem('idToken')
                console.log(token);
                // if I remove this log, my token is returned as null during post. 
                dispatch(receiveLogin(user));
            
        ).catch(err => console.log("Error: ", err))


这是我的 POST 请求:

import axios  from 'axios';
import BASE_URL from './middleware/api';
import reset from 'redux-form';

 let token = localStorage.getItem('idToken');
 const AuthStr = 'Bearer '.concat(token);

let headers =
headers:  'Content-Type':'application/json','Authorization' : AuthStr 
;

export default (async function showResults(values, dispatch) 
console.log(AuthStr);
axios.post(BASE_URL + 'human/new', values, headers)
    .then(function (response) 
        console.log(response);          
        alert("Your submit was successful");
        //dispatch(reset('wizard'));
    ).catch(function (error) 
        console.log(error.response);
        alert(error.response.statusText);
    );
 );

这个GET 请求每次都有效,顺便说一句:

getHouses = (e) =>  
    let token = localStorage.getItem('idToken') || null;
    const AuthStr = 'Bearer '.concat(token);
    axios.get(BASE_URL + 'household/list',  headers:  Authorization: AuthStr  ).then((response) =>
        
            let myData = response.data;

            let list = [];
            let key =[];
            for (let i = 0; i < myData._embedded.length; i++) 
                let embedded = myData._embedded[i];
                list.push(embedded.friendlyName);
                key.push(embedded.id);
            

            this.setState(data: list, key: key);

        )
        .catch((error) => 
            console.log('error' + error);
        );

我无计可施!请帮忙!

【问题讨论】:

【参考方案1】:

将您的令牌逻辑(即localStorage.getItem('idToken');)移动到导出的函数中,它应该可以工作

export default (async function showResults(values, dispatch) 
  let token = localStorage.getItem('idToken');
  const AuthStr = 'Bearer '.concat(token);

  let headers =
   headers:  'Content-Type':'application/json','Authorization' : AuthStr 
  
 ;
 axios.post(BASE_URL + 'human/new', values, headers)...

【讨论】:

如果我在函数之外设置它为什么不起作用?是因为async吗? @SamiaRuponti 这个解决方案对你有用吗?我会解释原因。【参考方案2】:

localStorage.setItem()是一个异步任务,有时你在setItem之后运行let token = localStorage.getItem('idToken')会失败,所以你得到一个null,所以请把getItem操作放在后面,试一试,它会不同:

setTimeout(function() 
    let token = localStorage.getItem('idToken');
    dispatch(receiveLogin(user));
, 50);

【讨论】:

【参考方案3】:

不会出现这样的情况:您在 localstorage 中设置了一个键值,然后它立即在下一行返回 null。

localStorage.setItem('idToken', user.token);
let token = localStorage.getItem('idToken');

仅当您的 user.token 值为 null 时才会发生这种情况。

也许这里的情况是你的 thennable 函数没有像这样将值返回给你的下一个 then:

....
.then(response =>
     // return response to your next then function
     // this will be passed to next then function as params
     return response.json();
).then(( user, response ) =>  
....

【讨论】:

以上是关于localstorage.getitem('key') 有时返回 null - 在反应应用程序中的主要内容,如果未能解决你的问题,请参考以下文章

localStorage的用法

localStorage - 使用 getItem/setItem 函数或直接访问对象?

localStorage,sessionStorage的使用

sessionStorage和localStorage的用法,不同点和相同点

sessionStorage localStorage

localStorage的存储获取删除操作