Вставка массива в mongodb с использованием mongoose в схему, где другие поля уже добавлены при регистрации пользователя

Я создаю приложение для онлайн-курса. Я создал схему для регистрации пользователей. В схеме я также хочу добавить название курсов, на которые зачислен пользователь. Название курса представляет собой массив. Регистрация пользователя прошла успешно. после этого я создал маршрут для /dashboard, где пользователь отправляет запрос POST, чтобы добавить название курса. Этот курс следует добавить в то же поле схемы регистрации для курса Enrolled. Однако, когда я сохраняю новый объект схемы регистрации, он создает новое поле документа courseEnrolled. Я хочу, чтобы это значение запроса POST было добавлено в поле документа пользователя, конечно же, в виде массива.

Вот как я определил свою схему регистрации. Его имя в account.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var passportLocalMongoose = require('passport-local-mongoose');

var courseSchema = new Schema({ courseName : String });

var Account = new Schema({

username: {
    type: String,
    unique: true
},
password: String,
email: String,
firstName: String,
lastName: String,
courseEnrolled: [{courseName : String}]
});

Account.plugin(passportLocalMongoose);

module.exports = mongoose.model('Account', Account);

Вот моя прописка в паспорте. регистрация.js

var passport = require('passport');
var LocalStrategy   = require('passport-local').Strategy;
var User = require('../models/account');
var bCrypt = require('bcrypt-nodejs');
var course = require('../models/courseEnrollment');

module.exports = function(passport){

passport.use('register', new LocalStrategy({
        passReqToCallback : true // allows us to pass back the entire request to the callback
    },
    function(req, username, password, done) {

        findOrCreateUser = function(){
            // find a user in Mongo with provided username
            User.findOne({ 'username' :  username }, function(err, user) {
                // In case of any error, return using the done method
                if (err){
                    console.log('Error in SignUp: '+err);
                    return done(err);
                }
                // already exists
                if (user) {
                    console.log('User already exists with username: '+username);
                    return done(null, false, req.flash('message','User Already Exists'));
                } else {
                    // if there is no user with that email
                    // create the user
                    var newUser = new User();
                    var newCourse = new course();

                    // set the user's local credentials
                    newUser.username = username;
                    newUser.password = createHash(password);
                    newUser.email = req.body.email;
                    newUser.firstName = req.body.firstName;
                    newUser.lastName = req.body.lastName;
                    newUser.courseEnrolled = req.body.courseEnrolled;

                    // save the user
                    newUser.save(function(err) {
                        if (err){
                            console.log('Error in Saving user: '+err);
                            throw err;
                        }
                        console.log('User Registration succesful');
                        return done(null, newUser);
                    });

                }
            });
        };
        // Delay the execution of findOrCreateUser and execute the method
        // in the next tick of the event loop
        process.nextTick(findOrCreateUser);
    })
);

// Generates hash using bCrypt
var createHash = function(password){
    return bCrypt.hashSync(password, bCrypt.genSaltSync(10), null);
}

}

Я могу успешно зарегистрировать пользователя. После этого у меня есть маршрут для /dashboard, где я обрабатываю запрос POST для добавления курса. Вот фрагмент моего /dashboard, обрабатывающего POST-запрос.

var User = require('../models/account');
/* POST dashboard Page */

router.post('/dashboard', isAuthenticated, function (req, res) {

sess = req.session.passport.user;
console.log('session value is: ' + sess);
var newUser = new User();
console.log('newUser id is: ' + newUser._id);
var currentUser = req.user._id;
console.log('current User id is: ' + currentUser);
var myUser = req.user;
console.log('myUsers value is: ' + myUser);
var myUserCourse = req.user.courseEnrolled;

if (sess == currentUser) {

  //var newCourse = new course();
  console.log('request received: ' + req.body.courseEnrolled);
  req.user.courseEnrolled = req.body.courseEnrolled;

  newUser.save(function (err, data) {
    if(error)
      throw error;
    else {
      console.log('course Updated');
    }
  });
 res.render('home', {user: req.user});


}
});

Эта функция newUser.save() создает новый документ в mongodb и сохраняет курсEnrolled. Я хочу сохранить значение req.body.courseEnrolled в том же поле документа, где определено другое пользовательское значение.

Это сохраняется в коллекции: - «аккаунты» для пользователя

{
"_id" : ObjectId("57f95afd9c78b91c69334f0d"),
"lastName" : "Nehra",
"firstName" : "Ashish",
"email" : "[email protected]",
"password" : "$2a$10$YzLvbQTHFtq5l0ooP0njOux94Rp.pm.Pkb/TugBnCSTUJNhBBonLG",
"username" : "ashish",
"courseEnrolled" : [
    "about to change something now"
],
"__v" : 1
}

И в той же коллекции создается новый документ.

{
"_id" : ObjectId("5803fc4342ca1d3167102300"),
"courseEnrolled" : [ ],
"__v" : 0
}

person Scalaboy    schedule 16.10.2016    source источник


Ответы (1)


Это логично, потому что сначала вы делаете это для различных пользовательских объектов (req.user/new user):

**var newUser = new User();

Это создаст новый объект User, а затем:

newUser.save(function (err, data) {

Это сохранит вновь созданного пользователя в новом документе. Если вы хотите использовать .save, перепишите его (повторно используйте свой собственный код):

User.findOne({ 'username' :  username }, function(err, user) {
      // In case of any error, return using the done method
      if (err){
          console.log('Error in SignUp: '+err);
          return done(err);
      }

      user.courseEnrolled = req.body.courseEnrolled;

      user.save(function (err, data) {
    if(err)
      throw err;
    else {
      console.log('course Updated');
    }
  });
person HoefMeistert    schedule 17.10.2016
comment
Я попробовал то, что вы предложили, и получил ошибку ссылки. - person Scalaboy; 18.10.2016
comment
Events.js:141 метатель; // Необработанное событие «ошибка» ^ ReferenceError: ошибка не определена в /home/mobileedx/WebstormProjects/passportAuthentication/routes/index.js:228:19 в /home/mobileedx/WebstormProjects/passportAuthentication/node_modules/mongoose/lib/model .js:3340:16 в /home/mobileedx/WebstormProjects/passportAuthentication/node_modules/mongoose/lib/document.js:1949:15 в nextTickCallbackWith0Args (node.js:420:9) в process._tickCallback (node.js:349 :13) Процесс завершен с кодом выхода 1 - person Scalaboy; 18.10.2016
comment
бросать; // Необработанное событие "ошибка" ^ ReferenceError: ошибка не определена - person Scalaboy; 18.10.2016
comment
Да, я видел, что это было из-за проблемы с копированием/вставкой. - person HoefMeistert; 18.10.2016
comment
Спасибо, это сработало. Однако я хочу добавить курсEnrolled в массив. Если вы посмотрите на схему, то увидите, что это массив. Здесь, если я добавлю новый курс, он заменит предыдущий. Я хочу убедиться, что новый курс добавлен в массив вместе с предыдущими курсами. - person Scalaboy; 19.10.2016
comment
Затем вам нужно добавить новый курс в массив. Это можно сделать на курсе, зачисленном в ваш код javascript push с $push. - person HoefMeistert; 19.10.2016