Как я могу сделать ошибку 404 вместо ошибки приведения

#javascript #node.js #mongodb #express #mongoose

Вопрос:

У меня есть маршрут, который заключается /mysafe/idofthemodel. в том, что Когда idofthemodel он не найден, он выдает ошибку приведения Cast to ObjectId failed for value "something" (type string) at path "_id" for model "modelname". Вместо ошибки, которую я хотел бы иметь, ошибка 404.

Вот мой маршрут

 app.get('/mysafe/:safeid',isLoggedIn,isAuthor, async(req,res)=gt; {  const { safeid } = req.params;    const safe=await Safe.findById(safeid).populate('author')  const password = await Password.find({safe:safeid}).populate('safe')    res.render('passwords/index', { password,safe }) }) 

Схемы:

 const PasswordsSchema = new Schema({  title: String,  url: String,  password: String,  safe: {  type: Schema.Types.ObjectId,  ref: "Safe"  }, }) const SafeSchema = new Schema({  author: {  type: Schema.Types.ObjectId,  ref: "User"  }, })  

Ответ №1:

Здесь я использую EJS для отображения страницы с ошибкой 404, а файл подкачки находится в views/errors/404.ejs

 const { safeid } = req.params;   try {  const safe = await Safe.findOne({ _id: mongoose.Types.ObjectId(safeid) }).populate('author')   if (!safe) {  return res.status(404).render('errors/404.ejs')  }   const password = await Password.findOne({ safe: mongoose.Types.ObjectId(safeid) }).populate('safe')  return res.render('passwords/index', { password, safe })   }  catch (error) {  return res.status(500).render('errors/500')  }  

middleware.js

 module.exports.isAuthor = (req, res, next) =gt; {  const { safeid } = req.params   if (!mongoose.Types.ObjectId.isValid(safeid)) {  return res.status(404).render('errors/404.ejs')  }   Safe.findById(safeid).then(safe =gt; {  if (!safe) {  return res.status(404).render('errors/404.ejs')  }  if (!safe.author._id.equals(req.user._id)) {  req.flash('error', 'Notfound');  return res.redirect('/');  }  next();  }); }  

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

1. это все равно приводит к ошибке приведения. это что-то с _id. но спасибо за помощь, ценю это

2. можете ли вы поделиться моделью Safe и параметром safeId ?

3. Таким образом, это приложение, в котором у пользователя есть сейф, и в этом сейфе у него есть пароли. Каждый пользователь имеет свой собственный сейф с идентификатором и паролем, имеет идентификатор и находится в этом сейфе

4. добавьте правки к основному вопросу.

5. попробуйте ввести строку пароля после условия if, как в последнем редактировании, и поделитесь ошибкой здесь.