我正在使用mean.io制作体育赛事管理系统。我正在尝试使用rest api更新模型播放器,它会从mongoose中抛出此错误:
{ _id: 5411c79895d600440c698fa1,
email: 'dipesh.acharya@apexcollege.edu.np',
name: 'Dipesh Acharya',
username: 'dipesh.acharya',
games: [ 5411bd54786cfe2420f1e27a ],
teams: [],
roles: [ 'authenticated' ] }
[TypeError: Cannot read property '_id' of undefined]
PUT /api/players/5411c79895d600440c698fa1 500 199.402 ms - 36
我也试图从播放器中删除_id proterty,但它也不起作用。 我用来更新模型播放器的方法是:
exports.update = function(req, res) {
var player = req.player;
player = _.extend(player, req.body);
console.log(player);
Player.findOneAndUpdate(req.params.playerId, player,{new:true}, function (err, updatedPlayer) {
console.log(err);
if (err) {
return res.status(500).json({
error: 'Cannot update the player'
});
}
res.json(updatedPlayer);
});
如果我使用model.save
的默认包article
中提供的mean.io
方法,则会显示另一个错误。我在播放器包user
文件中扩展了app.js
模型。因此,每当我尝试更新一个字段时,我在app.js
中声明的字段都是必需的,并且抛出了来自mongoose的路径所需的错误。
答案 0 :(得分:4)
您的更新请求中有两个问题。
首先,findOneAndUpdate
要求将dict作为查询,而不仅仅是id,因此您应该将其设为{_id: req.params.playerId}
。
其次,传递mongoose对象作为更新数据是有风险的,而是应该将其转换为类似此var _player = player.toObject()
的dict,然后将_player
传递给更新请求。请注意,您需要删除_id
的{{1}}参数,因为您无法更改文档的_player
。在进行更新之前,只需执行_id
即可。此外,delete _player._id
默认设置为new
,因此您不会需要选项dict。
这是您的工作代码:
true
但在这种情况下,你甚至不必进行第一次操作。由于您只想更新var player = _.extend(req.player, req.body);
var _player = player.toObject();
delete _player._id;
var query = {_id: req.params.playerId};
Player.findOneAndUpdate(query, _player, function (err, updatedPlayer) {
...
});
的数据,您可以这样做:
req.body
这将使用var query = {_id: req.params.playerId};
var data = {
$set: req.body,
};
Player.findOneAndUpdate(query, data, function (err, updatedPlayer) {
...
});
中的值更新与query
匹配的播放器的所有字段。