You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js Express路由访问返回cannot GET /报错如何解决

Node.js Express路由失效问题排查修复

核心问题原因

代码本身无语法错误,服务、数据库连接状态正常,路由失效完全是访问路径、请求方式和接口定义不匹配导致的:

  1. 你在index.js中把商品相关路由统一挂载到了/products前缀下,根路径/没有定义任何处理逻辑,直接访问http://localhost:3000/返回cannot GET /是符合预期的报错。
  2. 你发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)
}

验证&优化方法

  1. 服务启动后,直接在浏览器访问http://localhost:3000/products,能正常返回商品列表即说明GET路由工作正常
  2. 用接口测试工具发POST请求到http://localhost:3000/products/new,请求头设置Content-Type: application/json,请求体传入{"name":"测试商品"},即可正常完成数据新增
  3. 如果需要访问根路径/时直接跳转到商品列表,可以在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:24:15