簡體   English   中英

如何自動將用戶數據發送到mongo DB

[英]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');
    });

});

我認為您通常走在正確的道路上。 以下是一些容易指出的問題:

  1. push方法從何而來? (您沒有任何數組)
  2. 當您從客戶端收到新數據時,您是否只是想在MyModel的新實例上設置屬性?
  3. 我認為當套接字檢索send2DB數據時,您將創建一個新的MyModel。 然后,只需設置屬性。
  4. 另外,您不想使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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM