2017-02-21 37 views
2

мой код ниже возвращает «Пользователь удален», даже если пользователь уже удален. Я бы предпочел бросить в этом случае, но я бы хотел, чтобы запросил БД как можно меньше.Mongoose: remove() возвращает true для удаленных объектов

Есть ли способ получить userNotFound (см. Ниже) без проверки вручную, существовал ли пользователь перед удалением? Возможно, я пропустил функцию remove() или альтернативную функцию.

var itemId = 123; 
Item.remove({id: itemId}, function(err) { 
    if (err) { 
     return res.json({success: false, msg: 'Cannot remove item'}); 
    } 

    // !!! 
    if (userNotFound) { 
     return res.status(404).json({success: false, msg: 'User not found'}); 
    } 
    // /!!! 


    res.json({success: true, msg: 'User deleted.'}); 
}); 

Заранее благодарен!

+0

Функции вы пропустили фактически проверки возвращаемого значения. Вы также приняли неверный ответ, поскольку накладные расходы на фактическое получение документа, когда вам не нужно, - это то, что вам следует избегать. –

ответ

2

Проблема с выше подхода состоит в том, что userNotFound всегда будет undefined, так как вы не определили его в аргументах обратного вызова. Лучше использовать функцию findOneAndRemove(), так что вы можете вернуть документ удален, если найдено:

var itemId = 123; 
Item.findOneAndRemove({ id: itemId }) 
    .exec(function(err, item) { 
     if (err) { 
      return res.json({success: false, msg: 'Cannot remove item'}); 
     }  
     if (!item) { 
      return res.status(404).json({success: false, msg: 'User not found'}); 
     } 
     res.json({success: true, msg: 'User deleted.'}); 
    }); 
3

Мангуст-х Query#remove принимает обратный вызов с 2-мя параметрами:

  1. error
  2. writeOpResult

Если вы проверяете writeOpResult объект, вы должны легко быть в состоянии сказать, произошло ли удаление или нет.

Он должен содержать поле под названием nRemoved. Если он равен 0, тогда документ не был удален, в противном случае, если это число, то многие документы были удалены. Аналогично, это поле называется nMatched, в котором указано, сколько документов соответствует вашему запросу.

Так что для вашего случая становится так:

var itemId = 123; 

Item.remove({id: itemId}, function(error, writeOpResult) { 

    if (error) { 
     return res.json({success: false, msg: 'Cannot remove item'}); 
    } 

    if (writeOpResult.nMatched === 0) { 
     return res.status(404).json({success: false, msg: 'User not found'}); 
    } 

    res.json({success: true, msg: 'User deleted.'}); 
}); 

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

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