【问题标题】:Ember app errors with ember-simple-auth before restoring session during livereload在 livereload 期间恢复会话之前,使用 ember-simple-auth 的 Ember 应用程序错误
【发布时间】:2016-03-24 21:29:49
【问题描述】:

我正在使用 Ember 1.13.8 开发一个带有 Rails 后端的应用程序,该后端使用 Devise 进行身份验证,并且我正在尝试升级到 ember-simple-auth。

我已尽我所能遵循http://simplabs.com/blog/2015/11/27/updating-to-ember-simple-auth-1.0.html 的升级路径指南。一切都像以前一样工作,除了当我保存对代码的更新时,livereload 会导致以下错误,而不是重新加载某些页面:

ember.debug.js:24180 处理路由时出错:users.index 错误: 断言失败:您不能将 undefined 作为 id 传递给商店的 找方法

我注意到错误发生在身份验证器的 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')falsethis.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,而不是在每次代码更改后重新登录?

【问题讨论】:

    标签: ember.js ember-simple-auth


    【解决方案1】:

    会话服务的currentUserId 仅在实际存在时返回当前用户的 ID。当您使用它通过 Ember 数据存储加载当前用户记录时,您必须检查它是否实际存在,否则您将传递 undefined 这将导致您看到的错误。

    【讨论】:

    • 谢谢。我知道该值不存在(实际上this.get('session.data.authenticated') 是会话服务中的一个空对象)。但是,我们不能简单地对它进行空检查,因为应用程序需要该值才能工作。对我来说有意义的是 ember-simple-auth 如果可用(让应用程序在正常条件下工作)从内部会话中获取它,如果没有,则尝试从本地存储中恢复它(对于案例就像网站重新加载时一样)。我相信这是预期的功能,所以我想知道我需要更改什么。
    • 我想应该通过在身份验证器中调用restore()方法来恢复会话,但是甚至没有调用restore方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    相关资源
    最近更新 更多