2016-03-24 1 views
1

Je travaille sur une application dans Ember 1.13.8 avec un backend Rails qui utilise Devise pour l'authentification, et j'essaye de passer à braise-simple- auth.Ember applications erreurs avec ember-simple-auth avant de restaurer la session pendant le chargement du foie

J'ai suivi le guide de chemin de mise à niveau au http://simplabs.com/blog/2015/11/27/updating-to-ember-simple-auth-1.0.html aussi étroitement que je peux voir. Tout fonctionne comme avant, sauf que lorsque j'enregistre une mise à jour du code, livereload provoque l'erreur suivante au lieu de recharger certaines pages:

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

Je remarque que l'erreur se produit avant que la méthode restore() de l'authentificateur est appelée.

La propriété (currentUserId) qui provoque l'erreur lorsqu'elle est appelée à partir d'un itinéraire de rechargement est dans une extension du service de session (abrégé):

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'), 

}); 

journaux console montrent que, dans la propriété CurrentUserID this.get('session.isAuthenticated') est false et que this.get('session.data.authenticated') est {}.

J'ai inclus le AuthenticatedRouteMixin dans les routes que j'essaie et le problème persiste.

Voici mon authentificateur personnalisé:

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

Quels changements dois-je faire pour corriger livereload après la mise à niveau, au lieu d'avoir à se reconnecter après chaque changement de code?

Répondre

0

Le service de session currentUserId renvoie uniquement l'ID de l'utilisateur actuel lorsqu'il est réellement présent. Lorsque vous l'utilisez pour charger l'enregistrement utilisateur actuel via le magasin de données Ember, vous devez vérifier s'il est réellement présent, sinon vous passeriez undefined qui provoquerait l'erreur que vous voyez.

+0

Merci. Je sais que la valeur n'est pas présente (en fait 'this.get ('session.data.authenticated')' est un objet vide dans le service de session). Cependant, nous ne pouvons pas simplement l'annuler car l'application a besoin de la valeur pour fonctionner. Ce qui aurait du sens pour moi, c'est que ember-simple-auth puisse l'obtenir de la session interne si elle est disponible (pour que l'application fonctionne dans des conditions normales), et sinon essayer de la restaurer à partir du stockage local comme quand le site se recharge). Je crois que c'est la fonctionnalité prévue, donc je me demande ce que je dois changer. –

+0

J'imagine que la session devrait être restaurée en appelant la méthode 'restore()' dans l'authentificateur, mais la méthode de restauration n'est même pas appelée. –