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
相关产品推荐
相关产品推荐

