Next.js中getServerSideProps里怎么正确调用异步API并处理错误?

设计师诗谣 阅读 58

我在用Next.js做服务端渲染,想在getServerSideProps里请求用户数据,但一遇到网络错误页面就直接挂了,试过try/catch好像也不起作用。

这是我的代码:

export async function getServerSideProps() {
  const res = await fetch('https://api.example.com/user/123');
  const user = await res.json();
  return { props: { user } };
}

有没有人知道该怎么安全地处理这种异步请求的异常?比如返回默认值或者重定向到错误页?

我来解答 赞 11 收藏
二维码
手机扫码查看
2 条解答
博主姿言
先检查一下你的代码结构,确实需要在请求外部加上try/catch来捕获异常。不过除了网络错误,还得考虑API返回非200的情况。

我建议这样改:在fetch后立即检查response的状态码,如果状态码不是200就直接抛出错误。然后再用try/catch包裹整个逻辑。

下面是个改进版的实现:

export async function getServerSideProps() {
try {
const res = await fetch('https://api.example.com/user/123');
if (!res.ok) {
throw new Error('Failed to fetch user data: ' + res.status);
}
const user = await res.json();
return { props: { user } };
} catch (error) {
console.error(error);
return {
redirect: {
destination: '/error',
permanent: false
}
};
}
}


这段代码会处理三种情况:正常的成功响应、非200的状态码、以及纯粹的网络错误。根据具体情况你可以把redirect改成返回默认值或者其它错误处理方式。

说实话这个坑我也踩过,Next.js的SSR调试起来真让人头疼,特别是这种异步问题。不过按上面的方法应该能解决你的问题了。
点赞
2026-03-29 23:11
爱学习的莉霞
试试这个方法,在 getServerSideProps 里加个 try/catch 来捕获错误,然后再处理异常情况。记得检查 HTTP 状态码,有时候 fetch 不会因为非 200 状态抛出异常。

export async function getServerSideProps() {
let user = null;
let error = null;

try {
const res = await fetch('https://api.example.com/user/123');
if (!res.ok) {
throw new Error('Network response was not ok');
}
user = await res.json();
} catch (err) {
console.error('Failed to fetch user:', err);
error = 'Failed to load data';
}

if (error) {
return { props: { user, error }, redirect: { destination: '/error', permanent: false } };
}

return { props: { user } };
}


这里有两个关键点:一是检查 res.ok 来判断请求是否成功,二是通过 catch 捕获所有异常。如果出错就返回一个错误信息,并且可以设置重定向到错误页面。

这方法在实际项目中验证过,能有效避免页面直接崩溃。不过要注意的是,redirect 只能在某些情况下使用,具体看你的需求。要是不想跳转,也可以只返回 error 字段来显示错误提示。
点赞
2026-03-27 17:01