如何创建用户特定的MongoDB集合?

时间:2019-02-04 01:34:59

标签: javascript node.js mongodb express

我想这比一个特定的编码问题更像是一个过程性问题,但是我有一个节点应用程序,并且正在使用DHTMLX日历处理它。我希望每个用户都有针对其特定日历的事件的单独集合。

就我现在的实现方式而言,每个人都可以看到相同的日历并可以对其进行编辑。我想要每个用户都有自己的可编辑日历。我怎样才能做到这一点?我尝试使用req.user,但应用程序崩溃,提示未定义req。我对javascript很陌生,所以我做错了。

感谢您的帮助,谢谢!

这是我实现日历的app.js部分:

    var db = require('mongoskin').db("myAtlasClusterLink", { w: 0});
    db.bind('event');


    app.use(express.static(path.join(__dirname, 'public')));
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: true }));

    app.get('/init', function(req, res){
        db.event.insert({ 
            text:"My test event A", 
            start_date: new Date(2018,8,1),
            end_date:   new Date(2018,8,5)
        });
        db.event.insert({ 
            text:"My test event B", 
            start_date: new Date(2018,8,19),
            end_date:   new Date(2018,8,24)
        });
        db.event.insert({ 
            text:"Morning event", 
            start_date: new Date(2018,8,4,4,0),
            end_date:   new Date(2018,8,4,14,0)
        });
        db.event.insert({ 
            text:"One more test event", 
            start_date: new Date(2018,8,3),
            end_date:   new Date(2018,8,8),
            color: "#DD8616"
        });

        res.send("Test events were added to the database")
    });


    app.get('/data', function(req, res){
        db.event.find().toArray(function(err, data){
            //set id property for all records
            console.log(err);
            for (var i = 0; i < data.length; i++)
                data[i].id = data[i]._id;

            //output response
            res.send(data);
        });
    });


    app.post('/data', function(req, res){
        var data = req.body;
        var mode = data["!nativeeditor_status"];
        var sid = data.id;
        var tid = sid;

        delete data.id;
        delete data.gr_id;
        delete data["!nativeeditor_status"];


        function update_response(err, result){
            if (err)
                mode = "error";
            else if (mode == "inserted")
                tid = data._id;

            res.setHeader("Content-Type","application/json");
            res.send({action: mode, sid: sid, tid: tid});
        }

        if (mode == "updated")
            db.event.updateById( sid, data, update_response);
        else if (mode == "inserted")
            db.event.insert(data, update_response);
        else if (mode == "deleted")
            db.event.removeById( sid, update_response);
        else
            res.send("Not supported operation");
    });

2 个答案:

答案 0 :(得分:0)

我在这里看不到任何有关当前用户的代码。您需要服务器将用户与其他用户区分开(例如this package提供的内容)以及一组路由,UI以及客户端存储,供用户登录/注销并使用其当前会话的标识符发送请求。但这是一个完全不同的主题。

然后您可以:

  • 将所有事件存储在同一集合中,并添加一个字段,告知谁拥有哪个事件
  • 从每个日历的用户唯一数据(某些ID)中得出集合名称

在这里,我将所有内容存储在同一集合中,因为它们是相同的“种类”数据,当/如果您要在用户之间共享事件,将更容易扩充系统。

答案 1 :(得分:0)

首先,您应该考虑一种区分当前用户与其他用户的方法。有几种方法可以做到:

  • 仅使用请求正文中包含用户名或类似数据的字段,然后使用用户数据进行响应。
  • 使用password.js进行用户创建和身份验证(Easy Node Authentication),然后使用用户会话来了解谁在发送请求。基于此,您可以使用适当的数据进行响应。

无论哪种方式,您都需要更好的数据库架构来执行此操作。我建议为用户使用一个单独的集合,为日历数据使用另一个。然后在用户架构中引用日历数据。

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/MyDatabase');

const userSchema = new mongoose.Schema({
      username: String,
      calendars: {
          type: mongoose.Schema.Types.ObjectId, 
          ref: 'Calendar'
      },
    });

const CalendarSchema = new mongoose.Schema({
      // calendar data here
    });
const UserDetails = mongoose.model('User', userSchema );

只需确保在创建日历时,将其添加到相应的用户日历数组中即可:

Calendar.create(newCalendarDataObj, function(error, createdCalendar){

    User.findOne({username: usernameGotFromBody}, function(error, foundUser){

        foundUser.calendars.push(createdCalendar);
        foundUser.save();        
    }
});