首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在使用torii时成员刷新后没有定义会话服务

为什么在使用torii时成员刷新后没有定义会话服务
EN

Stack Overflow用户
提问于 2017-02-27 03:36:49
回答 3查看 285关注 0票数 0

我的应用程序是使用facebook登录的。我能够成功地完成登录,但是当我刷新页面时,session.isAuthenticate就变得没有定义了。

我认为持久化会话的逻辑停留在torii-适配器的获取方法中。下面是我的torii适配器,请告诉我缺少了什么.

代码语言:javascript
复制
import Ember from 'ember';
import {createToken} from 'myapp-new/utils/myapp-utils';
//import User from 'myapp-new/user/model';

export default Ember.Object.extend({
  store: Ember.inject.service(),
  session: Ember.inject.service('session'),
  fetch(){
    let token = session.token;
    if(Ember.isEmpty(token)){
      throw new Error("No session found");
    }
    else{
      return Ember.RSVP.resolve({token});
    }
  },

  open: function(authentication){
    let authorizationCode = authentication.authorizationCode;
    let token = createToken();
    let adapter = this;
    return new Ember.RSVP.Promise(function(resolve, reject){
      console.log(authentication);
      Ember.$.ajax({
        url: 'http://myapp.com/getUserInfoWuthAuthCode.php',
       //url:'http://localhost:4200',
        data: { 'code': authorizationCode,token:token},
        success: Ember.run.bind(null, resolve),
        error: Ember.run.bind(null, reject)
      });
    }).then(function(data){
      let user = data.user[0];

      return {
        token:token,
        user: user
      };
    });
  }
});

下面的更新是我路由的代码

代码语言:javascript
复制
import Ember from 'ember';

export default Ember.Route.extend({
    session: Ember.inject.service('session'),
    actions:{
        signIn(){
            console.log("Working");
            this.get('session').open('google-oauth2').then(function(){
                console.log("Login Worked");
            }, function(error){
                console.log('error', 'Could not sign you in: '+error.message);
            });
        }
    },
    setupController(controller, model){
        controller.set('session', this.session);
    }
});

我不使用任何组件,因此只在路由内挂钩会话。需要注意的一点是,我的torii适配器的fetch方法根本没有被调用(应该在刷新时调用它,不是吗?)

EN

回答 3

Stack Overflow用户

发布于 2017-02-27 09:14:40

应该在配置文件中设置Torii会话变量,如下所示:

代码语言:javascript
复制
// config/environment.js
var ENV = {
  torii: {
  sessionServiceName: 'session'
}

这将将服务变量注入到您的路由中。此外,每次刷新应用程序时,会话都会关闭,为了避免这种情况,请使用路由的beforeModel挂钩,如下所示:

代码语言:javascript
复制
beforeModel: function() {
  return this.get('session').fetch().catch(function() {});
},
票数 1
EN

Stack Overflow用户

发布于 2017-02-27 05:22:56

代码语言:javascript
复制
let token = session.token;

这将始终是未定义的(session对象未定义)。正确的方法是,

代码语言:javascript
复制
let token = this.get('session.token')
// OR
this.get('session')['token']

我更喜欢看上去更优雅的第一种选择,至少对我来说是这样。

票数 0
EN

Stack Overflow用户

发布于 2017-02-27 10:22:44

@Falke的回答很有帮助,但并没有解决我的问题。

经过一些研发之后,我发现session.isAuthenticated是以未定义的方式出现的,因为没有调用我的fetch方法。多亏了法尔克,我才能让它运行起来。

我将令牌存储在本地存储中,而不是在适配器的打开方法中使用下面的代码进行会话。

代码语言:javascript
复制
    open: function(authentication){
    let authorizationCode = authentication.authorizationCode;
    //let token = createToken();
   // let adapter = this;
    return new Ember.RSVP.Promise(function(resolve, reject){
      console.log(authentication);   
      resolve({authorizationCode});
    }).then(function(data){      
      localStorage.setItem('token',authorizationCode);
      return {
        token:authorizationCode        
      };
    });
  }

我能够在我的提取方法中找到它,使用下面的代码

代码语言:javascript
复制
fetch(){
    let token = localStorage.getItem('token');
    console.log(token);
    if(Ember.isEmpty(token)){
      throw new Error("No session found");
    }
    else{
      return Ember.RSVP.resolve({token});
    }

希望这能帮上忙

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42477427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档