2013-01-20 4 views
0

socket.io를 사용하여 위치 정보 (lat, lng)를 브로드 캐스팅하고 사용자가 앱에 연결할 때마다지도에 새 아이콘 아이콘을 설정합니다. 일본에있는 사용자가 연결하면 socket.io가 나에게 자신의 위치를 ​​보내고 내 위치도 받게됩니다. 문제는 사용자가 먼 거리에 있지만 사전 정의 된 반경 (예 : 20km) 내에있는 사용자의 위치를 ​​받고 (내 위치를 보냈 으면) 문제입니다.mongo DB에 사용자 데이터를 자동으로 보내는 방법

mongo DB 내의 공간 검색은 동일한 영역에있는 사용자를 식별하여 groupId에 할당하는 것이 적절할 것으로 보입니다. 같은 groupId의 사용자는 그들이 듣게 될 공통 socket.io 채널에 할당됩니다.

내 꿈을 이루기 위해 실제로 몽구스로 사용자 정보를 몽고 DB에 저장하려고합니다. 문제는 데이터가 클라이언트에있는 동안 서버에서 몽구스가 실행된다는 것입니다.

데이터베이스를 구조화하기 위해 schema.js를 정의했지만 클라이언트 데이터를 연결하는 경로를 설정하는 방법에 대해 약간 분실했습니다. mongoose와 클라이언트 모두 적절한 JSON 객체를 반환해야하며 데이터는 model.save()으로 저장 될 수 있음을 이해합니다. 이 순진한 질문에 대해 미안하지만 그 점에 도움을 많이 주시면 감사하겠습니다. 고맙습니다.

편집 :

마침내 socket.io가 send2DB 기능을 서버에 사용자 데이터를 전달하기 위해 사용하지만이 오류에 직면하고 있습니다 :

Object { _id: 50fc08aebb97d3201d000001, 
coords; [], 
date: Sun Jan 20 2013 16:18:34 GMT+0100 (Paris, Madrid) } has no methode 'push'` 

과 probelm 것 같다을 배열 coords하지만 나는 왜 그것도 날짜를 반환 이해가 안돼! 여기에 코드입니다 :

application.js :

// generate unique user id 
    var userId = Math.random().toString(16).substring(2,15); 

    // code here 
    onLocationfound = function(e){ 
     userMarker.setLatLng(e.latlng); 
     map.setView(userMarker.getLatLng(),map.getZoom()); 
     latitude = (e.latlng[0]||(Math.round(e.latlng.lat*1000)/1000)); 
     longitude = (e.latlng[1]||(Math.round(e.latlng.lng*1000)/1000)); 

    // send data to database (executed once) 
    sentData = {id: userId, coords: [{lat: latitude, lng: longitude}]} 
    socket.emit('send2DB', sentData); 

server.js :

mongoose.connect('mongodb://localhost/test'); 

var mongoose = require('mongoose') 
    , Schema = mongoose.Schema 
    , ObjectId = Schema.ObjectId; 

// create schema 
var userInformation = new Schema({ 
    username: { type: String, required: true, trim: true }, 
    email: { type: String, required: true, trim: true }, 
    role: { type: String, required: true, trim: true }, 
    date: {type: Date, default: Date.now}, 
    userId: String, 
    longitude: Number, 
    latitude: Number, 
    coords: [Number, Number] 
}); 

// export retrieve my model 

var MyModel = mongoose.model('ModelName', userInformation); 
var instance = new MyModel(); 

// code here 

io.sockets.on('connection', function (socket) { 

// code here 

// Store user data to DB then query spatial info // 
socket.on('send2DB', function (data) { 

    console.log('Position is', data); 
    instance.push(
     {userId: 'data.id'}, 
     {latitude: 'data.lat'} 
     ); 
    instance.save(function (err) { 
     if (!err) console.log('Success!') 
     else console.log('Error'); 
    }); 

}); 
+1

세션 또는 다른 토큰을 사용하여 특정 사용자를 추적하려면 socket.io 연결에 몇 가지 코드를 작성해야합니다. 그런 다음 새 데이터가 들어 오면 위치를 업데이트하기 위해 서버의 지리 정보가 포함 된 특정 이벤트에 대한 처리기를 작성합니다. 클라이언트 애플리케이션이 호출 할 API 레이어를 작성하는 중입니다. 클라이언트는 데이터베이스에 직접 호출하지 않아야합니다. – WiredPrairie

+0

새로운 코드와 결과로 내 게시물을 업데이트했습니다. 요약하려면 사용자의 위치를 ​​찾은 후에 데이터를 저장하려고합니다. 그런 다음 주변 공간에있는 사용자를 식별하기 위해 일부 공간 정보를 쿼리합니다. 내가 가진 오류를 좀 봐 주시겠습니까? 감사합니다. – floflo

답변

0

난 당신이 옳은 길을 일반적이라고 생각은. push 방법은

  1. 을에서왔다 : 여기에 몇 쉽게 언급 한 문제는? (배열이 없습니다.)
  2. 클라이언트에서 새 데이터를 받으면 MyModel의 새 인스턴스에 속성을 설정하고 싶지 않습니까?
  3. 소켓이 send2DB 데이터를 검색 할 때 새 MyModel을 만들 것이라고 생각합니다. 그런 다음 속성을 설정하기 만하면됩니다.
  4. 또한 userId의 인용 문자열 'data.id'을 만들고 싶지 않으십니까? 그냥 userId: data.id처럼 가치를 원하지 않습니까? (당신은 아마 소켓 data 객체의 값을 원하는대로)

기본 사항은 몽구스 docs에서 찾을 수 있습니다. .

socket.on('send2DB', function(data) { 
    var instance = new MyModel({userId: data.id, latitude: data.lat}); 
    instance.save(function(err, instance) { /* callback */ }); 
}); 

궁극적으로, 당신은 가능성이 API 함수에 몇 가지 보안 등을 추가하고 바로 User.id이 유효하고 위치는 것을 신뢰하지 싶어.

+0

WiredPrairie에 감사드립니다. 1. 당신 말이 맞아요. '푸시'가 여기에 적합하지 않습니다. 2. 그것은 내가 원하는 것입니다. 3. 지금 받았어. 4. 그건 내 실수 였어. 여러분이 제안 할 때'send2DB'가 호출되면 모델을 만듭니다. 'if (! err) console.log ('Success!') else console.log (instance);'오류가 발생하고 인스턴스가 정의되지 않았다는 것을 보여주십시오. Express 및 socket.io 세션에서 언급 한 보안을 추가해야합니까? tx – floflo

+0

@floflo 예, Express & socket.io 보안을 추가합니다. – WiredPrairie

+0

'function (err, instance)'에서 인스턴스 콜백을 추가하는 목적은 무엇입니까? 왜냐하면 그것 없이는 에러가 없다고보고하기 때문이다 :'instance.save (function (err) {if (err) {console.log (err);} else console.log (' ; ' – floflo

관련 문제