Axios发起Basic Authentication请求返回400及Promise报错如何解决
问题分析
- 未处理Promise rejection报错原因:
你使用了Express的异步路由处理函数,在catch块中直接抛出错误,但Express原生无法自动捕获异步函数中抛出的异常,这个抛出的错误没有对应的捕获逻辑,因此触发了UnhandledPromiseRejectionWarning警告。此外你存在变量名冲突的问题:路由处理函数的响应参数已经命名为res,后续axios请求的返回值也命名为res,会覆盖外层的Express响应对象,你直接returnres.data的操作无法将结果返回给客户端,也会引发后续逻辑异常。 - 400 Bad Request原因:
按照Epic Games OAuth2接口的规范,authorization_code模式下需要将client_id和client_secret通过Basic Authentication请求头传递,而非放在请求体中。你当前将client_id、client_secret放在了URLSearchParams请求体中,不符合接口要求,是触发400错误的常见原因。另外你当前仅打印了error.message,无法查看Epic接口返回的完整错误提示,无法定位参数缺失、code无效等其他可能的400原因。
修复方案
修复后代码如下:
import express, { Request, Response, NextFunction } from 'express'; import axios from 'axios'; // 请提前正确赋值client_id和client_secret const client_id = "你的客户端ID"; const client_secret = "你的客户端密钥"; app.post('/epic', async (req: Request, res: Response, next: NextFunction) => { const code = req.query.code as string; const url = "https://api.epicgames.dev/epic/oauth/v1/token"; // 构造Basic Auth凭证 const basicAuth = Buffer.from(`${client_id}:${client_secret}`).toString('base64'); const values = new URLSearchParams({ code, scope: "basic_profile", grant_type: "authorization_code", }); console.log(code, values); try { // 重命名axios返回值,避免和外层res冲突 const axiosRes = await axios.post(url, values, { headers: { "Content-Type": "application/x-www-form-urlencoded", "Authorization": `Basic ${basicAuth}` }, }); console.log(axiosRes.data); // 通过Express响应对象返回结果给客户端 return res.send(axiosRes.data); } catch (error: any) { // 打印完整的错误响应内容,排查400的具体原因 console.error('接口请求错误:', error.response?.data || error.message); // 传递错误给Express错误处理中间件,避免未捕获的Promise异常 next(error); // 也可以选择直接返回错误响应给客户端: // return res.status(400).send({error: error.response?.data || error.message}) } })
额外注意事项
- 确保
client_id、client_secret变量已经提前正确赋值,没有拼写错误 - 确认传递的
code参数没有过期,且是对应OAuth授权流程返回的有效授权码 - 如果仍返回400错误,查看控制台打印的
error.response.data内容,里面会有Epic接口返回的具体错误说明,比如invalid_grant、invalid_client等,可根据对应错误码进一步排查问题。
内容的提问来源于stack exchange,提问作者Mhd
相关产品推荐
相关产品推荐

