当用户创建新游戏 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 在他们的帮助下,我能够更好地构建我的代码并调试数据。
我正在开发一款应用程序,用户可以在其中创建和记帐以及制作问答游戏。 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 在他们的帮助下,我能够更好地构建我的代码并调试数据。