[英]How to automatically send user data to mongo DB
每當用戶連接到應用程序時,我都會使用socket.io廣播地理位置(緯度,經度),並在地圖上設置新的標記圖標。 如果日本的用戶連接,socket.io將向我發送他的職位,他也將收到我的職位。 問題是我不希望用戶收到遠方用戶的位置(並將我的位置發送給遠方用戶),而只是在預定半徑內(例如:20 km)。
mongo DB中的空間搜索似乎適合識別位於同一區域的用戶並將其分配給groupId。 將為具有相同groupId的用戶分配一個他們將收聽的公共socket.io通道。
為了實現我的夢想,我實際上是在嘗試將用戶信息與貓鼬一起推送到Mongo DB中。 問題是貓鼬在服務器中運行,而數據在客戶端中。
我已經定義了一個schema.js來構造數據庫,但是我對如何設置將客戶端數據與貓鼬鏈接的路由有些迷失了? 我知道貓鼬和客戶端都必須返回適當的JSON對象進行通信,並且可以使用model.save()
存儲數據。 很抱歉這個幼稚的問題,但是對此點的幫助將不勝感激。 謝謝。
編輯:
我最終使用socket.io通過send2DB
函數將用戶數據傳遞到服務器,但是我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');
});
});
我認為您通常走在正確的道路上。 以下是一些容易指出的問題:
push
方法從何而來? (您沒有任何數組) userId
成為帶引號的字符串'data.id'
,對嗎? 您是否只是想要該值,就像userId: data.id
? (因為您可能需要套接字data
對象中的值) 可以在貓鼬文檔中找到基礎知識。 。
socket.on('send2DB', function(data) {
var instance = new MyModel({userId: data.id, latitude: data.lat});
instance.save(function(err, instance) { /* callback */ });
});
最終,您可能希望為您的API函數增加一些安全性,而不僅僅是信任User.id是有效的和位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.