#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,
}
};
}
})
Я надеюсь, что это поможет.