在使用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
的值。