Node.js Express路由访问返回cannot GET /报错如何解决
Node.js Express路由失效问题排查修复
核心问题原因
代码本身无语法错误,服务、数据库连接状态正常,路由失效完全是访问路径、请求方式和接口定义不匹配导致的:
- 你在
index.js中把商品相关路由统一挂载到了/products前缀下,根路径/没有定义任何处理逻辑,直接访问http://localhost:3000/返回cannot GET /是符合预期的报错。 - 你发POST请求时既没有加
/products前缀,也没有匹配新增接口的/new子路径,还把POST参数拼接在URL查询串中,完全不符合接口定义规则。
当前代码实际生效的接口列表
- 获取全部商品:GET 请求,访问地址
http://localhost:3000/products - 新增商品:POST 请求,访问地址
http://localhost:3000/products/new,参数需要放在JSON格式请求体中 - 更新商品:PUT 请求,访问地址
http://localhost:3000/products/{待修改的商品ID} - 删除商品:DELETE 请求,访问地址
http://localhost:3000/products/{待删除的商品ID}
隐藏代码bug修复
你的updateProduct控制器方法的catch块漏写了error入参,更新操作出错时会直接抛出error is not defined的引用错误,需要修改:
// 原错误写法 catch{ console.log(error) } // 修改后正确写法 catch(error){ console.log(error) }
验证&优化方法
- 服务启动后,直接在浏览器访问
http://localhost:3000/products,能正常返回商品列表即说明GET路由工作正常 - 用接口测试工具发POST请求到
http://localhost:3000/products/new,请求头设置Content-Type: application/json,请求体传入{"name":"测试商品"},即可正常完成数据新增 - 如果需要访问根路径
/时直接跳转到商品列表,可以在index.js的路由配置部分添加根路径处理逻辑:
// 放在 app.use('/products',products); 语句之后即可 app.get('/', (req, res) => { res.redirect('/products') })
修正后各文件完整代码
connectDB.js
const mongoose = require('mongoose') const URI = process.env.DATABASE; mongoose.connect(URI, { useUnifiedTopology: true } ) .then(()=>console.log("connect")) .catch((error)=> console.log(error)) ;
index.js
const express = require('express') const app = express() const port = 3000 require("dotenv").config({path:".env"}) const bodyParser=require("body-parser") const products = require('./Routes/products') // 连接数据库 require("./ConnectDB"); // 中间件配置 app.use(bodyParser.urlencoded({ extended: false })) app.use(bodyParser.json()) // 路由配置 app.use('/products',products); // 可选:根路径重定向到商品列表 app.get('/', (req, res) => res.redirect('/products')) // 启动服务 app.listen(port,() => { console.log(`listen to http://localhost:${port}`) })
控制器文件 product.js
const Product=require('../Models/Product') exports.getProducts=async(req,res)=>{ try{ console.log("requete",req.body) const products=await Product.find() res.send(products) } catch(error){ console.log(error) } } exports.addProduct=async(req,res)=>{ try{ console.log("requete",req.body) const product= await new Product(req.body).save() res.send(product) } catch(error){ console.log(error) } } exports.updateProduct=async(req,res)=>{ try{ const product=await Product.findOneAndUpdate({_id:req.params.productId},{ $set: req.body }, { new: true }) res.send(product) } catch(error){ console.log(error) } } exports.deleteProduct=async(req,res)=>{ try{ const product=await Product.findOneAndRemove({_id:req.params.productId}) res.send(product) } catch(error){ console.log(error) } }
路由文件 products.js
const express =require('express') const router= express.Router() const {getProducts,addProduct,updateProduct,deleteProduct}=require('../Controllers/product') router.get("/",getProducts) router.post("/new",addProduct) router.put("/:productId",updateProduct) router.delete("/:productId",deleteProduct) module.exports = router
数据模型文件 Product.js
const mongoose = require('mongoose') const productSchema = new mongoose.Schema({ name:{ type:String, required: true } }); const Product = mongoose.model('Product', productSchema); module.exports=Product
内容的提问来源于stack exchange,提问作者user16001720
相关产品推荐
相关产品推荐

