首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在React中,是否有一种方法将过滤器应用于通过提取获得的响应?

在React中,是否有一种方法将过滤器应用于通过提取获得的响应?
EN

Stack Overflow用户
提问于 2022-06-19 18:30:08
回答 3查看 106关注 0票数 1

使用React 16.12.0。我们有几个接电话的电话

代码语言:javascript
复制
  const handleFormSubmit = (e) => {
    e.preventDefault()
    if (password != passConfirm) {
      //handle password doesn't match password confirm on submit
      setErrors({passConfirm: ["Must match password"]})
      return
    }
    fetch(REACT_APP_PROXY + '/users/', {
      method: 'POST',
      headers: {'Content-Type': 'application/json', 'Authorization': `Token ${sessionStorage.getItem('token')}`},
      body: JSON.stringify({first_name, last_name, username, password, email})
    }).then((response) => {
      if (response.ok) {
        sessionStorage.setItem('token', response['Refresh-Token'])
        setRedirect(true)
      } else {
        setErrors(response)
        console.log(response)
      }
    })

注意我们有一个".ok“响应的部分

代码语言:javascript
复制
sessionStorage.setItem('token', response['Refresh-Token'])

我们将有许多这样的端点,在这些端点中,我们希望提取这个响应头并将其放在本地存储中。是否有一种更优雅的方法将响应过滤器应用于某些端点以实现此行为,而不是我们现在的做法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-07-01 17:01:54

我不认为这种使用fetch的可能性,除了猴子修补它自己:

代码语言:javascript
复制
const { fetch: originalFetch } = window;

window.fetch = async (...args) => {
  let [url, options] = args;

  // you can run any request logic here

  const response = await originalFetch(url, options);

  // you can run any response logic here

  return response;
};

但是,一定有人已经这样做了,所以我偶然发现了一个npm库取截,您可以用它来做类似的操作:

代码语言:javascript
复制
import fetchIntercept from 'fetch-intercept';

const unregister = fetchIntercept.register({

  response: function (response) {
    // Do something with the response
    if (response.ok) {
      sessionStorage.setItem('token', response['Refresh-Token'])
    }
    return response;
  },

});

// you can call unregister if you don't want run the interceptor anymore
unregister();    

请注意以下几点:在第一次使用fetch-intercept fetch (第一次)之前,需要要求。

票数 1
EN

Stack Overflow用户

发布于 2022-06-20 04:03:47

如果您愿意从fetch切换到axios,您可以使用拦截器并在全局处理它。

代码语言:javascript
复制
import axios from 'axios'

axios.interceptors.response.use(response => {
  if (response.headers['Refresh-Token']) {
    sessionStorage.setItem('token', response.headers['Refresh-Token'])
  }

  return response
})

参考资料:https://axios-http.com/docs/interceptors

票数 0
EN

Stack Overflow用户

发布于 2022-06-28 18:32:04

使用函数。

代码语言:javascript
复制
async function makeHttpCall(successCallbk) {
    var response = await fetch(...arguments);
    if(response.ok) {
        sessionStorage.setItem('token', response['Refresh-Token']);
        successCallback.call();
    } else {
        setErrors(response);
        console.log(response);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72679380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档