在使用mongoosefindOneandUpdate时,不能读取未定义的属性“_id”

我正在使用mean.io来制作体育事件pipe理系统。我正在尝试使用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保护,但它也不起作用。 我用来更新模型播放器的方法是:

 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中提供的model.save方法,则会显示另一个错误。 我已经在播放器包app.js文件中扩展了user模型。 所以,当我尝试更新一个字段时,我已经在app.js中声明的字段是必需的,并且会引发从mongoose引起的错误。

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

首先, findOneAndUpdate需要一个字典作为查询,而不仅仅是id,所以你应该给它{_id: req.params.playerId}来代替。

其次,传递一个mongoose对象作为更新数据是有风险的,相反,你应该把它转换成一个像这样var _player = player.toObject() ,然后将_player传递给更新请求。 请记住,您需要删除_player_id参数,因为您无法更改文档的_id 。 在做更新之前,只要delete _player._id ,你应该没问题。 此外,默认情况下, new设置为true ,所以你不需要select字典。

这是你的工作代码:

 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的值。

Interesting Posts