【问题标题】:passing data using AngularJS $http.get method使用 AngularJS $http.get 方法传递数据
【发布时间】:2015-07-23 23:10:02
【问题描述】:

我正在使用 MEAN 堆栈构建一个应用程序,该堆栈将利用从外部 API 检索到的数据。作为隐藏 API 密钥的一种措施,我想从服务器发出 API 请求,但是我在将搜索词从 Angular 前端传递到服务器时遇到问题。

下面的代码是 Angular 控制器的一部分,它应该使用搜索词将请求传递给服务器:

myApp.controller('mainController', ['$scope','$http', '$location', function($scope, $http, $location){
        $scope.submit = function(){
        $location.path('/results');
        $http({method: 'GET', url: '/makeSearch', data: {term: $scope.term} });
    }
}]);

然后以下服务器代码将使用body-parser 中间件解析请求:

app.get('/makeSearch', function(req, res) {
console.log("I received a command!");
console.log(req.body); });

但是,一旦我尝试从前端传递/提交搜索词,我在服务器控制台上只会得到一个空对象。关于我做错了什么的任何提示?任何帮助,将不胜感激。

【问题讨论】:

  • 为什么在更改位置后发送请求?

标签: javascript angularjs http express mean-stack


【解决方案1】:

我想通了! @Rikky 提出了一个很好的观点,即 http get 请求 (req.body) 的正文始终为空。因此,通过仅将req 记录到控制台,我了解了如何使用 GET 方法发送搜索词

在 AngularJS 控制器中的请求中使用 params 而不是 data,如下代码所示:

revApp.controller('mainController', ['$scope','$http', '$location', function($scope, $http, $location){

$scope.submit = function(){
    console.log($scope.term);
    $location.path('/results');
    $http({method: 'GET',
        url: '/makeSearch',
        params: {term: $scope.term}
    });
} }]);

在服务器上,记录req.query 而不是req.body,如下面的代码所示:

app.get('/makeSearch', function(req, res) {
console.log("I received a command!");
console.log(req.query); });

感谢大家的帮助!

【讨论】:

    【解决方案2】:

    你应该先了解一些http基础,然后你就会知道你在做什么,然后你就会知道如何正确地做:

    • 使用 HTTP GET 方法意味着查询数据,而不是发送数据。因此,带有 GET 方法的 HTTP 请求不会有正文,所以

      request.body

    永远是空的。

    • 如果您真的想向服务器发送一些数据,最好使用 POST

    • 如果您仍想通过 get 向服务器发送数据,使用查询字符串是最好的选择。你可以在thisquestion查看它

    • 如果您想通过 get 方法向服务器发送一些数据,但又不想使用查询字符串,则可以使用 http 标头而不是 http 正文进行一些 hack

    【讨论】:

      【解决方案3】:

      确保您的作用域中有一个 term 属性。

      myApp.controller('mainController', ['$scope','$http', '$location', function($scope, $http, $location){
      
              $scope.term ='';
      
              $scope.submit = function(){
                 $location.path('/results');
                  $http({method: 'GET', url: '/makeSearch', data: {term:    $scope.term} 
                  });
           }
      }]);
      

      确保你的 UI 有一个绑定到你范围的 term 属性的元素

      <input type="text" ng-model="term" />
      

      【讨论】:

      • $location.path('/results')'; 不会造成问题吗?因为它是在GET 之前执行的。
      • @Dayan,我已经注释掉了,但它仍然不起作用
      • @Shiyu,我已经将输入绑定到 term 属性,并且我还添加了 $scope.term = '' 但它仍然记录一个空对象。
      猜你喜欢
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多