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

Express.js MVC模式下request与response对象为undefined报错求助

问题根因

你代码的核心错误出在路由注册逻辑:Express 路由要求传入函数引用作为请求处理程序,而你在routes/products.js中给所有控制器方法加了括号(),相当于在代码加载时就立即执行了这些控制器函数,没有等到请求到来时由Express主动调用,自然无法拿到Express注入的req、res对象,才会出现属性读取undefined的报错。

修复步骤

1. 修正路由注册代码

将routes/products.js中所有控制器方法后的括号全部删除,修改后代码如下:

const express = require('express')
const router = express.Router()
const product = require('../controller/product.js')
const isseller = require('../middleware/auth.js')
const isuser = require('../middleware/auth.js')

router.get('/addproduct', isseller, product.getAddproduct)
router.post('/addproduct', isseller, product.postAddproduct)
router.get('/myproducts', isseller, product.getMyproducts)
router.get('/edit/:productID', isseller, product.getEditproduct)
router.post('/edit/:productID', isseller, product.postEditproduct)
router.delete('/delete/:productID', isseller, product.deleteproduct)
router.get('/:productID', product.getProduct)
router.get('/:productID/reviews', product.getProductreviews)
router.get('/:productID/reviews/create', isuser, product.getCreatereview)
router.post('/:productID/reviews/create', isuser, product.postCreatereview)

module.exports = router

2. 修复其他连带bug

修改完路由后你还会遇到其他报错,同步修正即可:

  • models/products.js 构造函数变量错误:你构造函数的赋值语句使用了未定义的变量title、price等,改为和参数对应:
constructor(prodname, proddesc, prodcategory, prodprice, userid) {
    this.prodname = prodname
    this.proddesc = proddesc
    this.prodcategory = prodcategory
    this.prodprice = prodprice
    this.userid = userid
}
  • controllers/products.js 变量重名错误:导入的模型名和实例化的对象名重复,会导致调用失败,修改实例名:
// 将原代码的const product = new product(...)改为
const newProduct = new product(prodname, proddesc, prodcategory, prodprice, userid)
newProduct
    .save()
    .then(result => {
        console.log(result)
    })
    .catch(err => {
        console.log(err)
    })
  • 避免全局变量污染:你在控制器顶层定义的prodname、userid等变量是全局共享的,多用户访问时会出现数据串扰,把这些变量移到对应的控制器函数内部定义即可。
  • 数据库连接回调参数不匹配:util/database.js中调用callback()时没有传入client对象,index.js里的回调不需要接收client参数,直接删除client形参即可。

内容的提问来源于stack exchange,提问作者Someone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 03:30:01