投射到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 (hexStringObjectId )或有效的User对象与_id字段。

但是你试图推送无效的对象{ values: [playerId, nickname] }

下面是这个操作的样子:

 Tournament.findByIdAndUpdate(req.params._id, { $pushAll: { players: [playerId] } }) 

NB不知道nickname在你的例子中是什么意思,但它看起来不是一个有效的ObjectId ,所以我删除了它。