提供者 'kk' 必须 return 来自 $get 工厂方法的值
Provider 'kk' must return a value from $get factory method
一年半前,我写了一个 angular 应用程序,它使用这个 authSrv
在我的后端使用 API 登录和注销用户,它运行良好。我只是再次尝试 运行 相同的代码,我得到了 Error: [$injector:undef] Provider 'authSrv' must return a value from $get factory method.
这是我的authSrv
(出厂)代码:
app.factory('authSrv', function ($rootScope, $http, $auth, $state, config, $q) {
var deferred = $q.defer();
this.login = function (email, password) {
// Show loading dialog
$rootScope.showLoading();
var credentials = {
email: email,
password: password
};
return $auth.login(credentials)
.then(
function (result) {
$http.get(config.server + 'restricted/user')
.then(function (response) {
// Stringify the returned data to prepare it
// to go into local storage
var user = JSON.stringify(response.data.user);
// Set the stringified user data into local storage
localStorage.setItem('user', user);
// The user's authenticated state gets flipped to
// true so we can now show parts of the UI that rely
// on the user being logged in
$rootScope.auth = true;
// Putting the user's data on $rootScope allows
// us to access it anywhere across the app
$rootScope.currentUser = response.data.user;
// Remove loading dialog
$rootScope.hideLoading();
// Everything worked out so we can now redirect to
// the users state to view the data
$state.go('app.artists');
deferred.resolve(response.data.user);
// promise is returned
return deferred.promise;
});
},
function (error) {
// the following line rejects the promise
deferred.reject(error);
// Remove loading dialog
$rootScope.hideLoading();
// promise is returned
return deferred.promise;
});
};
this.logout = function () {
// Show loading dialog
$rootScope.showLoading();
$auth.logout().then(function () {
// Remove the authenticated user from local storage
localStorage.removeItem('user');
// Flip authenticated to false so that we no longer
// show UI elements dependant on the user being logged in
$rootScope.auth = false;
// Remove the current user info from rootscope
$rootScope.currentUser = null;
$state.go('app.auth').then(function () {
// Remove loading dialog
$rootScope.hideLoading();
});
});
};
});
为什么我现在得到错误而不是那时?有什么变化吗?
您应该使用 app.service()
,而不是 app.factory()
。工厂是一个应该创建和 return 服务实例的函数。您的函数是一个构造函数,它初始化 this
。这就是 service()
的目的。
一年半前,我写了一个 angular 应用程序,它使用这个 authSrv
在我的后端使用 API 登录和注销用户,它运行良好。我只是再次尝试 运行 相同的代码,我得到了 Error: [$injector:undef] Provider 'authSrv' must return a value from $get factory method.
这是我的authSrv
(出厂)代码:
app.factory('authSrv', function ($rootScope, $http, $auth, $state, config, $q) {
var deferred = $q.defer();
this.login = function (email, password) {
// Show loading dialog
$rootScope.showLoading();
var credentials = {
email: email,
password: password
};
return $auth.login(credentials)
.then(
function (result) {
$http.get(config.server + 'restricted/user')
.then(function (response) {
// Stringify the returned data to prepare it
// to go into local storage
var user = JSON.stringify(response.data.user);
// Set the stringified user data into local storage
localStorage.setItem('user', user);
// The user's authenticated state gets flipped to
// true so we can now show parts of the UI that rely
// on the user being logged in
$rootScope.auth = true;
// Putting the user's data on $rootScope allows
// us to access it anywhere across the app
$rootScope.currentUser = response.data.user;
// Remove loading dialog
$rootScope.hideLoading();
// Everything worked out so we can now redirect to
// the users state to view the data
$state.go('app.artists');
deferred.resolve(response.data.user);
// promise is returned
return deferred.promise;
});
},
function (error) {
// the following line rejects the promise
deferred.reject(error);
// Remove loading dialog
$rootScope.hideLoading();
// promise is returned
return deferred.promise;
});
};
this.logout = function () {
// Show loading dialog
$rootScope.showLoading();
$auth.logout().then(function () {
// Remove the authenticated user from local storage
localStorage.removeItem('user');
// Flip authenticated to false so that we no longer
// show UI elements dependant on the user being logged in
$rootScope.auth = false;
// Remove the current user info from rootscope
$rootScope.currentUser = null;
$state.go('app.auth').then(function () {
// Remove loading dialog
$rootScope.hideLoading();
});
});
};
});
为什么我现在得到错误而不是那时?有什么变化吗?
您应该使用 app.service()
,而不是 app.factory()
。工厂是一个应该创建和 return 服务实例的函数。您的函数是一个构造函数,它初始化 this
。这就是 service()
的目的。