Node.js调用Flask API遇AxiosError: connect ECONNREFUSED问题排查
问题排查与解决方案
一、连接被拒绝(ECONNREFUSED)的原因及修复
1. 端口不匹配(核心问题)
你描述中称Flask应用运行在localhost:5000,但代码存在明显矛盾:
- Flask代码启动端口为
5003:app.run(host='0.0.0.0', port=5003, debug=True) - Node.js配置文件
config.js中指向的Flask地址是http://localhost:5003/user
修复方式:
- 确保Flask确实运行在
5003端口(启动后检查控制台日志,确认显示Running on http://0.0.0.0:5003); - 或修改
config.js中的端口为5000,与你实际运行的Flask端口保持一致。
2. 其他排查点
- 确认Flask服务正常启动:检查Flask启动终端,是否存在数据库连接失败等导致服务未启动的报错;
- 防火墙/安全软件拦截:本地防火墙或杀毒软件可能阻止了
5003(或5000)端口的请求,可临时关闭测试或添加端口允许规则; - 路由参数类型不匹配(潜在问题):Flask路由
/user/<string:user_id>定义user_id为字符串类型,但User模型中user_id是Integer类型。若请求传入数字ID(如/user/1)会返回404,建议修改路由为/user/<int:user_id>; - URL拼接验证:
config.js已包含/user路径,Node.js拼接/${userId}后最终URL为http://localhost:5003/user/xxx,与Flask路由匹配,此部分无问题。
二、微服务容器化建议
1. 编写Dockerfile
Flask服务的Dockerfile(Dockerfile.flask)
# 使用Python官方基础镜像 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 复制依赖文件并安装 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 暴露服务端口 EXPOSE 5003 # 启动命令 CMD ["python", "app.py"]
需提前创建requirements.txt,包含flask、flask-sqlalchemy、flask-cors等依赖
Node.js服务的Dockerfile(Dockerfile.node)
# 使用Node.js官方基础镜像 FROM node:18-alpine # 设置工作目录 WORKDIR /app # 复制package文件并安装依赖 COPY package*.json . RUN npm install --production # 复制应用代码 COPY . . # 暴露服务端口 EXPOSE 5005 # 启动命令 CMD ["node", "app.js"]
2. 使用Docker Compose编排服务
创建docker-compose.yml,统一管理服务与数据库(以MySQL为例):
version: '3.8' services: flask-api: build: context: ./flask-service dockerfile: Dockerfile.flask environment: - SQLALCHEMY_DATABASE_URI=mysql+pymysql://root:password@db:3306/user_db networks: - microservice-net depends_on: - db node-api: build: context: ./node-service dockerfile: Dockerfile.node environment: - FLASK_MICROSERVICE_URL=http://flask-api:5003/user ports: - "5005:5005" networks: - microservice-net depends_on: - flask-api db: image: mysql:8.0 environment: - MYSQL_ROOT_PASSWORD=password - MYSQL_DATABASE=user_db volumes: - mysql-data:/var/lib/mysql networks: - microservice-net networks: microservice-net: driver: bridge volumes: mysql-data:
3. 容器化关键注意事项
- 服务间通信:容器内的
localhost指向自身,Node.js需通过Docker Compose服务名(如flask-api)访问Flask,而非localhost; - 环境变量替代硬编码:将数据库URI、服务地址等配置放入环境变量,避免代码硬编码,适配不同部署环境;
- 启动依赖顺序:通过
depends_on确保数据库先启动,再启动Flask,最后启动Node.js; - 数据持久化:为数据库配置卷(
volumes),防止容器销毁后数据丢失。
内容的提问来源于stack exchange,提问作者user121443
相关产品推荐
相关产品推荐

