【问题标题】:$resource delete function not working as expected?$resource 删除功能没有按预期工作?
【发布时间】:2015-02-23 01:12:49
【问题描述】:

我在 Angular 中构建了一个简单的应用程序,使用了我自己使用 Laravel 创建的一个简单 API。该应用程序托管在here。 API 托管在here。现在我可以登录到应用程序,此时 API 返回一个简单的 auth_token,它作为 URL 参数在每个发送到服务器的后续请求中发送。

系统中只有一个用户:

Email: admin@admin.com
Password: admin12345

您可以使用这些凭据登录应用程序,此时应用程序将使用$cookieStore 服务设置一个 cookie,并将此 cookie 中的令牌用于每个后续请求。使用该应用程序后,用户可以从该应用程序注销,其中向服务器发送DELETE 请求,并在成功方法上从浏览器中删除cookie。

不幸的是,我认为代码存在一些问题。 DELETE 请求按预期工作,它删除服务器上的 auth_token 并返回 200 OK。但是没有调用success方法。我不确定我做错了什么。这可能只是语法问题。

app.js

function AppCtrl ($scope, $cookieStore, $location, Auth) {
  $scope.setActive = function (type) {
    $scope.destinationsActive = '';
    $scope.flightsActive = '';
    $scope.reservationsActive = '';

    $scope[type + 'Active'] = 'active';
  };

  $scope.authenticate = function (credentials) {
    Auth.save(credentials, function(data){
      $cookieStore.put('auth_token', data.auth_token);
      $scope.isLoggedIn = true;
      $location.path('destinations');
      $scope.message = null;
    }, function(data){
      $scope.message = "Email/Password combination incorrect!";
    });
  };

  $scope.logout = function () {
    //var auth_token = $cookieStore.get('auth_token');
    Auth.delete({
      'auth_token': $cookieStore.get('auth_token')
    }, function(data){
      $scope.isLoggedIn = false;
      $cookieStore.remove('auth_token');
    });

  };

  if($cookieStore.get('auth_token')){
    $scope.isLoggedIn = true;
  }else{
    $scope.isLoggedIn = false;
  }

}

当按下注销按钮时调用注销函数。我在这里做错了什么?

注意:由于某种原因,该应用程序无法在 Chrome 上运行(使用 Firefox)。如果您能对此有所了解,那将非常有帮助。

如果您想看看,这两个存储库都是公开的:

AngulAir 应用程序:http://gitlab.learningtechasia.com:8901/rohan0793/angulair.git

AngulAirAPI:http://gitlab.learningtechasia.com:8901/rohan0793/angulairapi.git

【问题讨论】:

  • 有 2 个文件未在 chrome 中加载。出现 404 错误。 angulair.rohanchhabra.in/js/controllers/login.js angulair.rohanchhabra.in/controller.js 这可能会导致问题..
  • 我知道。那是我不明白的。我的服务器上启用了 CORS。该网站在 Firefox 上运行并获取所有文件。
  • Mozilla 中的同样问题,我在开发者工具的网络选项卡中看到同样的错误
  • 我刚刚深入研究了您的项目,发现您的 git 存储库中缺少 ..controllers/login.js 和 controller.js ..

标签: javascript ajax angularjs cookies angular-resource


【解决方案1】:

这是你的解决方案

$scope.logout = function () {
    //var auth_token = $cookieStore.get('auth_token');
    Auth.delete(
    {'auth_token': $cookieStore.get('auth_token')}, // parameters
    {},//postData, which you don't need for this
    function(data){
      $scope.isLoggedIn = false;
      $cookieStore.remove('auth_token');
    },
    // error callback
    function (httpResponse) {
       // do what you want for error handling here
    }
  );  
  };

注意:->(以下几点解决了问题)

  1. 只有 $resource.delete API 中的第二个选项(postdata)丢失。如果 API 不需要它,我们应该将其作为空白 {}。
  2. 删除方法应该返回 204 状态码才能执行成功回调。

【讨论】:

  • 当我按下注销按钮时,由于某种原因没有调用成功方法。我尝试在其中插入alert('hello'),但它没有触发。
  • 折腾了一阵子,才发现服务端生成的响应码是200,但一般是在产生删除请求后才发送204。这就是为什么没有调用success方法并且导致从浏览器cookie中删除auth_token的问题。
  • 您可以编辑带有语法问题的答案并添加响应代码问题,我会接受。请将响应代码编辑保持为粗体,以便任何其他开发要使用的 API 的人在这里绊倒时都能理解。
  • 是的,因为我刚刚更正了 API 中的响应代码,这就是它起作用的原因。
  • 是的,我做到了。我在我的应用程序中使用您的代码。您纠正了我的语法问题。谢谢你。它仍然无法正常工作,因为响应代码没有触发成功方法。但是当我修复响应代码时,一切都到位了。这就是为什么我要求您在答案中添加这一点,以便其他有类似问题的人了解删除请求需要 204 才能触发成功方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
  • 2021-05-07
  • 2013-08-29
相关资源
最近更新 更多