开发者问题收集

从 sessionStorage.getItem() 获取 NULL 值 Angular 7

2019-07-02
2929

我创建了一项服务,在其中调用 API 来获取用户详细信息,并将收到的信息添加到 Session Storage 中,但是当我调用 sessionStorage.getItem('username') 时,响应中获取的是 null。

getUserDetail(email: string, password: string) {
        this.httpClient.get<User[]>('http://localhost/user/user_login?email=' + email + '&password=' + password).pipe(map(
            (user) => {
                return user;
            }

        )).subscribe(
            (user: User[]) => {
                if (user['isUser'] == true) {
                    sessionStorage.setItem('username', user['username']);
                    sessionStorage.setItem('userid', user['userid']);
                    sessionStorage.setItem('password', password);
                    sessionStorage.setItem('email', email);
                    this.router.navigate(['/homepage']);
                } else {
                    console.log(user['error']);
                    sessionStorage.setItem('login_error', user['error']);
                }
            }

        );
        console.log('User From Login: ' + sessionStorage.getItem('username'));
    }

我也在 environment 中设置了变量,在路由后也没有获取值,但是当我刷新页面时,我可以正确获取值。

environment.ts 文件代码。

export const environment = {
  production: false,
  baseURL: 'http://localhost/user/',
  credentialHeaders:
  {
    'email': sessionStorage.getItem('email'),
    'password': sessionStorage.getItem('password')
  }
};

当我在我的服务中调用此 api 时。

this.httpClient.get<List[]>(this.baseURL + 'data_list/get_all_list', { headers: environment.credentialHeaders })

我收到以下错误。

TypeError: Cannot read property 'length' of null

此错误针对标头。

3个回答

因为您在 setItem 之前先 getItem 。您的代码基本上执行了以下操作:

// send and asynchronous request here
        this.httpClient.get<User[]>(/* args */)
            .subscribe(/* stuff to be done AFTER request comes back,
                          including storing username in session storage */);

// and here we are outside the subscription, the line below gets executed in the same
// event loop tick that the request is sent, long before it comes back.
        console.log('User From Login: ' + sessionStorage.getItem('username'));
mbojko
2019-07-02

您正在通过调用 httpClient.get() 异步地从服务器请求数据,但是您尝试通过在调用返回之前检查 sessionStorage 来同步获取值:

console.log('User From Login: ' + sessionStorage.getItem('username'));

您应该将上面的行移到订阅方法内。

Alon Yampolski
2019-07-02

我之前使用 environment 来设置会话值,但它不起作用,我认为环境只加载一次,并且任何新值都不会在 environment 中初始化。

现在我在共享 Service 中设置我的值并在各处获取该值,现在它运行良好。

Anand agrawal
2019-07-03