【发布时间】:2014-07-21 22:41:47
【问题描述】:
我有一个包含 Angular/Express/Node/Passport 的网站,我正在尝试将它们放在一起。我正在设置角度来观察$rootScope.currentUser 变量,这里有一些代码:
app.run(function ($rootScope, $location, Auth) {
//watching the value of the currentUser variable.
$rootScope.$watch('currentUser', function(currentUser) {
// if no currentUser and on a page that requires authorization then try to update it
// will trigger 401s if user does not have a valid session
if (!currentUser && (['/', '/login', '/logout', '/signup'].indexOf($location.path()) == -1 )) {
Auth.currentUser();
}
});
// On catching 401 errors, redirect to the login page.
$rootScope.$on('event:auth-loginRequired', function() {
//console.log(currentUser);
$location.path('/login');
return false;
});
});
使用控制台消息,我已经确定当我从个人资料页面(登录后)转到设置页面(您可以在其中更改密码)时,$rootScope.currentUser 不可用 - 因为当currentUser 被观看时(上) - 它执行 Auth.currentUser() 函数 - 并被拒绝,因为 $rootScope.currentUser 为空。
这里还有一些可能相关的代码:
Auth.js(Auth.currentUser() 所在的位置)
'use strict';
angular.module('groundup')
.factory('Auth', function Auth($location, $rootScope, Session, User, $cookieStore) {
$rootScope.currentUser = $cookieStore.get('user') || null;
$cookieStore.remove('user');
$rootScope.currentUserSignedIn;
return {
login: function(provider, user, callback) {
var cb = callback || angular.noop;
//console.log(user);
Session.save({
//provider: provider,
username: user.username,
password: user.password,
//rememberMe: user.rememberMe
}, function(user) {
console.log(user);
$rootScope.currentUser = user;
$rootScope.currentUserSignedIn = true;
console.log($rootScope.currentUser);
$location.path('/profile');
return cb();
}, function(err) {
console.log(err);
return cb(err.data);
});
},
logout: function(callback) {
var cb = callback || angular.noop;
Session.delete(function(res) {
$rootScope.currentUser = null;
$rootScope.currentUserSignedIn = false;
console.log($rootScope.currentUser);
return cb();
},
function(err) {
return cb(err.data);
});
},
createUser: function(userinfo, callback) {
var cb = callback || angular.noop;
console.log(userinfo);
User.save(userinfo,
function(user) {
$rootScope.currentUser = user;
$rootScope.currentUserSignedIn = true;
console.log($rootScope.currentUser);
$location.path('/profile');
return cb();
}
);
},
currentUser: function() {
Session.get(function(user) {
console.log(user);
$rootScope.currentUser = user;
});
},
changePassword: function(oldPassword, newPassword, callback) {
var cb = callback || angular.noop;
return User.update({
oldPassword: oldPassword,
newPassword: newPassword
}, function(user) {
return cb(user);
$location.path('/');
}, function(err) {
return cb(err);
}).$promise;
},
removeUser: function(email, password, callback) {
var cb = callback || angular.noop;
User.delete({
email: email,
password: password
}, function(user) {
console.log(user + 'removed');
return cb();
}, function(err) {
return cb(err.data);
});
}
};
})
在Auth.currentUser()之后,它做了一个get请求,从express端执行这个函数:
exports.session = function (req, res) {
console.log(req.user.user_info + " in session function");
res.json(req.user.user_info);
};
问题在于重定向到 /settings 页面 - 因为 $rootScope.currentUser 正在被监视,它会自动重定向到 /login 因为 Auth.currentUser() 在某处失败。任何帮助将不胜感激 - 谢谢(看看 $cookieStore 在 Auth.js 中的使用方式 - 我不确定它是如何工作的)。
【问题讨论】:
标签: javascript angularjs session authentication get