使用ThunderClient请求出现Cannot POST /错误,路由或代码有问题?
问题:Express路由配置导致Cannot POST /错误
使用ThunderClient发送请求时出现Cannot POST /错误,切换为GET请求后仍报相同错误,已查阅相关问答未解决,相关代码如下:
Index.js
const connectToMongo = require('./db'); const express = require('express') connectToMongo(); const app = express() const port = 5000 //Available Routes app.use('/api/auth', require('./routes/auth')) // app.use('./api/notes', require('./routes/notes')) app.listen(port, () => { console.log(`Example app listening on port ${port}`) })
auth.js(包含登录和注册逻辑)
const express = require('express'); const User = require('../models/User'); const router = express.Router(); const { body, validationResult } = require('express-validator'); // Create a User using: POST "/api/auth/". Doesn't require auth router.post('/',[ body('name').isLength ({min: 3}), body('email').isEmail(), body('password').isLength ({min: 5}) ], (req, res)=>{ const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } res.send(req.body); }) module.exports = router
user.js(用户数据模型)
const mongoose = require('mongoose'); const {Schema}= mongoose; const UserSchema = new Schema({ name:{ type: String, required: true }, email: { type: String, required: true, unique: true }, password:{ type: String, required: true }, date:{ type: Date, default: Date.now }, }); module.exports = mongoose.model('user', UserSchema);
问题原因与解决方案
核心问题
- 缺少JSON请求体解析中间件:Express默认不会自动解析JSON格式的请求体,
auth.js中需要读取req.body,但未配置express.json()中间件,会导致请求体无法被正常解析。 - 请求路径错误:注册的API路由是
/api/auth,但你可能直接请求了根路径/,而根路径没有对应的路由处理逻辑,所以无论POST还是GET都会返回Cannot [METHOD] /错误。
修复步骤
- 修改
Index.js,添加JSON解析中间件,并可选添加根路径的默认响应:
const connectToMongo = require('./db'); const express = require('express') connectToMongo(); const app = express() const port = 5000 // 新增:解析JSON格式的请求体 app.use(express.json()) //Available Routes app.use('/api/auth', require('./routes/auth')) // app.use('/api/notes', require('./routes/notes')) // 可选:给根路径添加默认响应,避免访问/时报错 app.get('/', (req, res) => { res.send('服务器运行中,请访问正确的API路径,例如POST /api/auth'); }) app.listen(port, () => { console.log(`Example app listening on port ${port}`) })
- 正确测试API:
- 在ThunderClient中选择POST方法,请求地址填写
http://localhost:5000/api/auth - 在请求体中选择JSON格式,传入如下参数:
{ "name": "testuser", "email": "test@example.com", "password": "123456" } - 发送请求后,若参数符合验证规则,会返回你传入的请求体;若参数不符合(比如密码长度不足5位),会返回400状态码和验证错误信息。
- 在ThunderClient中选择POST方法,请求地址填写
内容的提问来源于stack exchange,提问作者Akshay bhasin
相关产品推荐
相关产品推荐

