gpt4 book ai didi

angularjs - getCurrentUser().role 在 DaftMonk/generator-angular-fullstack 中未定义

转载 作者:行者123 更新时间:2023-12-04 17:18:37 26 4
gpt4 key购买 nike

我们正在为项目使用 DaftMonk/AngularJS 全栈生成器。生成的代码包含管理用户(注册、登录、 Angular 色等)的逻辑,非常棒。但是,使用代码时存在问题,并且当前用户的 Angular 色有时未定义。

我们遇到了这个问题,因为我们想实现一个简单的功能:登录/注册后,用户应该被重定向到一个取决于他的 Angular 色的 URL。例如,'teacher'用户应该被重定向到 /teacherHome'student'用户应该被重定向到 /studentHome .因为 Auth.getCurrentUser().role 未定义,所以逻辑不起作用。

如何重现问题

要重现此问题,请编辑 client/app/account/login/login.controller.js文件并添加语句以记录 Auth.getCurrentUser().role 的值,如下所示:

...
if(form.$valid) {
Auth.login({
email: $scope.user.email,
password: $scope.user.password
})
.then( function() {
// Logged in, redirect to home
console.log("Current user role: " + Auth.getCurrentUser().role);
$location.path('/');
})
.catch( function(err) {
$scope.errors.other = err.message;
});
}
};
...

在测试这段代码的时候,你会发现这个阶段用户 Angular 色是未定义的。然而,稍后,它被分配了一个值。这表明该问题可能与异步 REST 调用有关。

最佳答案

实际上有几个相关的问题和解决方法。

解决方案一:使用提供的Auth.isLoggedInAsync功能

Auth 模块是生成代码的一部分,它提供了一种方法来检查登录过程是否已完成(并在这种情况下调用回调函数)。因此,解决此问题的一种方法是在客户端代码中使用此函数,如下所示:

  if(form.$valid) {
Auth.login({
email: $scope.user.email,
password: $scope.user.password
})
.then( function() {
// Logged in, redirect to home
console.log("Current user role: " + Auth.getCurrentUser().role);
Auth.isLoggedInAsync(function(success) {
console.log("Current user role: " + Auth.getCurrentUser().role);
});
$location.path('/');
})
.catch( function(err) {
$scope.errors.other = err.message;
});
}
};

在这种情况下,您将在控制台中看到两条语句。第一个将显示 Auth.getCurrentUser().role 仍未定义。第二个将表明它现在具有值(value)。因此,如果您有想要在登录时执行的逻辑并且取决于用户 Angular 色(或其他用户属性),请将此逻辑放在您传递给 Auth.isLoggedInAsync() 的回调函数中。 .

解决方案 2:修复 auth.service.js 中的根本原因

如果您查看 client/components/auth/auth.service.js 中的代码,您会看到异步代码存在问题。问题是 currentUser = User.get();触发异步 HTTP 调用,并且 currentUser没有立即设置(这是一个非阻塞调用)。由于 promise 立即得到解决,客户被引导相信登录过程已经完成并且所有用户数据都可用,而实际上它仍在飞行中。

在建议的修复中,promise 在传递给 User.get() 的回调函数中解决。 .
  /**
* Authenticate user and save token
*
* @param {Object} user - login info
* @param {Function} callback - optional
* @return {Promise}
*/
login: function (user, callback) {
var cb = callback || angular.noop;
var deferred = $q.defer();

$http.post('/auth/local', {
email: user.email,
password: user.password
}).
/* ORIGINAL CODE -- promise is resolved too early
success(function (data) {
$cookieStore.put('token', data.token);
currentUser = User.get();
deferred.resolve(data);
return cb();
}).
*/
/* PROPOSED FIX -- promise is resolved once HTTP call has returned */
success(function (data) {
$cookieStore.put('token', data.token);
currentUser = User.get(function() {
deferred.resolve(data);
return cb();
});
}).
error(function (err) {
this.logout();
deferred.reject(err);
return cb(err);
}.bind(this));

return deferred.promise;
},

相关问题和修复

提议的代码解决了一个问题。现在可以在成功登录后将用户重定向到特定页面。但是,在注册过程之后会出现类似的问题。在这种情况下, Auth.getCurrentUser().role有一段时间未定义(足够长以使重定向逻辑失败)。

在这种情况下,代码固定如下:
  /**
* Create a new user
*
* @param {Object} user - user info
* @param {Function} callback - optional
* @return {Promise}
*/
createUser: function (user, callback) {
var cb = callback || angular.noop;

/* ORIGINAL CODE ---------------------
return User.save(user,
function(data) {
$cookieStore.put('token', data.token);
currentUser = User.get();
return cb(user);
},
function(err) {
this.logout();
return cb(err);
}.bind(this)).$promise;
--------------------- */

/* PROPOSED FIX --------------------- */
var deferred = $q.defer();
User.save(user,
function (data) {
$cookieStore.put('token', data.token);
currentUser = User.get(function () {
console.log('User.save(), user role: ' + currentUser.role);
deferred.resolve(data);
return cb(currentUser);
});
},
function (err) {
this.logout();
return cb(err);
deferred.reject(err);
});
return deferred.promise;

},

关于angularjs - getCurrentUser().role 在 DaftMonk/generator-angular-fullstack 中未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27783014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com