Node.js Express无法处理POST请求问题排查
问题:Express中POST接口无法通过浏览器直接访问的原因
我编写了如下Node.js Express代码,当使用GET请求方法时,访问http://0.0.0.0:3000/send能正常打印日志“Testing Here”:
const express = require('express') const bodyparser = require('body-parser') const app = express() app.use(bodyparser.json()) const port = 3000 app.get('/send', (req, res)=>{ console.log("Testing Here") }) var server = app.listen(port, () =>{ console.log("listening to port"+port) })
但将请求方法改为POST后,代码如下:
const express = require('express') const bodyparser = require('body-parser') const app = express() app.use(bodyparser.json()) const port = 3000 app.post('/send', (req, res)=>{ console.log("Testing Here") }) var server = app.listen(port, () =>{ console.log("listening to port"+port) })
此时在Chrome浏览器访问http://0.0.0.0:3000/send时,页面报错“Cannot GET /send”,且日志“Testing Here”未打印,请问这是什么原因?
原因分析
- 浏览器地址栏默认发送GET请求:在Chrome地址栏输入URL回车访问时,浏览器会自动发起GET请求,但你的代码仅注册了
/send路径的POST请求处理逻辑,没有对应的GET路由,因此Express找不到匹配的处理函数,返回Cannot GET /send错误,POST接口里的日志自然不会执行。 - Express路由的严格匹配规则:Express的路由是同时匹配请求方法和路径的,只有当请求的方法(如GET/POST/PUT等)与注册的路由方法完全一致,且路径也匹配时,才会触发对应的处理函数。你的POST路由只会响应POST类型的请求,对GET请求无任何处理逻辑。
验证与解决方法
- 测试POST接口:使用Postman、curl等工具发送POST请求到
http://0.0.0.0:3000/send,就能看到控制台打印“Testing Here”。比如用curl命令:curl -X POST http://0.0.0.0:3000/send - 兼容GET请求:如果想要浏览器访问也能触发逻辑,可以同时注册GET和POST的路由处理,示例代码如下:
const express = require('express') const bodyparser = require('body-parser') const app = express() app.use(bodyparser.json()) const port = 3000 // 同时处理GET和POST请求 app.route('/send') .get((req, res) => { console.log("Testing Here (GET)") res.send("Received GET request") }) .post((req, res) => { console.log("Testing Here (POST)") res.send("Received POST request") }) var server = app.listen(port, () =>{ console.log("listening to port"+port) })
内容的提问来源于stack exchange,提问作者Elye
相关产品推荐
相关产品推荐

