使用Axios POST请求API遇ECONNREFUSED错误求助
问题描述
我的应用监听4000端口,尝试用axios.post连接5000端口的API地址localhost:5000/api/name/user/validate验证授权令牌,但出现连接80端口被拒绝的错误,API本身运行正常。
错误详情
AxiosError: connect ECONNREFUSED 127.0.0.1:80
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1187:16) {
port: 80,
address: '127.0.0.1',
syscall: 'connect',
code: 'ECONNREFUSED',
errno: -4078,
config: {
transitional: {
silentJSONParsing: true,
forcedJSONParsing: true,
clarifyTimeoutError: false
},
adapter: [Function: httpAdapter],
transformRequest: [ [Function: transformRequest] ],
transformResponse: [ [Function: transformResponse] ],
timeout: 0,
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
maxBodyLength: -1,
env: { FormData: [Function] },
validateStatus: [Function: validateStatus],
headers: {
Accept: 'application/json, text/plain, /',
'Content-Type': 'application/json',
'User-Agent': 'axios/0.27.2',
'Content-Length': 225
},
method: 'post',
url: 'http:localhost:5000/api/name/user/validate',
data: '{"proxy":false,"headers":{"Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2MzA0YmYxZmVhM2RiNDYyYjNhM2FiM2IiLCJpYXQiOjE2NjEyODA2MzksImV4cCI6MTY2MTg4NTQzOX0.ClIS6Z3iYAM1631f59Pgu6Gy1MfZFwnqMEk_IXheAzg"}}'
},
// 省略部分request详情
}
相关代码
const requireAuth = async (req, res, next) => { console.log(authorization); const config = { headers: { 'Authorization': authorization } } // 用认证服务器验证凭证 try{ axios.post('http:localhost:5000/api/name/user/validate', config) .then((response) => { console.log(response); console.log("adssdasd"); return next(); }) .catch((error) => { console.log(error); }) } catch (error) { console.log(error); res.status(401).json({error: "请求未授权"}); } }
问题原因及修复方案
1. URL格式错误
错误日志里的url是http:localhost:5000/...,协议http:后面少了双斜杠//,导致Axios无法识别正确的主机和端口,默认走了80端口(HTTP默认端口)。
2. Axios.post参数顺序错误
axios.post的参数顺序是:url, data, config。你把headers配置当成了请求体data传进去,导致请求体变成了配置内容,同时没有正确设置请求头。
修复后的代码
const requireAuth = async (req, res, next) => { console.log(authorization); const config = { headers: { 'Authorization': authorization } } try{ // 修复URL格式,调整参数顺序:空对象作为请求体,第三个参数传配置 const response = await axios.post('http://localhost:5000/api/name/user/validate', {}, config); console.log(response); console.log("adssdasd"); next(); } catch (error) { console.log(error); res.status(401).json({error: "请求未授权"}); } }
额外检查项
- 如果API不需要请求体,第二个参数传
{}或null都可以 - 用
curl http://localhost:5000/api/name/user/validate测试API是否真的能连通
内容的提问来源于stack exchange,提问作者Milosz

