我正在尝试将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
不可用 - 因为当{{1观察(上图) - 它执行currentUser
函数 - 并被拒绝,因为Auth.currentUser()
为空。
以下是一些可能相关的代码:
Auth.js(其中$rootScope.currentUser
是
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);
});
}
};
})
之后,它执行get请求,从快递方执行此功能:
Auth.currentUser()
问题在于重定向到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.js中使用$ cookieStore - 我不确定这是如何工作的)。
答案 0 :(得分:1)
您的Auth.currentUser()
有些奇怪,请尝试将其更改为使用User
服务
currentUser: function () {
return User.get();
}
您的问题也可能来自cookie存储问题,Passport尝试将当前用户保存在其中但在某处失败(导致尝试访问未定义的var或其他内容)并在cookie中存储已损坏/空用户。 因此第一页正确加载,但当您的应用尝试访问Cookie时,它会中断。
我还建议你查看lib目录中的middleware.js
文件,看看cookie保存是否没有问题,比如你想把所有的用户对象都放到它而不仅仅是{{ 1}}。在这种情况下,您将需要修改一点userInfo
函数以输出整个用户。