如何在同一端口运行不同端点的Express Node.js服务器?
解决同一端口运行多个Express端点的问题
你遇到的问题本质是:两个独立的Express应用都尝试绑定到8000端口,而操作系统不允许同一端口被多个进程同时监听,所以第二个启动的应用会提示端口被占用。
正确的做法是把两个端点整合到同一个Express应用中,或者通过模块化路由拆分保持代码整洁,而不是启动两个独立的服务器。
方案一:合并为单个应用
把两个路由放到同一个Express实例里,只调用一次app.listen()即可:
const express = require("express"); const cors = require("cors"); const app = express(); const axios = require('axios'); app.use(cors()); process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0; const PORT = 8000; // 天气预报接口 app.get("/WeatherForcast", function (req, res) { axios.get('https://localhost:7173/WeatherForecast') .then(response => { res.status(200).json({ success: true, data: response.data}); }) .catch(error => { console.log(error); res.status(500).json({ success: false, message: '请求失败' }); }); }); // 用户数据接口 app.get("/UserData", function (req, res) { axios.get('https://localhost:7173/UserData') .then(response => { res.status(200).json({ success: true, data: response.data}); }) .catch(error => { console.log(error); res.status(500).json({ success: false, message: '请求失败' }); }); }); app.listen(PORT, function () { console.log(`Server is running on ${PORT}`); });
启动这个应用后,就能同时通过localhost:8000/WeatherForcast和localhost:8000/UserData访问两个接口。
方案二:模块化拆分路由(推荐)
如果想保持代码分离,可把不同路由拆成单独模块,再导入到主应用中:
1. 创建routes/weather.js
const express = require('express'); const axios = require('axios'); const router = express.Router(); router.get("/WeatherForcast", function (req, res) { axios.get('https://localhost:7173/WeatherForecast') .then(response => { res.status(200).json({ success: true, data: response.data}); }) .catch(error => { console.log(error); res.status(500).json({ success: false, message: '请求失败' }); }); }); module.exports = router;
2. 创建routes/user.js
const express = require('express'); const axios = require('axios'); const router = express.Router(); router.get("/UserData", function (req, res) { axios.get('https://localhost:7173/UserData') .then(response => { res.status(200).json({ success: true, data: response.data}); }) .catch(error => { console.log(error); res.status(500).json({ success: false, message: '请求失败' }); }); }); module.exports = router;
3. 主应用文件(如server.js)
const express = require("express"); const cors = require("cors"); const app = express(); const weatherRoutes = require('./routes/weather'); const userRoutes = require('./routes/user'); app.use(cors()); process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0; const PORT = 8000; // 挂载路由模块 app.use(weatherRoutes); app.use(userRoutes); app.listen(PORT, function () { console.log(`Server is running on ${PORT}`); });
这种方式既保持了代码的模块化,又只启动一个服务器,彻底避免端口冲突。
补充:如果确实需要运行两个独立Node进程,只能给它们分配不同端口,再通过反向代理(如Nginx)把不同路径转发到对应端口,但这对你的场景来说属于过度设计,完全没必要。
内容的提问来源于stack exchange,提问作者Avanish
相关产品推荐
相关产品推荐

