【发布时间】:2022-02-16 00:09:43
【问题描述】:
嗯,我有点矮。我会尽量清楚地解释我的问题。
我使用 Apollo 客户端进行 GraphQL 查询。我也使用 NextJS。 由于 SEO 原因,我有一个页面需要在服务器端呈现。
所以我有一个getProductFromSlug 函数可以让我执行我的请求。
export const getProductFromSlug = async (slug: string) => {
try {
const { data, error } = await apolloClient.query<{
product: Product
}>({
query: GET_PRODUCT_BY_SLUG_QUERY,
variables: {
slug,
},
})
if (error) {
return { errors: [error.message] }
}
if (!('product' in data) || data.product === null) {
return { errors: ['Product with specified url not found'] }
}
return {
data,
}
} catch (error) {
// @ts-ignore
const formattedErrors: ApolloError = isApolloError(error)
? error.graphQLErrors.map((error) => error.message)
: [`Unhandled error : ${error}`]
return {
errors: formattedErrors,
}
}
}
这里是getServerSideProps 将数据传递到页面
export const getServerSideProps = async (
context: GetServerSidePropsContext
) => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
const requestData = await getProductFromSlug(context.params.slug as string)
return 'errors' in requestData
? { notFound: true, props: requestData }
: { props: requestData }
}
问题是,当我从端点收到 HTTP 代码 500 时,SSR 正在崩溃,而在 Vercel 上,它会导致无服务器崩溃错误。
错误:响应不成功:收到状态码 500 生成页面时发生此错误。任何控制台日志都将显示在终端窗口中
如果需要,这是我的入口点 (_app.tsx):
function MyApp(props: AppProps) {
return (
<ApolloProvider client={apolloClient}>
<RecoilRoot>
<RecoilNexus />
<AuthenticationFromStorage />
<Layout>
<props.Component {...props.pageProps} />
</Layout>
</RecoilRoot>
</ApolloProvider>
)
}
您可以在这里查看我的 Apollo 客户端:https://gist.github.com/SirMishaa/d67e7229307b77b43a0b594d0c9e6943
yarn run dev 的堆栈跟踪(下一个 dev -p 3005):
ServerError: Response not successful: Received status code 500
at Object.throwServerError (C:\Users\misha\Documents\dev\rekk-next\node_modules\@apollo\client\link\utils\utils.cjs:45:17)
at C:\Users\misha\Documents\dev\rekk-next\node_modules\@apollo\client\link\http\http.cjs:31:19
at runMicrotasks (<anonymous>)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
error - uncaughtException: ServerError: Response not successful: Received status code 500
error Command failed with exit code 1.
注意: 在 try and catch 范围内对 console.log 进行了一些尝试后,在 Next SSR 控制台中没有显示任何内容,因此由于某种原因没有捕获 Apollo 的内部错误。
感谢您的帮助,谢谢!
【问题讨论】:
-
你想如何处理前端的 500 错误(如应该向用户显示的内容)?
catch块中捕获的错误还不够吗? -
嗨,即使尝试捕获也不行,ssr 不断崩溃
-
Vercel 中显示的服务器日志是什么?
标签: reactjs graphql next.js apollo apollo-client