无法阅读财产' _id'使用mongoose findOneandUpdate时未定义

时间:2014-09-14 09:24:36

标签: node.js mongoose mean.io

我正在使用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的路径所需的错误。

1 个答案:

答案 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匹配的播放器的所有字段。