Ошибка типа: не удается прочитать свойство ‘_id’ неопределенного значения при использовании findOneAndRemove()

#node.js #express #mongoose

#node.js #выразить #мангуст

Вопрос:

Когда я выполняю функцию findOneAndRemove() и передаю требуемые параметры, отображается ошибка ‘Ошибка типа: не удается прочитать свойство ‘_id’ из undefined’. Мой mongodb имеет атрибут ‘_id’

Я попробовал findById(). Это работает, но если я определил findOneAndRemove({_id: req.params.id }), возникает ошибка.

 **router**

router.delete('/delete/:id', async (req, res) => {
    try {
        var id = req.params.id;

        if (!ObjectID.isValid(id))
            return res.status(404).send();

        let team = await Team.findOneAndDelete({ _id: id, createdBy: req.user._id });
        console.log('team', team);
        if (!team)
            return res.status(404).send();

            res.status(201).json({
              message: 'Team Deleted',
              result: { team }
            });
    } catch (e) {
        console.log(e);
        res.status(400).send(e);
    }
  });
  
 **Team Model**

var mongoose = require('mongoose');

const teamSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    unique: true,
    trim: true
  },
  country: {
    type: String,
    required: true,
    trim: true
  },
  yearFounded: {
    type: Date,
    required: true
  },
  ground: {
      type: String,
      required: true,
      trim: true
  },
  capacity: {
      type: Number,
      required: true,
  },
  manager: {
    type: String,
    required: false,
  },
  website: {
    type: String,
    required: false,
  },
  imagePath: {
    type: String,
    required: false,
  },
  description: {
    type: String,
    required: false
  },
  createdBy: {
      type: mongoose.Schema.Types.ObjectId,
      required: true,
      ref: 'User'
  }
}, {
  timestamps: true
})


teamSchema.index({ name: "text", manager: "text", ground: "text", country: "text" });

teamSchema.virtual('players', {
  ref: 'Player',
  localField: '_id',
  foreignField: 'team'
})


const Team = mongoose.model('Team', teamSchema);

module.exports = Team


  

Комментарии:

1. console.log(req) и посмотрите, получите ли вы свой user и сможете ли вы найти свой ключ

Ответ №1:

findOneAndRemove возвращает удаленный документ, поэтому, если вы удалите документ, который, как вы позже решите, удалять не следует, вы можете вставить его обратно в базу данных. Проверка вашей логики перед удалением документа была бы предпочтительнее последующих проверок IMO.

findOneAndDelete имеет параметр сортировки, который может использоваться для определения того, какой документ обновляется. У него также есть параметр TimeLimit, который может определять, в пределах которого операция должна завершиться

попробуйте это

     router.delete('/delete/:id', async (req, res) => {
    try {
        let id = {_id:req.params.id};

        if (!ObjectID.isValid(id))
            return res.status(404).send();

        let team = await Team.findOneAndRemove({ _id: rid, createdBy: req.user._id });
        console.log('team', team);
        if (!team)
            return res.status(404).send();

            res.status(201).json({
              message: 'Team Deleted',
              result: { team }
            });
    } catch (e) {
        console.log(e);
        res.status(400).send(e);
    }
});
  

Комментарии:

1. Привет, спасибо за объяснение. Однако это не работает, по-прежнему выдавая ту же ошибку ‘Ошибка типа: не удается прочитать свойство ‘_id’ неопределенного значения’ но внутри MongoDB в документе есть поле _id, и когда я использую findByIdAndRemove, оно работает.

2. Привет, после некоторой отладки я выясняю проблемы. Проблема в том, что запрос пользователя не определен, и _id ссылается на эти параметры. Добавив промежуточное программное обеспечение, которое хранит информацию о пользователе, я могу получить _id и разрешить. Но в любом случае спасибо за помощь. (:

3. @Sian20R: Добро пожаловать

Ответ №2:

Ответ в том, что я забыл добавить промежуточное программное обеспечение ‘authenticate’ и, следовательно, параметры CreatedBy req.user._id навсегда не определен. Решение.

Маршруты

 router.delete('/delete/:id', authenticate, async (req, res) => {
    try {
        var id = req.params.id;

        if (!ObjectID.isValid(id))
            return res.status(404).send();

        let team = await Team.findOneAndRemove({ _id: id, createdBy: req.user._id });
        if (!team)
          return res.status(404).send();

        removeImage(team.imagePath);
        res.status(201).json({
          message: 'Team Deleted',
          result: { team }
        });
    } catch (e) {
        console.log(e);
        res.status(400).send(e);
    }
  });
  

Промежуточное программное обеспечение

 let authenticate = async (req, res, next) => {
    try {
        const token = req.header('Authorization').replace('Bearer ', '')
        const decoded = jwt.verify(token, process.env.JWT_SECRET)
        const user = await User.findOne({ _id: decoded._id, 'tokens.token': token })

        if (!user) {
            throw new Error()
        }

        req.token = token;
        req.user = user;
        next()
    } catch (e) {
        res.status(401).send({ error: 'Please authenticate.' })
    }
};