#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.' })
}
};