如何自动将用户数据发送到mongo DB

时间:2013-01-20 11:24:59

标签: javascript node.js mongodb express mongoose

每次用户连接到应用程序时,我都会使用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');
    });

});

1 个答案:

答案 0 :(得分:0)

我认为你一般都走在正确的道路上。以下是一些容易引起注意的问题:

  1. push方法的来源是哪里来的? (你没有任何阵列)
  2. 您是否只想在从客户端收到新数据时在MyModel的新实例上设置属性?
  3. 我认为当套接字检索send2DB数据时你会创建一个新的MyModel。然后,只需设置属性。
  4. 另外,您不想制作userId引用的字符串'data.id',对吗?不要像userId: data.id一样想要价值吗? (因为您可能需要套接字data对象中的值)
  5. 基础知识可以在猫鼬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是有效的和位置。