我正在构建地理位置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,对吧?我该如何获取最小和最大距离的值?
答案 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);
});
};
请注意,我们使用的是then
和catch
,而不是success
和error
,因为后者已被弃用并且存在问题行为。
在服务器端代码中,您可以使用请求的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 强>
快乐的编码!