Passport.js (FB、G+、Twitter) を含む Yeoman パッケージの Angular-Fullstack ジェネレーターを使用しています。
$stageChangeStart
アプリケーションの実行時のメイン イベントで、 の式$location.path('/login');
が何もしないという問題が発生しました。式呼び出しの前後にアラートが発生しますが、これはコードが安全に到達し、console.log
エラーがないことを意味します。
event.preventDefault();
ロケーション式の前に追加した後に発生しました:
.run(function ($rootScope, $location, Auth) {
// Redirect to login if route requires auth and you're not logged in
$rootScope.$on('$stateChangeStart', function (event, next) {
Auth.isLoggedInAsync(function(loggedIn) {
if (next.authenticate && !loggedIn) {
event.preventDefault();
// alerts here
$location.path('/login');
// alerts here as well
}
});
});
その preventDefault を追加した理由は、他の問題を解決しようとすることでした。
/home へのログインが成功した後のリダイレクト経由は完全に機能しますが、Grunt でプロジェクトをビルドしてリモート サーバーで実行すると、醜いコードでNODE_ENV=development
特定の呼び出しが表示されていても、その特定のリダイレクトは機能しなくなります$location.path('/home')
.
main.controller.js
ユーザーが認証された場合に /home にリダイレクトされるように、チェックインも行いました。
'use strict';
angular.module('fckyeah')
.controller('MainCtrl', function ($scope, $http, Auth, socket, $location) {
if (Auth.isLoggedIn()) {
$location.path('/home');
}
});
ログインに成功した後、発生するリダイレクトは LoginCtrl にあります。
'use strict';
angular.module('fckyeah')
.controller('LoginCtrl', function ($scope, Auth, $location, $window) {
$scope.user = {};
$scope.errors = {};
$scope.login = function(form) {
$scope.submitted = true;
if(form.$valid) {
Auth.login({
email: $scope.user.email,
password: $scope.user.password
})
.then( function() {
// Logged in, redirect to home
$location.path('/home');
})
.catch( function(err) {
$scope.errors.other = err.message;
});
}
};
$scope.loginOauth = function(provider) {
$window.location.href = '/auth/' + provider;
};
});
したがって、で実行するとNODE_ENV=production
、ログインに成功した後、/#_# またはそのようなものにリダイレクトされ、次に期待どおりの「ホーム」ではなく「メイン」ルートである「/」にリダイレクトされ、手動で/home に移動 - 動作します。
環境間で動作に違いがある理由と、 preventDefault が ngRouter の動作を完全に停止する理由を理解しようとしています。本番環境で同じ機能を提供できない開発環境に依存するのは危険です。
この場合のアドバイスに感謝します。