TypeError: Невозможно прочитать свойство '_id' из неопределенного при использовании findOneAndRemove () - PullRequest
0 голосов
/ 29 марта 2019

Когда я выполняю функцию findOneAndRemove () и передаю необходимые параметры, она показывает ошибку «TypeError: Невозможно прочитать свойство« _id »из неопределенного». У моего 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


Ответы [ 2 ]

1 голос
/ 29 марта 2019

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

findOneAndDelete имеет параметр sort, который можно использовать для определения того, какой документ обновляется. У этого также есть параметр 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);
    }
});
0 голосов
/ 29 марта 2019

Ответ - я забыл добавить промежуточное программное обеспечение «authenticate», и, следовательно, созданный параметр param 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.' })
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...