redux 使用Body.json()promise处理非JSON响应

mzsu5hc0  于 2023-11-19  发布在  其他
关注(0)|答案(3)|浏览(134)

我试图创建一个方案来拦截和处理来自API中间件的请求,然而,无论出于何种原因,我无法正确处理来自我的API端点的非JSON响应。下面的片段对于JSON格式的服务器响应很好,但是假设用户有一个无效的令牌,服务器返回一个简单的Unauthorized Access响应,即使我向json()提供错误回调,我也无法处理它promise。在以下方案中,未授权访问响应消息丢失。

  1. const callAPI = () => { fetch('http://127.0.0.1:5000/auth/', {
  2. method: 'GET',
  3. headers: {
  4. 'credentials': 'include',
  5. 'Accept': 'application/json',
  6. 'Content-Type': 'application/json',
  7. 'Authorization': 'Basic bXlKaGJHY2lPaUpJVXpJMU5pSXNJbVY0Y0NJNk1UUTVPRE15TVRNeU5pd2lhV0YwSWpveE5EazRNak0wT1RJMmZRLmV5SnBaQ0k2TVgwLllFdWdKNF9YM0NlWlcyR2l0SGtOZGdTNkpsRDhyRE9vZ2lkNGVvaVhiMEU6'
  8. }
  9. });
  10. };
  11. return callAPI().then(res => {
  12. return res.json().then(responseJSON => {
  13. if(responseJSON.status === 200){
  14. return dispatch({
  15. type: type[1],
  16. data: responseJSON,
  17. message: success
  18. });
  19. } else if(responseJSON.status === 401) {
  20. return dispatch({
  21. type: type[2],
  22. message: responseJSON.message
  23. });
  24. }
  25. return Promise.resolve(json);
  26. }, (err) => {
  27. console.log(err.toString(), ' an error occured');
  28. });
  29. }, err => {
  30. console.log('An error occured. Please try again.');
  31. });

字符串

zwghvu4y

zwghvu4y1#

尝试使用Body:res.text()的文本方法。

p1iqtdky

p1iqtdky2#

尝试将响应处理代码 Package 在try...catch块中,如下所示:

  1. return callAPI().then(res => {
  2. try {
  3. return res.json().then(responseJSON => {
  4. [...]
  5. catch(e) {
  6. console.error(e);
  7. }
  8. });

字符串
Body.json()在body实际上不是JSON时抛出。因此,您应该在调用json()之前检查body是否包含JSON**。参见https://developer.mozilla.org/en-US/docs/Web/API/Response

p8ekf7hl

p8ekf7hl3#

尝试使用response.clone().json().catch(() => response.text()),如下所述

  1. fetch('/file')
  2. .then(response =>
  3. response.clone().json().catch(() => response.text())
  4. ).then(data => {
  5. // data is now parsed JSON or raw text
  6. });

字符串
通过使用response.clone(),我们可以创建响应的副本以解析为JSON,如果失败,我们将原始响应解析为文本。
感谢 Steven Lambert 的文章JSON with Text FallbackJake Archibald 的详细文章Reading responses

相关问题