javascript - NodeJS 使用 axios 可重用 HTTP 请求

标签 javascript node.js express

我必须在我的应用程序中进行大量 API 调用。我有大约 8 万亿次 Axios 调用。

所以我决定为 axious 创建一个辅助函数,并在每次我想要执行 HTTP 请求时将 URL 传递给它。

但是我收到一个错误,这是我的文件:

apiUtils.js:

const axios = require("axios")
const handleError = require('./apiHandleError')
const SERVER_DOMAIN = process.env.HOST;
const AuthorizationHeader = process.env.AUTH
const getHeaders = () => {
    return {
        headers: {
            'Authorization': AuthorizationHeader
        },
    };
};
// HTTP GET Request - Returns Resolved or Rejected Promise
const getRequest = (url) => {
    return new Promise((resolve, reject) => {
        axios.get(`${SERVER_DOMAIN}${url}`, getHeaders())
            .then(response => {
                resolve(response)
            })
            .catch(error => {
                reject(handleError(error))
            });
    });
};
module.exports = getRequest

 //apihandleError.js - Common Error Handler Function
 const handleError = (error) => {
     let {
         status,
         message
     } = error.response;

     switch (status) {
         case 401:
             console.log(status)
             break;
             // do something when you're unauthenticated
         case 403:
             console.log(status)
             // do something when you're unauthorized to access a resource
             break;
         case 404:
             message = ({
                 status: `Couldn't reach Arena Gaming Server. Try again later`,
                 result: 404
             })
             // do something when the resource isnot found
             break;
         case 500:
             console.log(status)
             // do something when your server exploded
             break;
         default:
             // handle normal errors with some alert or whatever
     }
     return message; // I like to get my error message back
 }
 module.exports = handleError

这就是我调用该函数的方式:

const userId = getRequest(`/api/reports/users/${userId}/general`)
  .then(data => {
    console.log(data);
    // do something with User #5
  })
  .catch(errorMessage => {
    console.log(errorMessage);
    // the error has already been handled by handleError
    // the message get's passed here
    // do something like store it in redux, etc.
  });

我收到错误消息结果是:状态:`无法到达 Arena 游戏服务器。稍后再试`, 结果:404

最佳答案

我认为您不需要将已经在另一个 promise 中返回 promise 的 axios.get 包装起来。你可以这样简化

const axios = require("axios");
const handleError = require("./apiHandleError");
const SERVER_DOMAIN = process.env.HOST;
const AuthorizationHeader = process.env.AUTH;
const getHeaders = () => {
  return {
    headers: {
      Authorization: AuthorizationHeader
    }
  };
};
// HTTP GET Request - Returns Resolved or Rejected Promise
const getRequest = async url => {
  try {
    const response = await axios.get(`${SERVER_DOMAIN}${url}`, getHeaders());
    return response;
  } catch (err) {
    return handleError(err);
  }
};

用法可以像您正在使用的那样或async/await

希望这有帮助

关于javascript - NodeJS 使用 axios 可重用 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59647396/

相关文章:

javascript - Mongoose - $并且无法正常运行,需要找到包含这两个项目的数组

json - 如何从 Node 流式传输 JSON?

javascript - 在没有堆栈溢出的情况下在javascript中做无限动画的模式

angularjs - NodeJS 和 Angular 图片上传

javascript - 在 Node js 8 中打印 libuv 线程池大小

node.js - Nodes js AWS sdk 是否自动处理速率限制并重新绑定(bind),或者我是否需要在解析响应后尝试重试

node.js - express.js 路由行为

javascript - require.js POST 请求 spotify web api 返回 "Error parsing json"

javascript - 在IE11上显示黑屏的Create-React-App。错误: SCRIPT5009: 'WebSocket' is undefined and SCRIPT5009: 'Promise' is undefined

javascript - map.getBounds() 奇怪的行为(未捕获的类型错误 : Cannot read property 'getNorthEast' of undefined)