В настоящее время я работаю с nodeJS, используя экспресс и mongoDB и mongoose для ORM. Когда я создаю пользователя и сохраняю его в базе данных, я хотел бы запросить их местоположение и сохранить его. Это то, что я сейчас делаю, у меня есть UserSchema и схема расположения.Mongoose, геопространственный запрос для пользователей
Моего userSchema только имеет место, хранящееся в виде строки и в самой у меня есть
var locationSchema = new mongoose.Schema({
name: String,
loc: {
type: [Number],
index: '2d'
}
});
mongoose.model('Location', LocationSchema);
, а затем в моем контроллере местоположения схемы, у меня есть следующие
import json from '../helpers/json;
import mongoose from 'mongoose';
var User = mongoose.model('User);
module.exports = function() {
var obj = {};
obj.create = function (req, res) {
var user = new User(req.body);
user.roles = ['authenticated']
user.location = getLocation(req);
user.save(function (err) {
if (err) {
return json.bad(err, res);
}
json.good({
record: user,
});
});
};
return obj;
function getLocation (req) {
var limit = req.query.limit || 10;
var maxDistance = req.query.distance || 1;
maxDistance /= 6371;
var coords = [];
coords[0] = req.query.longitude;
coords[1] = req.query.lattitude;
Location.findOne({
loc: {
$near: coords,
$maxDistance: maxDistance
}
}).limit(limit).exec(function (err, location) {
if (err) {
console.log(err);
}
return location.name;
});
}
};
Я также пробовал используя location.find вместо findOne и возвращающих местоположения [0] .name.
Ошибка брошена, говорит, что приведение числа к неудачному номеру не определено в loc.
Нужно ли отправлять данные о местоположении на сервер со стороны клиента? Если это так, есть ли лучший способ реализовать это? Я слышал о API-интерфейсе HTML5 Geolocation, но я никогда не использовал его.
Спасибо!
!!! -- ОБНОВИТЬ --- !!
Я начал использовать API геолокации на стороне клиента, чтобы отправить эти данные на сервер в запросе. Я использую угловой на стороне клиента, как так
(function() {
'use strict';
angular.module('opinionated.authentication')
.controller('SignupController', SignupController);
/* @ngInject */
function SignupController ($state, appUsers, appToast) {
var vm = this;
vm.reset = reset;
vm.create = create;
vm.user = {
name: '',
username: '',
email: '',
password: ''
};
vm.location = {
lattitude: '',
longitude: ''
};
function create = (isValid) {
if (isValid) {
var user = new appUsers.single({
name: vm.user.name,
username: vm.user.username,
email: vm.user.email,
password: vm.user.password,
lattitude: vm.location.lattitude,
longitutde: vm.location.longitude
});
user.$save(function (response) {
if (response.success) {
appToast('Welcome to Opinionated, ' + response.res.record.name);
$state.go('authentication.wizard')
} else {
appToast(response.res.messsage);
}
});
} else {
appToast('Hmm... Something seems to be missing');
}
}
function getPosition() {
navigator.geolocation.getPosition(updatePosition);
}
function updatePosition (position) {
vm.location.lattitude = position.coords.lattitude;
vm.location.longitutde = position.coords.longitude;
}
getPosition();
....
Я думаю, что это что-то делать с тем, как я получаю координаты в настоящее время. Мой браузер запрашивает у меня разрешение на использование моего местоположения, поэтому я, по крайней мере, запрашиваю данные. Тем не менее, я изменил свою схему пользователя, чтобы сохранить lat и long, и ни одно из этих значений не сохраняется при успешном завершении.