Как создать пользовательские коллекции MongoDB? - PullRequest
0 голосов
/ 04 февраля 2019

Полагаю, это скорее процедурный вопрос, чем конкретный вопрос о кодировании, но у меня есть приложение для узла, и я использую календарь 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 голосов
/ 04 февраля 2019

Прежде всего вы должны подумать о том, как отличить текущего пользователя от других.Есть несколько способов сделать это:

  • , используя только поле в теле запроса, содержащее имя пользователя или аналогичные данные, а затем ответить пользовательскими данными.
  • , используя passport.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();        
    }
});
0 голосов
/ 04 февраля 2019

Я не вижу здесь никакого кода о текущем пользователе. Вам понадобится сервер, чтобы отличить пользователя от другого (например, что этот пакет предоставляет, например), и набормаршруты, пользовательский интерфейс и хранилище на стороне клиента для пользователей, чтобы войти / выйти и отправить запросы с идентификатором их текущей сессии.Но это совсем другая тема.

Тогда вы можете либо:

  • сохранить все события в одной коллекции и добавить поле, сообщающее, кому принадлежит какое событие
  • получить имя коллекции из уникальных данных пользователя (некоторый идентификатор) для каждого календаря

Отсюда я буду хранить все в одной и той же коллекции, потому что это одни и те же «виды» данных, и они будутпроще дополнить систему, когда / если вы хотите делиться событиями между пользователями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...