добавление значения в массив в схеме мангуста с использованием nodejs

Я разрабатываю приложение для онлайн-курса. Я создал коллекцию для зачисления на курс, в которой я храню название курса и пользователей, зачисленных на этот курс. Схема мангуста выглядит так. его имя — courseEnrollment.js.

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var courseEnrollment = new Schema({


courseEnrolled: [{courseName : String},
                 {username : [{user : String}]}
                ]

}, {collection : 'courseEnrollment'});

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

Когда пользователь нажимает на enroll, запрос GET отправляется на «localhost:3000/learn/:courseName/enroll». В этом обработчике маршрута я храню информацию о зачислении пользователя в две разные коллекции. 1) В коллекции CourseEnrollment, которую я показывал выше. 2) В информации об учетной записи пользователя, где хранится имя пользователя, пароль и т. д., я также сохраняю курс, зарегистрированный пользователем.

Теперь проблема, с которой я сталкиваюсь сейчас, заключается в том, что по какой-то причине он обновляет только коллекцию User, а не коллекцию courseEnrollment. Это дает следующую ошибку.

events.js:141
  throw er; // Unhandled 'error' event
  ^

TypeError: Cannot read property 'push' of undefined
at /home/mobileedx/WebstormProjects/passportAuthentication/routes/index.js:387:47
at Query.<anonymous> (/home/mobileedx/WebstormProjects/passportAuthentication/node_modules/mongoose/lib/model.js:3340:16)
at /home/mobileedx/WebstormProjects/passportAuthentication/node_modules/mongoose/node_modules/kareem/index.js:259:21
at /home/mobileedx/WebstormProjects/passportAuthentication/node_modules/mongoose/node_modules/kareem/index.js:127:16
at nextTickCallbackWith0Args (node.js:420:9)
at process._tickCallback (node.js:349:13)

Вот мой код внутри обработчика маршрута для «localhost: 3000/learn/:courseName/enroll»

  /**
  * Here If a user clicks on enroll, then the GET request will come on this page. If user is not authenticated then it
 * will redirect to the login page. If user is logged in then, user will get the courseHome page.
 */

 router.get('/learn/:courseName/enroll', isAuthenticated, function (req, res) {

  var user = req.user.username;
  var course = req.params.courseName;

  console.log('user trying to enroll is: ' + user);
  console.log('coursename user is trying to enroll is: ' + course);

  courseEnrollment.findOne({ 'courseEnrolled.courseName' :  req.params.courseName }, function(err, courseEnroll) {
      // In case of any error, return using the done method
      if (err) {
          console.log('Error in SignUp: ' + err);
          return done(err);
      }
      console.log('courseEnroll value is: ' + courseEnroll);

      courseEnroll.courseEnrolled.username.push({ "user": req.user.username});

      courseEnroll.save(function (err, data) {
          if (err)
              throw err;
          else {
              console.log('course Updated in courseEnrollment collection');
          }
      });
  });


  // When a user clicks on 'enroll' to enroll to a course, then the course name should be added in the
  // user's courseEnrolled list as well. This is what we are doing here.


  User.findOne({ 'username' :  req.user.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);
      }
      console.log('user value is: ' + user);
      console.log('username value is: ' + user.username);
      user.courseEnrolled.push({ "courseName": course});

      user.save(function (err, data) {
          if (err)
              throw err;
          else {
              console.log('course Updated in user account collection');
          }
      });

      res.render('home', {user: req.user});
  });
});

Пожалуйста, дайте мне знать, где я ошибаюсь. Могу ли я использовать популяцию мангустов для заполнения имени пользователя из поля имени пользователя коллекции пользователей в коллекции courseEnrollment. Если да, то как это сделать. Спасибо.


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


Ответы (1)


Из того, что я могу предположить, есть проблема со схемой. ваша схема зачисления на курс. Это должно быть похоже на следующее. Массив, содержащий один объект на курс. который содержит информацию о его имени и зарегистрированных в нем пользователях.

   courseEnrolled: [{
           courseName : String,
           username : [{user : String}]
    }]

Надеюсь, поможет.

.................................................

хорошо, если это просто схема для поддержки пользователей, присоединившихся к определенному курсу. Затем вы можете следовать следующей схеме

var courseEnrollment = new Schema({
   courseName : String:,
   usersEnrolled : [String]
}, {collection : 'courseEnrollment'});

Доступ к нему можно получить в таком запросе.

  courseEnrollment.findOne({ 'courseName' :  req.params.courseName }, function(err, courseEnroll) {
  // In case of any error, return using the done method
  if (err) {
      console.log('Error in SignUp: ' + err);
      return done(err);
  }
  console.log('courseEnroll value is: ' + courseEnroll);

  courseEnroll.username.push({ "user": req.user.username});

  courseEnroll.save(function (err, data) {
      if (err)
          throw err;
      else {
          console.log('course Updated in courseEnrollment collection');
      }
  });

});

person Rohail Najam    schedule 10.11.2016
comment
Тем не менее я получаю следующую ошибку. Events.js:141 метатель; // Необработанное событие «ошибка» ^ TypeError: Невозможно прочитать свойство «имя пользователя» неопределенного - person Scalaboy; 12.11.2016