как предотвратить замерзание get route на nodejs expresjs

#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