当用户创建新游戏 mongoose 时无法更新用户游戏 属性

Unable to update User games property when user creaties a new game mongoose

我正在开发一款应用程序,用户可以在其中创建和记帐以及制作问答游戏。 User 有一个名为 games 的 属性,它是 User 实例创建的 Game id 的集合。当我创建一个 Game 实例时,在我 return 响应(新 Game 实例的 JSON )之前,我找到 User 实例并使用 User 模式方法将新创建的 Games ID 添加到 User 的游戏 属性 中的游戏 ID 集合。它似乎在我创建游戏时起作用,我能够使用反映新添加的 Game id 的数组记录 User 的实例。

但是当我尝试通过 localhost:4000/users/USER_ID 获取 User 时,games 属性 仍然是空的。

这是我的 User 模型。

const mongoose = require("mongoose");
const validator = require("validator");
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const Schema = mongoose.Schema;

let User = new Schema({
  username: {
     type: String, required: true, trim: true, default: null,
     unique: true
  },
  password: {
     type: String, required: true, trim: true, default: null
  },
  games:{
     type: Array, required: false, default: []
  }
});

User.methods.addGame = async function(id) {
  const user = this;
  var games = user.games;
  games.push(id);
  user.games = games;
  user.save()
  return user
}

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

这是我的 /users 根路由和 /users/:id 路由。

userRoutes.route('/').get(function(req, res){
  User.find(function(err, users){
    if(err){
       res.status(400).send(err);
    } else {
       res.json(users)
    }
  });
});

userRoutes.route('/:id').get(function(req, res){
   User.findById(req.params.id, function(err, user){
     if(err){
       res.status(400).send(err)
     } else {
       if (user){
          res.status(200).json(user);
       } else {
          res.status(400).send('user not found :(')
       } 
    }
  });
});

这是我的 add 游戏路线。

gameRoutes.route('/add').post( async function(req, res){
  try {
    var user = await User.findOne({ _id: req.body.owner })
    let game = new Game(req.body);
    if (!user){
      res.status(400).send('user not found.')
    } else {
      await game.save()
      await user.addGame(game._id);
      if (!game){
        res.status(400).send('game cannot be created');
      } else {
        res.status(200).json(game);
      }
    }
  } catch (error) {
    res.status(500).send(error);
  }
});

最后,这是我使用 mongoose.set('debug', true) 创建游戏时记录的数据。

 Mongoose: users.findOne({ _id: ObjectId("5daca0171febbb25f2c929dd") }, 
 { projection: {} })
 Mongoose: games.insertOne({ questions: [ { id: 0, qTitle: 'When is 
 Independence Day?', qAnswers: [ { aId: 0, aContent: 'July 18th' }, { 
 aId: 1, aContent: 'July 19th' }, { aId: 2, aContent: 'July 30th' }, { 
 aId: 3, aContent: 'July 4th' } ], answer: 3, correct: null }, { id: 1, 
 qTitle: 'When is Christmas Day?', qAnswers: [ { aId: 0, aContent: 
 'July 18th' }, { aId: 1, aContent: 'July 19th' }, { aId: 2, aContent: 
 'December 25th' }, { aId: 3, aContent: 'December 31st' } ], answer: 2, 
 correct: null } ], qTime: null, expDate: null, isPrivate: true, 
 isClosed: false, _id: ObjectId("5db5c2fe96960e318ae8f60f"), name: 
 'poppie', __v: 0 }, { session: null })
 Mongoose: users.updateOne({ _id: ObjectId("5daca0171febbb25f2c929dd"), 
 __v: 19 }, { '$set': { games: [ ObjectId("5db5c2fe96960e318ae8f60f") ] 
 }, 
 '$inc': { __v: 1 } }, { session: undefined })

创建游戏后,如果我转到 /localhost:4000/users,我会看到 User 的结果列表。

 [{
    "username": "matt_cee",
    "password": 
    "a$/ySrwkMxaHGO24FOEst3NuqpG4iQi78BUCSkl4Hb.RmjTIwynR3l.",
    "games": [
        "5db5c2fe96960e318ae8f60f"
    ]
  }]

如您所见,games 数组包含新创建的游戏的 ID。我能够在 /add 游戏路线中记录更新的 User 但是当访问 /:id 用户路线时,returned User 实例有一个空数组对于游戏 属性。

我发现问题是我没有以正确的格式提供 属性。这是我的 Game 模型的设置方式。

let Game = new Schema({
    owner: { 
          id: { type: mongoose.Schema.Types.ObjectId,
                ref: "User"
          },
          username: {type: String}
        }
    },
    name:{
        type: String
    },
    questions: {
        type: Array
    }
});

问题是我试图通过将新创建的 Game 的 ID 添加到 user.games 来更新 User,但所有者 属性 没有填充正确,因为我只传递了 user 的 ID 而不是用户名。下面是我更新的游戏模型。

let Game = new Schema({
   owner: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "User",
      required: true
   },
   name:{
      type: String
   },
   questions: {
      type: Array
   }

})

特别感谢 @user753642 在他们的帮助下,我能够更好地构建我的代码并调试数据。