我用的是react router dom 6.22.3

我创造了browser router个这样的

{
    path: "/",
    element: <MainLayout />,
    errorElement: <Error />,
    children: [
      {
        path: "/",
        element: <Dashboard />,
        loader: DashbaordLoader,
        errorElement: <Error />,
      },
    ]
}

Dashboard组件中,我正在获取数据.

export const DashbaordLoader = async () => {
  try {
    const data = await fetcher("http://localhost:3000/users", "GET");
    return data;
  } catch (err) {
    throw err;
  }
};

fetcher只是javascript取数函数

export const fetcher = async (url: string, method: string) => {
  try {
    const response = await fetch(url, {
      method, 
      headers: {
        "Content-Type": "application/json",
        Authorization: "",
      },
    });
    return response.json()
  } catch (err) {
    throw err;
  }
};

如您所见,没有Authorization令牌,因此服务器的响应如下所示

状态代码为401

在身体里{error: 'Need to login'}

但这件事是在dashboardLoader美元之内.即使数据是statusCode 401

它不会进入catch block分.当响应为401时,如何使其显示错误元素

以下是postman中的错误响应

enter image description here

推荐答案

这是因为您的抓取器捕获并"处理"了错误,然后简单地返回它.加载程序将其视为正常返回值.

重新抛出错误,以便加载程序可以"捕获并处理"它.

export const fetcher = async (url: string, method: string) => {
  try {
    const response = await fetch(url, {
      method, 
      headers: {
        "Content-Type": "application/json",
        Authorization: "",
      },
    });
    return response.json();
  } catch (err) {
    // handle error, log it, analytics, etc???

    // re-throw error for downstream handlers
    throw err;
  }
};

您可能也希望在加载程序中执行相同的操作,这样就可以抛出错误并将其返回到UIas errors.

export const DashbaordLoader = async () => {
  try {
    return fetcher("http://localhost:3000/users", "GET");
  } catch (err) {
    // handle any logging/etc, and re-throw error
    throw err;
  }
};

Javascript相关问答推荐

foreach循环中的Typescript字符串索引

如何编辑代码FlipDown.js倒计时?

如何解决这个未能在响应上执行json:body stream已读问题?

如何获取转换字节的所有8位?

Cypress -使用commands.js将数据测试id串在一起失败,但在将它们串在一起时不使用命令有效

GrapeJS -如何保存和加载自定义页面

Redux查询多个数据库Api reducerPath&

为什么我的列表直到下一次提交才更新值/onChange

为什么!逗号和空格不会作为输出返回,如果它在参数上?

在react JS中映射数组对象的嵌套数据

XSLT处理器未运行

DOM不自动更新,尽管运行倒计时TS,JS

如果一个字符串前面有点、空格或无字符串,后面有空格、连字符或无字符串,则匹配正则表达式

Phaser3 preFX addGlow不支持zoom

如何修复使用axios运行TSC index.ts时出现的错误?

递增/递减按钮React.js/Redux

如何在Reaction中设置缺省值, Select 下拉列表,动态追加剩余值?

JSX/React -如何在组件props 中循环遍历数组

递归地将JSON对象的内容上移一级

在不使用AJAX的情况下将JavaScript数组值传递给Laravel控制器?