2014-09-14 2 views
1

Я использую mean.io сделать system.I управления спортивным события пытается обновить модель проигрыватель с апи отдыха и выдает эту ошибку из мангуста:не может читать свойство «_id» неопределенных при использовании мангусты findOneandUpdate

{ _id: 5411c79895d600440c698fa1, 
    email: '[email protected]', 
    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, требуется, и путь, требуемый для ошибки из мангуста.

ответ

2

У вас есть две проблемы в вашем запросе на обновление.

Во-первых, findOneAndUpdate ожидает, что в качестве запроса будет использоваться dict, а не только идентификатор, поэтому вы должны дать ему {_id: req.params.playerId}.

Во-вторых, передача объекта mongoose по мере того, как данные обновления являются рискованными, вместо этого вы должны преобразовать его в dict так, как это var _player = player.toObject(), а затем передать запрос на обновление _player. Помните, что вам необходимо удалить параметр _id_player, потому что вы не можете изменить _id документа. Перед выполнением обновления просто сделайте delete _player._id, и все будет хорошо. Кроме того, по умолчанию new установлен на true, поэтому вам не нужны параметры dict.

Вот ваш рабочий код:

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.

 Смежные вопросы

  • Нет связанных вопросов^_^