客户端经服务器调用第三方API无法获取X-Auth-Token问题排查
问题描述
尝试通过客户端请求自身Express服务器,再由服务器转发POST请求到第三方API(https://api.remarkets.primary.com.ar/auth/getToken),需在请求头携带用户名和密码,第三方API会在响应头返回X-Auth-Token。但目前通过服务器转发时无法获取该Token,直接用Postman调用第三方API则能正常拿到。
相关代码如下:
服务器代码
app.post("/signin", async (req, res) => { console.log("BODY", await req.body); try { const xToken = await axios.post(loginUrl, { headers: { "Content-Type": "application/x-www-form-urlencoded", "X-Username": req.body.username, "X-Password": req.body.password, }, }); console.log(xToken.headers); //res.send(xToken); } catch (error) { console.log("SERVER Error: ", error.message); } });
客户端代码
const signin = async () => { try { const TOKEN = await axios.post("http://localhost:3000/signin", { username: "AGU", password: "MIOTTI", }); console.log("TOKEN", TOKEN); return TOKEN; } catch (error) { console.log("CLIENT Error: ", error.message); } }; signin();
问题原因与修复
问题核心是Axios调用参数顺序错误:
Axios POST请求的正确语法为:
axios.post(url[, data[, config]])
第三个参数才是包含headers的配置对象,但你将headers配置放在了第二个参数位置,相当于把headers当成请求体(data)发送给第三方API,真正的请求头里根本没有带上X-Username和X-Password。第三方API因未收到身份验证信息,所以未返回X-Auth-Token。
另外,服务器代码注释了res.send(xToken),即便拿到Token,客户端也无法接收响应,这也是需要修复的点。
修正后的服务器代码
app.post("/signin", async (req, res) => { console.log("BODY", req.body); // Express已通过中间件解析req.body,无需await try { // 正确参数顺序:url -> 空请求体 -> 配置对象 const xToken = await axios.post(loginUrl, {}, { headers: { "Content-Type": "application/x-www-form-urlencoded", "X-Username": req.body.username, "X-Password": req.body.password, }, }); console.log(xToken.headers); // 提取Token并返回给客户端 res.send({ token: xToken.headers['x-auth-token'] }); } catch (error) { console.log("SERVER Error: ", error.message); // 错误时返回客户端明确的错误响应 res.status(500).send({ error: error.message }); } });
补充说明
- 无需
await req.body:Express配置body-parser后,req.body已解析完成,无需异步等待。 - 明确返回Token:客户端需要获取Token,服务器需从响应头提取
x-auth-token(HTTP响应头通常为小写)并返回。 - 完善错误处理:catch块中返回错误响应,避免客户端请求处于pending状态。
内容的提问来源于stack exchange,提问作者miouri
相关产品推荐
相关产品推荐

