mongoose:访问formData

时间:2017-08-18 06:08:47

标签: angularjs node.js express

我正在构建地理位置API,并且我尝试根据用户提交的最小和最大距离查询位置。但是,我无法在控制器中读取这些值。

我的意见:

exports.find_all_locations_near = function(req, res) {
  if (req.body.minDistance > 0) 
  {
    Location.find({
      geolocation:
        { 
          $near :
          {
              $geometry: { type: "Point",  coordinates: [ lat, lon ] },
              $minDistance: req.body.minDistance,
              $maxDistance: req.body.maxDistance
          }
        }
    }), function(err, location) {
      if (err) {
        //console.log(err);
        res.send(err);
      }
      else if (location =='')
        //res.json({ message: 'No location was found.' });
        res.json({ message: 'No location was found.' });
      else
      {
        res.json(location);
        res.json({ message: 'The end.' });
      }          
    };
  } else 
  {
    Location.find({}, function(err, location) {
      if (err)
        res.send(err);
      res.json(location);
      //res.json(req.body);
    });
  }  
}

我试过这个,把它发送给控制器:

{{1}}

在我的控制器上我有这个:

{{1}}

我认为我不能这样使用req.body,对吧?我该如何获取最小和最大距离的值?

2 个答案:

答案 0 :(得分:1)

GET请求不会有正文。

要传递搜索值,您可以使用查询字符串参数。

我们可以编写一个函数来轻松序列化一组命名值,以形成一个查询字符串以发送到我们的后端。

function withQuery(url, parameters) {
    const query = Object.keys(parameters)
        .map(function (key) {
            return key + '=' + parameters[key];
        })
        .join('&');

    return query.length
        ? url + '?' + query
        : url;
}

我们将在下面的修改后的搜索方法中利用此功能

$scope.searchLocations = function () {        
    const url = withQuery('api/places', {
        minDistance: $scope.minDistance,
        maxDistance: $scope.maxDistance
    });

    $http.get(url)
        .then(function (response) {
            $scope.searchLocations = response.data;
            //console.log($scope.formData.minDistance);
        })
        .catch(function (reason) {
            console.log('Error: ' + reason);
        });
};

请注意,我们使用的是thencatch,而不是successerror,因为后者已被弃用并且存在问题行为。

在服务器端代码中,您可以使用请求的query属性访问值

exports.find_all_locations_near = function(req, res) {
    const $minDistance = req.query.minDistance;
    const $maxDistance = req.query.maxDistance;

    if ($minDistance > 0) {
        Location.find({
            geolocation: { 
                $near: {
                    $geometry: {
                        type: "Point",
                        coordinates: [lat, lon]
                    },
                    $minDistance,
                    $maxDistance
                }
            }
        });
// ...
};

查询字符串参数以?开头,其格式为key=value,由&分隔。它们不需要声明为路由声明的一部分,并且将在传递给回调的query值的express.Request属性上隐式提供。

我们可以使用以下代码段验证此行为

app.use('/test', (req, res) => {
  res.send(Object.entries(req.query)
    .map(([key, value]) => `${key} ---> ${value}`)
    .join('<br>')
  );
});

并在我们的浏览器中导航到/test?x=1&y=hello,这将呈现

  

x ---&gt; 1

     

y ---&gt;喂

注意:虽然req.params值未填充查询参数,但可以使用查询参数名称调用req.param函数以获取其值。例如。 const id = req.param('id')。这使得API感觉不一致。

答案 1 :(得分:0)

向服务器发送值,请更改您的路由和$ http方法发布,否则会导致您的数据暴露给漏洞。

尝试尽可能隐藏数据。

如果您使用 GET 方法,那么您的数据将显示为参数,即网址

如果您使用 POST 方法,那么您的数据将进入 req.body

将控制器编辑为

$scope.searchLocations = function () {
   var data = {};

    data.minDistance = $scope.minDistance;
    data.maxDistance = $scope.maxDistance;
    $http.post('/api/places',data})
    .success(function(data) {
        $scope.searchLocations = data;
    })
    .error(function(data) {
        console.log('Error: ' + data);
    });
}

并在你的路线中替换你

app.get('/api/place') to app.post('/api/place')

然后你会得到 req.body.minDistance &amp;的 req.body.maxDistance

如果你想使用GET请求那么你的get方法将是

$http({
    url: /api/places, 
    method: "GET",
    params: data
 });

并从节点访问 req.params.minDistance &amp;的 req.params.maxDistance

快乐的编码!