Невозможно обновить свойство игр пользователя, когда пользователь создает новую игру mongoose - PullRequest
0 голосов
/ 25 октября 2019

Я работаю над приложением, в котором пользователи могут создавать и создавать аккаунты, а также делать простые игры. У User есть свойство с именем games, представляющее собой коллекцию Game идентификаторов, созданных экземпляром User. Когда я создаю экземпляр Game, прежде чем вернуть ответ (JSON нового экземпляра Game), я нахожу экземпляр User и использую метод схемы User для добавления вновь созданного идентификатора Gamesв коллекцию игровых идентификаторов в свойстве User. Кажется, это работает, когда я создаю игру, мне удалось зарегистрировать экземпляр User с массивом, отражающим недавно добавленный идентификатор Game.

Но тогда, когда я пытаюсь получить User через localhost:4000/users/USER_ID, свойство 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": 
    "$2a$10$/ySrwkMxaHGO24FOEst3NuqpG4iQi78BUCSkl4Hb.RmjTIwynR3l.",
    "games": [
        "5db5c2fe96960e318ae8f60f"
    ]
  }]

Как видите, массив games содержит идентификатор только что созданной игры. Я могу зарегистрировать обновленный User в игровом маршруте /add, но при доступе к пользовательскому маршруту /:id возвращенный экземпляр User имеет пустой массив для свойства games.

1 Ответ

0 голосов
/ 28 октября 2019

Мне удалось выяснить, что проблема заключалась в том, что я не предоставлял собственность в правильном формате. Вот как была настроена моя Game модель.

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

Проблема заключалась в том, что я пытался обновить User, добавив идентификатор только что созданного Game в user.games, носвойство владельца не заполнялось должным образом, потому что я передавал только идентификатор user, а не имя пользователя. Ниже моя обновленная модель игры.

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

})

Особая благодарность @ user753642 , с помощью которого я смог лучше структурировать свой код и отладить данные,

...