【问题标题】:What do I put in my return if I want to return the response from an api call react?如果我想从 api 调用 react 返回响应,我应该在返回中添加什么?
【发布时间】:2021-03-23 19:44:27
【问题描述】:

我需要在我的 api 调用中添加标头。我尝试了很多不同的方法都无济于事。这是我最初的没有标题的 api 调用:

export default async function FetchPageMarkdown(page: string): Promise<string> {
    const baseUrl = getBackendUrl();
    let response = await fetch(`${baseUrl}/api/pagemarkdown/${page}`);
    let text = await response.text();

    return text
}

这就是我尝试添加标题的方式:

const FetchPageMarkdown = (page: string): Promise<string> => {

  const { getAccessTokenSilently } = useAuth0();

  const callSecureApi = async () => {

    const token = await getAccessTokenSilently();
    const baseUrl = getBackendUrl();
    const response = await fetch(
      `${baseUrl}/api/pagemarkdown/${page}`,
      {
        headers: {
          Authorization: `Bearer ${token}`,
        },
      }
    );

    const text = await response.text();
    return text;
  }

};

export default FetchPageMarkdown;

没有返回值,我得到一个声明类型既不是 'void' 也不是 'any' 的函数必须返回一个值。我想返回来自 Markdown 的 api 调用的文本。如果我将 return 放在 callSecureApi 函数之外,它将找不到文本。

【问题讨论】:

    标签: reactjs header react-hooks fetch auth0


    【解决方案1】:

    您是否尝试过调用并返回异步函数的结果,即return callSecureApi();

    由于 useAuth0 是一个 React 钩子,它不能从函数中调用(违反钩子规则),但它的 getAccessTokenSilently 函数可以传递。

    const fetchPageMarkdown = (getAccessTokenSilently: () => string, page: string): Promise<string> => {
      const callSecureApi = async () => {
        const token = await getAccessTokenSilently();
        const baseUrl = getBackendUrl();
        const response = await fetch(
          `${baseUrl}/api/pagemarkdown/${page}`,
          {
            headers: {
              Authorization: `Bearer ${token}`,
            },
          }
        );
    
        const text = await response.text();
        return text;
      }
    
      return callSecureApi(); // invoke and return Promise
    };
    

    用法:

    const { getAccessTokenSilently } = useAuth0();
    
    fetchPageMarkdown(getAccessTokenSilently, page)
      .then(text => {
        // handle returned text
      });
    

    【讨论】:

    • 是的,我也收到了无效的挂钩调用错误。错误:无效的挂钩调用。钩子只能在函数组件的主体内部调用。我没有使用 const FetchPageMarkdown 函数 FetchPageMarkdown(page: string): Promise
    • @dev_in_training useAuth0 是一个 React 钩子吗?如果是这样,则需要将其移动到功能组件的主体并传递给该函数的值,或者 FetchPageMarkdown 可以重写为自定义钩子。
    • 是的 useAuth0 是一个 React 钩子。我以为我的组件 FetchPageMarkdown 是一个功能组件...
    • @dev_in_training FetchPageMarkdown 看起来是一个常规的 javascript 函数。我更新了我的答案并将其重命名为 fetchPageMarkdown,因为它不是 React 组件。
    猜你喜欢
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多