0

私はsocket.ioを使用してジオロケーション(lat、lng)をブロードキャストし、ユーザーがアプリに接続するたびに地図上に新しいマーカーアイコンを設定します。日本のユーザーが接続すると、socket.ioから自分のポジションが送信され、私のポジションも受信されます。問題は、ユーザーが遠くにいるユーザーの位置を受信したくない(そして自分の位置を送信したくない)が、事前定義された半径(例:20 km)内にあることです。

mongo DB内の空間検索は、同じエリアにいるユーザーを識別し、それらをgroupIdに割り当てるのに適切なようです。同じgroupIdのユーザーには、リッスンする共通のsocket.ioチャネルが割り当てられます。

私の夢を実現するために、私は実際にユーザー情報をmongooseを使用してMongoDBにプッシュしようとしています。問題は、データがクライアントにあるときにマングースがサーバーで実行されることです。

データベースを構造化するためにschema.jsを定義しましたが、クライアントデータをマングースとリンクするルートを設定する方法に少し迷っていますか?私は、マングースとクライアントの両方が通信するために適切な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'`

配列の問題のようですが、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');
    });

});
4

1 に答える 1

0

おおむね正しい道を進んでいると思います。簡単に指摘できるいくつかの問題を以下に示します。

  1. pushメソッドはどこから来たのですか?(配列はありません)
  2. クライアントから新しいデータを受け取ったときに、MyModel の新しいインスタンスにプロパティを設定したいだけではありませんか?
  3. ソケットが send2DB データを取得するときに、新しい MyModel を作成すると思います。次に、プロパティを設定するだけです。
  4. また、userId引用符'data.id'で囲まれた文字列を作成したくないですね。と同じように、値が必要なだけではありませんuserId: data.idか? (おそらくソケットdataオブジェクトからの値が必要なため)

基本は mongoose docsにあります。.

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

最終的には、User.id が有効であることや場所を信頼するだけでなく、API 関数に何らかのセキュリティなどを追加することをお勧めします。

于 2013-01-20T15:59:23.560 に答える