You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AngularJS创建loginService时出现[$injector:unpr]错误求助

解决AngularJS Service中注入$scope导致的[$injector:unpr]错误

你碰到的这个[$injector:unpr]错误,本质原因很明确:AngularJS的Service是绝对不能注入$scope的。$scope是控制器(Controller)专属的依赖,用来管理视图与控制器之间的数据绑定,而Service作为全局单例服务,本身没有$scope的运行环境,强行注入会让依赖注入器找不到对应的提供者,直接抛出错误。

先看你代码里的两个核心问题:

  1. 在loginService的依赖里添加了$scope,这完全是多余的,也是触发错误的根源;
  2. $http.post返回的是Promise对象,你直接返回promise.data是无效的——异步请求未完成时,data属性根本不存在,必须通过Promise的then方法来获取响应数据。

给你修正后的完整代码:

App.service('loginService', function($http) { 
  this.login = function(user) { 
    var request = { 
      "user": user.id, 
      "password": user.pass 
    }; 
    // 返回Promise,调用方可以通过then获取异步返回的数据
    return $http.post("http://vlinux:9099/Authenticate", request)
      .then(function(response) {
        return response.data;
      }); 
  } 
});

在对应的控制器里,你可以这样调用这个服务(这里的$scope是控制器的依赖,完全合法):

App.controller('LoginController', function($scope, loginService) {
  $scope.user = {};
  $scope.handleLogin = function() {
    loginService.login($scope.user)
      .then(function(authData) {
        // 登录成功后的逻辑,比如存储用户信息、跳转页面
        console.log('认证成功', authData);
      })
      .catch(function(error) {
        // 处理登录失败的情况
        console.error('认证失败', error);
      });
  };
});

总结一下关键要点:

  • Service只负责封装业务逻辑和数据请求,不需要也不能依赖$scope
  • 异步请求必须通过Promise的链式调用处理结果,不能直接取未完成Promise的data属性

内容的提问来源于stack exchange,提问作者Soham Banerjee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:47:37