【问题标题】:adding a value in an array in mongoose schema using nodejs使用nodejs在mongoose模式中的数组中添加一个值
【发布时间】:2017-03-24 00:16:48
【问题描述】:

我正在开发一个在线课程应用程序。我为课程注册创建了一个集合,其中存储了课程名称和注册该课程的用户。 Mongoose 架构看起来像这样。它的名字是 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);

当用户点击注册时,GET 请求将转到 'localhost:3000/learn/:courseName/enroll' 。 在该路由处理程序中,我将用户课程注册信息存储在两个不同的集合中。 1)在我上面展示的 courseEnrollment 集合中。 2)在用户账户信息中,用户名、密码等存储的地方,我也存储了用户注册的课程。

现在我现在面临的问题是,它只更新用户集合,而不是由于某种原因而不是 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 集合中用户集合的用户名字段填充用户名吗?如果是,那么该怎么做。 谢谢。

【问题讨论】:

    标签: node.js mongodb mongoose mongoose-populate


    【解决方案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');
          }
      });
    

    });

    【讨论】:

    • 我仍然收到以下错误。 events.js:141 抛出错误; // 未处理的 'error' 事件 ^ TypeError: Cannot read property 'username' of undefined
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2020-10-22
    相关资源
    最近更新 更多