2

我正在使用 mean.io 制作体育赛事管理系统。我正在尝试使用 rest api 更新模型 Player,它从 mongoose 抛出此错误:

  { _id: 5411c79895d600440c698fa1,
  email: 'abc@bcd.com',
  name: 'James Bond',
  username: 'james.bond',
  games: [ 5411bd54786cfe2420f1e27a ],
  teams: [],
  roles: [ 'authenticated' ] }

[TypeError: Cannot read property '_id' of undefined]

PUT /api/players/5411c79895d600440c698fa1 500 199.402 ms - 36

我还尝试从播放器中删除 _id 属性,但它也不起作用。我用来更新模型播放器的方法是:

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 的 path required 错误。

4

1 回答 1

5

您的更新请求中有两个问题。

首先,findOneAndUpdate期望 dict 作为查询,而不仅仅是 id,所以你应该给它{_id: req.params.playerId}

其次,将 mongoose 对象作为更新数据传递是有风险的,相反,您应该将其转换为这样的 dict var _player = player.toObject(),然后_player传递给更新请求。请记住,您需要删除_id参数,_player因为您无法更改_id文档的参数。在进行更新之前delete _player._id,您应该没问题。此外,默认情况下new设置为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使用来自 的值更新匹配 的玩家的所有字段req.body

于 2014-09-14T10:53:39.463 回答