Express JS POST请求Postman返回404 Cannot GET错误解决求助
问题原因
1. Cluster模式逻辑错误
Node.js cluster模式下,master进程仅负责管理worker子进程,实际处理HTTP请求的是worker进程。你当前将express实例初始化、中间件注册、路由挂载、端口监听全部写在if(cluster.isMaster)代码块内,worker进程没有任何服务处理逻辑,请求分配到worker进程时无法匹配到对应路由,因此返回404。
2. 请求路径/方法不匹配
报错信息显示Cannot GET /,说明你发起POST请求时要么误选了GET请求方法,要么请求路径错误被重定向到了根路径的GET接口。你定义的POST接口路径为/v1/jp/post_api,注意不要遗漏前缀或写错接口名。
修复方案
第一步:修正server.js的cluster逻辑
将所有express服务相关代码移动到worker进程分支:
require('dotenv').config(); const express = require("express"); const http = require("http"); var addRequestId = require('express-request-id')(); const requestIp = require('request-ip'); const cron = require("node-cron"); const cluster = require('cluster'); const os = require('os'); const v1 = require('./routes/v1'); const jobs = require('./routes/jobs/sync_job'); const bodyParser = require("body-parser"); // 主进程逻辑 if (cluster.isMaster) { const cpuCount = os.cpus().length; // 为每个CPU核心创建一个worker进程 for (let j = 0; j < cpuCount; j++) { cluster.fork(); } console.log("MASTER PROCESS RUNNING"); // 监听worker进程退出,自动重启 cluster.on('exit', function (worker) { console.log(`Worker ${worker.id} died`); console.log(`Starting a new one...`); cluster.fork(); }); // worker进程逻辑:处理实际业务请求 } else { const port = 3000; const app = express(); const server = http.createServer(app); // 注册全局中间件 app.use(addRequestId); app.use(requestIp.mw()) app.use(bodyParser.json({limit: '50mb'})); app.use(bodyParser.urlencoded({limit: '50mb', extended: false})); // 挂载路由 app.use('/v1/jp', require('./routes/report_center')); // 启动服务监听 server.listen(port, () => { console.log(`WORKER ${cluster.worker.id} RUNNING ON PORT ${port}`); }) }
第二步:校验Postman请求配置
- 请求方法选择
POST - 请求地址填写
http://你的服务地址:3000/v1/jp/post_api - Headers中添加
api_key字段,值为数据库client表中存储的有效api_key
可选优化
report_center.js中重复注册了bodyParser中间件,属于冗余代码可直接删除,server.js中已经全局注册过该中间件。
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

