2016-02-22 113 views
0

我正在學習MEAN堆棧,並且已經創建了一個REST API,它將檢查發佈到MongoDB中的集合。

給出我所定義的服務:

angular.module('myApp') 
    .constant('baseURL', 'http://localhost:8080/'); 

angular.module('myApp') 
    .service('addReviews', ['$resource', 'baseURL', function($resource, baseURL) { 

     this.getReviews = function() { 
      return $resource(baseURL+'reviews/', null, {'save': {method: 'POST'}}); 
     }; 
}]); 

現在,我打電話從我的控制器此服務:

angular.module('myApp', ['ngResource']) 
.controller('reviewController', ['$scope', 'addReviews', function($scope, addReviews) { 

    $scope.reviewSubmit = function() { 

     $scope.receivedReviews = false; 
     var review = { 
      // some data 
     }; 

     $scope.reviews = addReviews.getReviews().query(

      function(response) { 
       $scope.reviews = response; 
       $scope.receivedReviews = true; 
      }, 
      function(response) { 
       $scope.reviews = response; 
       // print error message 
      } 
     ); 
     console.log($scope.reviews); // showing empty array 
    }; 
}]); 

在routes.js,我已經配置了我的路線爲:

var Reviews = require('./models/reviews'); 
... 

app.post('/reviews', function(req, res) { 
     Reviews.create(req.body, function(err, post) { 
      if (err) { 
       return res.send(err); 
      } 
      return res.json(post); 
     }); 
    }); 

我想發表評論集合的新評論。但是,$ scope.reviews顯示一個空數組。我記錄了這些請求,並且它顯示GET請求正在/正在評論而不是POST。我想我應該使用save()而不是query(),但是我已經看到一些在線的教程,儘管在服務中使用了PUT/POST方法,但他們使用了query()。我很困惑。任何人都可以指出我如何將數據(var review)發佈到評論集合?

回答

0

在代碼的角度方面存在一些問題。 您希望使用$resource作爲與API通信的通用對象。它內置功能:

  • query:從給定的API端點
  • get獲取所有資源:單個資源,通常是通過指定資源的ID
  • save:後,與發送的對象在請求的正文中。 注意:您的$resource配置中不需要{'save': {method: 'POST'}},您可以免費獲得它。
  • removedelete:不言自明

所以你要設置你的評論像工廠(包括URL不變。):

angular.module('myApp', ['ngResource']) 
    .constant('baseURL', 'http://localhost:8080/') 
    .factory('Reviews', ['$resource', 'baseURL', function($resource, baseURL) { 

     return $resource(baseURL+'reviews/:id', {id: '@id'}); 

    }]); 

如果你想訪問所有保存評論在您的控制器,爲$scope.reviews,你會做這樣的事情:

angular.module('myApp') 
    .controller('reviewController', ['$scope', 'Reviews', function($scope, Reviews) { 

     // hit API endpoint to get all reviews 
     // will have to have app.get('/reviews', function(req, res) {...}) 
     // configured in your node code 

     Reviews.query(function(data) { 
      $scope.reviews = data; 
     }, function(error) { 
      console.log(error); 
     }); 

     // and if you want to take a user-written review, say $scope.userReview, 
     // from the view and save it to the database on click function submitReview()... 

     $scope.userReview = { 
      message: '', 
      createdTime: null 
     }; 

     //^not sure what your ReviewSchema looks like on the backend, but for example... 

     $scope.submitReview = function() { 
      if ($scope.userReview.message.length) { 
       $scope.userReview.createdTime = Date.now(); 
       Reviews.save($scope.userReview); 
       //^this will make POST request with the $scope.userReview object as the request body 
      } 
     }; 
    }]); 

你的後端廁所的創建方法很好。您發送的對象(或者可能只是字符串)必須與您的評論模式相匹配。您可能需要記錄請求正文,以確保您獲得期望的結果。

查看this short post on using $resource to interact with RESTful APIs和(稍微混淆)angular $resource docs,以獲取有關$ resource服務的更多信息。

希望這可以幫助你!

相關問題