2016-03-24 8 views
1

Devilsを認証に使用するRailsバックエンドを使用してEmber 1.13.8のアプリケーションを開発中です。 auth。livereload中にセッションを復元する前にember-simple-authでエラーが発生しました

アップグレードパスガイドhttp://simplabs.com/blog/2015/11/27/updating-to-ember-simple-auth-1.0.htmlをよく見てきました。私は、コードの更新を保存するとき、livereloadではなく、特定のページをリロードする次のエラーが発生することを除いてすべては、以前のように働いている:

ember.debug.js:24180 Error while processing route: users.index Error: Assertion Failed: You may not pass undefined as id to the store's find method

私はオーセンティケータのrestore()メソッドが呼び出される前にエラーが発生していることに気づきます。

リロードルートから呼び出されたときにエラーが発生するプロパティ(currentUserId)は、セッションサービス(簡略)の拡張である:

import Ember from 'ember'; 
import SessionService from 'ember-simple-auth/services/session'; 

export default SessionService.extend({ 
    session: Ember.inject.service('session'), 
    store: Ember.inject.service(), 

    currentUserId: Ember.computed('session.content.authenticated.user.id', function() { 
    var sessionUserId = this.get('session.content.authenticated.user.id'); 
    if (!Ember.isEmpty(sessionUserId)) { 
     return this.get('session.content.authenticated.user.id'); 
    } 
    }).property('sessionUserId'), 

}); 

コンソールログはcurrentUserIdプロパティにthis.get('session.isAuthenticated')falseであることを示し、そのthis.get('session.data.authenticated'){}です。

私はこれを試しているルートにAuthenticatedRouteMixinを組み込みましたが、問題は解決しません。ここで

は私のカスタム認証である:

import Ember from 'ember'; 
import DeviseAuthenticator from 'ember-simple-auth/authenticators/devise'; 
import ENV from '../config/environment'; 
import sha1 from 'npm:sha1'; 

export default DeviseAuthenticator.extend({ 
    store: Ember.inject.service(), 

    tokenAttributeName: 'auth_token', 
    identificationAttributeName: 'email', 
    resourceName: 'user', 

    authenticate: function(credentials) { 
    var _this = this; 

    this.get('session') 
     .set('currentUserPassword', sha1(credentials.password)); 
    let promise = new Ember.RSVP.Promise(function(resolve, reject) { 
     _this.makeRequest(credentials).then(function(response) { 
     Ember.run(function() { 
      resolve(response); 
     }); 
     }, function(xhr, status, error) { 
       var response = xhr.responseText; 
       Ember.run(function() { 
        reject(response); 
       }); 
     }); 
    }); 
     return promise; 
    }, 

    restore: function(data) { 
    console.log("Trying to restore; data: "); 
    console.log(data); 
    return new Ember.RSVP.Promise(function(resolve, reject) { 
     if (!Ember.isEmpty(data.auth_token)) { 
     resolve(data); 
     } else { 
     reject(); 
     } 
    }); 
    }, 

    invalidate: function() { 
    console.log('invalidate...'); 
    return Ember.RSVP.resolve(); 
    }, 

    makeRequest: function(credentials) { 
    var uuid = "abc123"; 

    if(typeof(window.device) !== 'undefined') { 
     uuid = window.device.uuid; 
    } 

    return Ember.$.ajax({ 
     type: 'POST', 
     dataType: 'json', 
     url: ENV.apiHost + '/api/v1/users/sign_in', 
     data: { 
     "user": { 
      "email": credentials.identification, 
      "password": credentials.password, 
     }, 
     "device": { 
      "uuid": uuid 
     } 
     } 
    }); 
    }, 
}); 

どのような変更私が代わりにすべてのコードを変更した後に再度ログインすることで、アップグレード後livereloadを修正するために作成する必要がありますか?

答えて

0

セッションサービスのcurrentUserIdは、現在のユーザーのIDが実際に存在する場合にのみそれを返します。これを使用してEmberデータストア経由で現在のユーザーレコードをロードすると、実際に存在するかどうかをチェックする必要があります。そうでなければ、表示されているエラーの原因となるundefinedを渡します。

+0

ありがとうございます。私は値が存在しないことを知っています(実際には 'this.get( 'session.data.authenticated')'はセッションサービス内の空のオブジェクトです)。しかし、アプリが価値を必要とするため、単にヌルチェックすることはできません。私にとっては、ember-simple-authが利用可能な場合(通常の状態でアプリが動作するように)内部セッションから取得し、そうでない場合はローカルストレージから復元しようとすることですサイトがリロードするときのように)。私はこれが意図された機能だと思うので、私は何を変更する必要があるのだろうかと思います。 –

+0

私は、セッションがauthenticatorで 'restore()'メソッドを呼び出すことによって復元されるべきであると考えていますが、復元メソッドは呼び出されていません。 –

関連する問題