发送POST请求时遇net::ERR_CONNECTION_REFUSED错误求助
问题描述
- 前端提交用户注册请求(获取JWT Token)时,浏览器网络面板报错:
POST https://localhost:8000/auth/registration net::ERR_CONNECTION_REFUSED,控制台输出Fetching data error: AxiosError: Network Error - Postman测试时收到错误:
Error: connect ECONNREFUSED 127.0.0.1:5000 - 已确认端点路径正确,授权逻辑、Node.js数据库服务均正常运行,更换端口无效果,自行编写的端口检测代码显示目标端口未开放
附server.js代码:
const express = require("express") const mongoose = require("mongoose") const authRouter = require("./routes/authRouter.js") const net = require("net") const PORT = 8000 const app = express() app.use(express.json({ extended: true})) app.use("/auth", authRouter) const DB_URL = `mongodb+srv://yurailchshyn:register@jwttodo.xvuveru.mongodb.net/?retryWrites=true&w=majority` app.get("/getter", (req, res) => { res.status(200).json({message: "Hello"}) }) class PortChecker { async testPort(port, host) { return new Promise((resolve, reject) => { const socket = new net.Socket() socket.on("connect", () => { socket.destroy() resolve("yes") }) socket.on("timeout", () => { socket.destroy() resolve("no (timeout)") }) socket.on("error", () => { socket.destroy() resolve("no (error)") }) socket.connect(port, host) }) } } app.get("/something", (req, res) => { try { res.status(200).end("Some hello") } catch(error) { res.status(500).json({message: "something went wrong"}) } }) let pc = new PortChecker pc.testPort(5000, "127.0.0.1").then((result) => { console.log(`Is port open? ${result}`) }).catch(error => { console.log("Fatal error", error) process.exit(1) }) const start = async () => { try { await mongoose.connect(DB_URL) app.listen(PORT, () => console.log(`Server is working on PORT: ${PORT}`)) } catch (error) { console.log("Server is not working!!!", error) } } start()
排查与解决方案
1. 端口不一致问题
代码中服务器监听端口为8000,但Postman测试的是5000端口,先统一端口:
- 要么修改前端请求和Postman测试的目标端口为
8000 - 要么将代码中
const PORT = 8000改为const PORT = 5000
2. 端口检测时机错误
当前代码在服务器启动前就检测5000端口,此时服务器尚未启动,必然返回端口未开放。需将检测逻辑移至服务器启动成功的回调中:
const start = async () => { try { await mongoose.connect(DB_URL) app.listen(PORT, async () => { console.log(`Server is working on PORT: ${PORT}`) // 服务器启动后再检测当前监听端口 let pc = new PortChecker const result = await pc.testPort(PORT, "127.0.0.1") console.log(`Is port ${PORT} open? ${result}`) }) } catch (error) { console.log("Server is not working!!!", error) } }
3. 数据库连接阻塞问题
若MongoDB连接失败或耗时过长,会导致服务器无法启动。优化数据库连接逻辑,添加状态日志:
await mongoose.connect(DB_URL, { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => console.log("MongoDB连接成功")) .catch(err => console.log("MongoDB连接失败:", err))
同时确认本地网络可正常访问MongoDB Atlas,连接字符串的用户名、密码、集群地址无误。
4. 路由端点验证
检查./routes/authRouter.js中是否正确定义了POST /registration端点,示例正确结构:
const router = require('express').Router(); router.post('/registration', (req, res) => { // 注册逻辑处理 res.status(201).json({ token: "生成的JWT Token" }); }); module.exports = router;
5. 本地端口占用排查
即使更换端口,可能存在其他进程占用目标端口:
- Windows系统:执行
netstat -ano | findstr :8000查看占用进程,通过任务管理器杀掉对应PID的进程 - Linux/macOS系统:执行
lsof -i :8000查看占用进程,执行kill -9 进程PID终止进程
内容的提问来源于stack exchange,提问作者Юрій Ільчишин
相关产品推荐
相关产品推荐

