每次用户连接到应用程序时,我都会使用socket.io来广播地理位置(lat,lng)并在地图上设置新的标记图标。如果日本的用户连接,socket.io将向我发送他的位置,他也将收到我的职位。问题是我不希望用户接收位置(并且发送我的位置)远离用户,但仅在预定半径范围内(例如:20公里)。
mongo DB中的空间搜索似乎适合识别位于同一区域中的用户并将其分配给groupId。同一groupId的用户将被分配一个他们将听的公共socket.io频道。
为了让我的梦想成真,我实际上是尝试用mongoose将用户信息推送到Mongo DB中。问题是当数据在客户端时,mongoose在服务器中运行。
我已经定义了一个schema.js来构建数据库但是我对如何设置使用mongoose链接客户端数据的路由有点迷失?我知道mongoose和client都必须返回适当的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');
});
});
答案 0 :(得分:0)
我认为你一般都走在正确的道路上。以下是一些容易引起注意的问题:
push
方法的来源是哪里来的? (你没有任何阵列)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是有效的和位置。