#javascript #node.js #express #routes #express-router
Вопрос:
У меня есть такой маршрут http://localhost:3000/admin/video/edit/5
, и контроллер выглядит так
albumEdit: async (req, res) => {
const editInfoId = req.params.id;
await Movie.findOne({ where: { id: editInfoId } }).then((movie) => {
if (movie) {
res.render('admin/movies/edit', { title: 'Edit Movie On Page One', movie });
}
});
},
для целей тестирования, когда я вводлю неправильный идентификатор после edit/
того, как процесс через некоторое время останавливается, я получаю 500 ошибок.
как предотвратить это, если кто-то попытается взломать мое приложение с неправильным идентификатором в URL-адресе? Я хочу что-то вроде того, если кто-нибудь попытается сделать перенаправление этого приложения на страницу с ошибкой.
Я новичок в node js express js, мне нужна некоторая информация.
Комментарии:
1. есть ли кто-нибудь, кто мог бы мне помочь
2. Что
orm
вы используете? Если в базе данных невозможно найти запись, будетfindOne
ли выдано исключение?3. Я использую sequelize
Ответ №1:
Ваш маршрут будет заблокирован, если он movie
неверен или fineOne
приведет к ошибке, потому что в обоих этих случаях вы не отправляете никакого ответа.
через некоторое время я получаю 500 ошибок.
Если вы запускаете сервер узла за веб-сервером, то это 500 связано с таймаутом, поскольку ваш маршрутизатор не отправляет ответ.
как предотвратить это, если кто-то попытается взломать мое приложение с неправильным идентификатором в URL-адресе? Я хочу что-то вроде того, если кто-нибудь попытается сделать перенаправление этого приложения на страницу с ошибкой.
Как и в случае с любым языком программирования или кодом, убедитесь, что вы обрабатываете все потоки управления и возможные исключения.
Кроме того, если вы используете await
, вы в большинстве случаев не хотите использовать .then
.
albumEdit: async (req, res) => {
const editInfoId = req.params.id;
try {
let movie = await Movie.findOne({
where: {
id: editInfoId
}
})
if (movie) {
res.render('admin/movies/edit', {
title: 'Edit Movie On Page One',
movie
});
} else {
// either the if is not necessary or you have to also handle the else cases
// send some error response
res.send('error')
}
} catch (err) {
// send some error response
res.send('error')
}
}
Для полноты картины вот как вам нужно будет внести изменения в свой код, но, как сказано выше, не смешивайте await
и then
:
albumEdit: async (req, res) => {
const editInfoId = req.params.id;
try {
await Movie.findOne({
where: {
id: editInfoId
}
}).then((movie) => {
if (movie) {
res.render('admin/movies/edit', {
title: 'Edit Movie On Page One',
movie
});
} else {
// either the if is not necessary or you have to also handle the else cases
// send some error response
res.send('error')
}
});
} catch (err) {
// send some error response
res.send('error')
}
}
Комментарии:
1. Ваш первый пример действительно не следует предлагать, потому что смешивание
await
и.then()
то, как вы себя ведете,-это сбивающий с толку анти-шаблон, а не то, что вы должны рекомендовать или показывать. Либо идите все.then()
,.catch()
либо всеawait
иtry/catch
.2. @jfriend00 Я полностью согласен с этим, поэтому я добавил второй пример. Но я думаю, что это сильно изменяет исходный код, что иногда затрудняет отслеживание того, где были проблемы в исходном коде. Но я меняю порядок блоков кода.
3. т. нисе ты потрясающая, я понял свою проблему с кодингом, я позабочусь об этом в будущем
await then