2016-06-08 2 views
0

В настоящее время я работаю с 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, и ни одно из этих значений не сохраняется при успешном завершении.

ответ

0

Я нашел свою ошибку. Мне нужно было включить API геолокации, чтобы получить координаты пользователей. Затем я просто сохранил координаты в базе данных и использую гео-сервис mongo оттуда! Сейчас все работает отлично.

Смежные вопросы