为什么在使用 torii 时在余烬中刷新后未定义会话服务



我正在使用Facebook登录我的应用程序。我能够成功完成登录,但是当我刷新页面时,session.isAuthenticate变得未定义。

我认为保留会话的逻辑保留在 torii-adapter 的获取方法中。下面是我的鸟居适配器,请告诉我缺少什么。

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
};
});
}
});

更新以下是我的路线代码

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 会话变量应该在配置文件中设置,如下所示:

// config/environment.js
var ENV = {
torii: {
sessionServiceName: 'session'
}

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

beforeModel: function() {
return this.get('session').fetch().catch(function() {});
},
let token = session.token;

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

let token = this.get('session.token')
// OR
this.get('session')['token']

我更喜欢第一个看起来更优雅的选项,至少对我来说是这样。

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

经过一些研究,我发现session.isAuthentication是未定义的,因为我的fetch方法没有被调用。多亏了@falke我才能让它运行。

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

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        
};
});
}

我能够使用以下代码在我的获取方法中找到它

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});
}

希望这会有所帮助

相关内容

最新更新