2016-11-10 5 views
0

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

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); 

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

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

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) 

Вот мой код внутри обработчика маршрута для 'локальный: 3000/узнать /: courseName/зарегистрироваться'

/** 
    * 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}); 
    }); 
}); 

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

ответ

1

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

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

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

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

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

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'); 
     } 
    }); 

});

+0

Все еще я получаю следующее сообщение об ошибке. events.js: 141 throw er; // Unhandled 'error' event ^ ТипError: Не удается прочитать имя пользователя 'undefined –

+0

Я обновил ответ. Надеюсь, поможет. –

+0

Да, это сработало. Большое спасибо. –