Как обрабатывать ошибки внутри getServerSideProps в Next.js использование next-connect

#reactjs #next.js #next-connect

#reactjs #next.js #далее-connect

Вопрос:

Я использую Next.js и далее — подключитесь к обработке промежуточных программ.

Но у меня возникают проблемы при попытке обработать ошибки, когда я использую несколько промежуточных программ внутри getServerSideProps .

Это код, который у меня есть внутри getServerSideProps, я только что создал обработчик, используя несколько промежуточных программ, чтобы затем все они запускались, аутентификация прошла успешно, и пользовательские данные должны быть переданы в ответ, но если какой-либо сбой, ошибка должна быть обнаружена и вернуть перенаправление на '/login' страницу.

 import nextConnect from 'next-connect';
import { openDBConnection, retrieveUserInfo } from '@/middlewares/database';
import { verifySessionCookie } from '@/middlewares/firebaseSession';
...
    export const getServerSideProps = async ({ req, res }) => {
        const handler = nextConnect()
            .use(verifySessionCookie)
            .use(openDBConnection)
            .use(retrieveUserInfo);
        try {
            await handler.run(req, res);
            return {
                props: {
                    user: req.user,
                },
            };
        } catch (e) {
            console.log(e);
            return {
                redirect: {
                    destination: '/login',
                    permanent: false,
                }
            };
        }
    }
 

Я не определял какой-либо блок try / catch ни в одном из промежуточных программ, поэтому, если возникает ошибка, ее можно обработать на любой странице api или в блоке getServerSideProps.

Казалось, что все в порядке, когда было только одно промежуточное программное обеспечение, verifySessionCookie ошибка возвращается при await handler.run(req, res) вызове, а затем обрабатывается в блоке catch.

Но при использовании 3 промежуточных программ, как показано в фрагменте кода, если первое промежуточное программное обеспечение завершается с ошибкой ( verifySessionCookie ), ошибка не обрабатывается в блоке catch.

Я пытался выполнить next() вызов в каждом промежуточном программном обеспечении, используя finally предложение), таким образом, ошибка фиксируется внутри getServerSideProps, но:

  • Выполняется verifySessionCookie, он завершается с ошибкой.
  • openDBConnection выполняется, он не завершается сбоем.
  • Выполняется retrieveUserInfo, происходит сбой.

Может быть, я делаю что-то не так здесь, или, может быть, next-connect не предназначен для использования таким образом. Я не знаю, как я могу обработать ошибку в случае, если одно промежуточное программное обеспечение, а все остальное не выполняется. Возможно, мне следует вызывать независимые асинхронные функции с параметрами (req, res) внутри getServerSideProps и прекратить использование этого плагина next-connect.

Ответ №1:

в документации по next-connect говорится, что вы можете добавить onError на свой nextConnect

 function onError(err, req, res, next) {
  logger.log(err);

  res.status(500).end(err.toString());
  // OR: you may want to continue
  next();
}

const handler = nextConnect({ onError });
 

Или в вашем промежуточном программном обеспечении вы можете передать некоторое значение, req чтобы сделать его более настраиваемым.

И в промежуточном программном обеспечении вы можете добавить блок try / catch для передачи разных значений с req

Что-то вроде:

 export const middlewareExample = (req, res, next) => {
  try {
    // ...
    req.condition = {
      status: 'succuss, ...',
      message: '...',
      data: {
        // ...
      }
    }
    next();
  } catch(error) {
    res.status(...).end(...);
    // OR: you may want to continue
    req.condition = {
      status: 'error, ...',
      message: '...',
      data: {
        // ...
      }
    }
    next();
  }
}
 
 export const getServerSideProps = async ({ req, res }) => {
  const handler = nextConnect()
  .use(verifySessionCookie)
  .use(openDBConnection)
  .use(retrieveUserInfo);

  await handler.run(req, res);

  if (req.condation.status === 'succuss') {
    return {
      props: {
        user: req.user,
      },
    };
  } else {
    console.log(req.condation.message);
    return {
      redirect: {
        destination: '/login',
        permanent: false,
      }
    };
  }
})
 

Я надеюсь, что это поможет.