投射到ObjectId的path\“players \”的值\“ \”失败
我刚刚开始使用Mongoose和MongoDB。 我已经尝试了一切,我可以在这里findstackoverflow,但是,我迷路了,因为我不知道是什么问题。
我有以下2个模型,它们驻留在2个不同的文件中:
var UserSchema = require('mongoose').model('User').schema; var tournamentSchema = mongoose.Schema({ tournamentName: String, nrOfPlayers: String, players: [{ type: mongoose.Schema.Types.ObjectId, ref: UserSchema }], openForLeagues: { leagues: [] }, edition: String, description: String, startDate: Date, endDate: Date, startHour: String, prize: Boolean, sponsors: String, ingameChatChannel: String, twitchStreamChannel: String }); module.exports = mongoose.model('Tournament', tournamentSchema); var userSchema = mongoose.Schema({ local: { nickname: String, battlenetid: String, email: String, password: String, race: String, league: String, role: String, website: String } }); module.exports = mongoose.model('User', userSchema);
在我的routes.js文件中,我执行以下操作:
app.post('/signup-tournament/:_id/:userId', isLoggedIn, function(req, res) { var playerId = req.params.userId; var nickname = req.user.local.nickname; console.log(ObjectId.isValid(req.params.userId)); //true console.log(ObjectId.isValid(req.params._id)); //true if (ObjectId.isValid(playerId) && ObjectId.isValid(req.params._id)) { Tournament.findByIdAndUpdate(req.params._id, { $pushAll: { players: { values: [playerId, nickname] } } }, function(err, tournament) { if (err) res.send(err) else res.redirect('/signup-tournament/' + req.params._id + req.params.userId); }); } });
当我做这个职位,我得到以下错误:
{ "message": "Cast to ObjectId failed for value \"[object Object]\" at path \"players\"", "name": "CastError", "type": "ObjectId", "value": [{ "values": ["53e340b3afb9657f0dbcf994", "cristidrincu"] }], "path": "players" }
我不明白为什么使用ObjectId.isValid()validationID时会出现转换错误…我已经花了2天的时间尝试自己弄清楚了,所以请帮助:)谢谢!
您正在尝试执行与您的tournamentSchema
findByIdAndUpdate
操作。 问题出在以下代码中:
Tournament.findByIdAndUpdate(req.params._id, { $pushAll: { players: { values: [playerId, nickname] } } })
players
应该包含User
对象,所以它应该是玩家的_id
(hexString
或ObjectId
)或有效的User
对象与_id
字段。
但是你试图推送无效的对象{ values: [playerId, nickname] }
。
下面是这个操作的样子:
Tournament.findByIdAndUpdate(req.params._id, { $pushAll: { players: [playerId] } })
NB不知道nickname
在你的例子中是什么意思,但它看起来不是一个有效的ObjectId
,所以我删除了它。