令牌未定义 - MEAN Stack

时间:2015-08-29 21:33:48

标签: javascript angularjs token mean-stack

我一直在关注一本名为“平均机器”的书籍教程。它非常有用。我正在设置身份验证,无法弄清楚我得到的这个错误。

任何帮助将不胜感激!我似乎无法在其他任何地方找到答案。

错误:未定义令牌     在Object.authTokenFactory.setToken(authService.js:69)

authService.js:

angular.module('authService', [])

// ===================================================
// auth factory to login and get information
// inject $http for communicating with the API
// inject $q to return promise objects
// inject AuthToken to manage tokens
// ===================================================

.factory('Auth', function($http, $q, AuthToken) {
	// create auth factory obj
	var authFactory = {};
	// login user
	authFactory.login = function(username, password) {
		// return promise obj and its data
		return $http.post('/api/authenticate', {
			username: username,
			password: password
		})
		.success(function(data) {
			AuthToken.setToken(data.token);
			return data;
		});
	};
	
	// logout user by clearing token
	authFactory.logout = function() {
		AuthToken.setToken();
	};
	
	// check if user is logged in
	// checks for local token
	authFactory.isLoggedIn = function() {
		if (AuthToken.getToken())
			return true;
		else
			return false;
	};
	
	// get logged in user
	authFactory.getUser = function() {
		if (AuthToken.getToken())
			return $http.get('/api/me', { cache : true});
		else
			return $q.reject({ message : 'User has no token.'});
	};
	
	
	
	return authFactory;
})
// ===================================================
// factory for handling tokens
// inject $window to store token client-side
// 
// 
// ===================================================
.factory('AuthToken', function($window) {
	var authTokenFactory = {};
	
	// get token out of local storage
	authTokenFactory.getToken = function() {
		return $window.localStorage.getItem('token');
	};
	// function to set token or clear token
	 // if a token is passed, set the token
	 // if there is no token, clear it from local storage
	 authTokenFactory.setToken = function() {
		 if (token)
		 	$window.localStorage.setItem('token', token);
		else
			$window.localStorage.removeItem('token');
	 };
	
	return authTokenFactory;
})
// ===================================================
// application configuration to integrate token into requests
// ===================================================
.factory('AuthInterceptor', function($q, $location, AuthToken) {
	var interceptorFactory = {};
	
	// this will happen on all http requests
	interceptorFactory.request = function(config) {
		// grab token
		var token = AuthToken.getToken;
		// if token exists add it to the header as x-access-token
		if (token)
			config.headers['x-access-token'] = token;
			
			return config;
	};
	
	// happens on response errors
	interceptorFactory.responseError = function(response) {
		// if 403 from server
		if (response.status == 403) {
			AuthToken.setToken();
			$location.path('/login')
		}
		//return the errors from server as promise
		return $q.reject(response);
	};
	
	return interceptorFactory;
});

mainCtrl.js

angular.module('mainCtrl', [])
.controller('MainController', function($rootScope, $location, Auth) {
	var vm = this;
	
	// get info if a person is logged in
	vm.loggedIn = Auth.isLoggedIn();
	
	// check to see if user is logged in on every req
	$rootScope.$on('$routeChangeStart', function() {
		vm.loggedIn = Auth.isLoggedIn();
		
		// get user info on route change
		// Auth.getUser()
		// .success(function(data) {
		// 	vm.u = data;
		// });
		Auth.getUser().then(function (data) {
     		vm.user = data;
		},
		function (response) {
			// Handle case where user is not logged in
			// or http request fails
		});
	});
	
	// handle login form
	vm.doLogin = function () {
		vm.processing = true;
		// clear error
		vm.error = '';
		
		// call Auth.login() func
		Auth.login(vm.loginData.username, vm.loginData.password)
			.success(function(data) {
				vm.processing = false;
				//if a user logs in, redirect to users pg
				if (data.success)
					$location.path('/users');
				else 
					vm.error = data.message;
				
				
			});
	};
	
	// log out
	vm.doLogOut = function() {
		Auth.logout();
		vm.u = {};
		$location.path('/login');
	};
});

1 个答案:

答案 0 :(得分:0)

您收到的错误消息确实说明了一切。 token变量永远不会在authTokenFactory.setToken()中定义。

authTokenFactory.setToken = function(token) {  // Add this variable delcaration
    if (token)
        $window.localStorage.setItem('token', token);
    else
        $window.localStorage.removeItem('token');
    };
 }