#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, как в последнем редактировании, и поделитесь ошибкой здесь.