0

每次用户连接到应用程序时,我使用 socket.io 来广播地理定位(lat、lng)并在地图上设置新的标记图标。如果日本的用户连接,socket.io 会将他的位置发送给我,他也会收到我的位置。问题是我不希望用户接收距离很远的用户的位置(并将我的位置发送给),但只能在预定义的半径内(例如:20 公里)。

mongo DB 中的空间搜索似乎适合识别位于同一区域的用户并将其分配给 groupId。相同 groupId 的用户将被分配一个他们将收听的公共 socket.io 频道。

为了实现我的梦想,我实际上是在尝试使用 mongoose 将用户信息推送到 Mongo DB 中。问题是猫鼬在服务器中运行,而数据在客户端。

我已经定义了一个 schema.js 来构建数据库,但是我对如何设置将客户端数据与 mongoose 链接的路由有点迷茫?我知道 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'`

这似乎是数组的问题,coords但我不明白为什么它也返回日期!这是代码:

应用程序.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);

服务器.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文档中找到。.

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

最终,您可能希望为您的 API 函数添加一些安全性等,而不仅仅是相信 User.id 是有效的和位置。

于 2013-01-20T15:59:23.560 回答