Express中send函数报错:TypeError: Cannot read properties of undefined (reading 'send')
Express中res.send()未定义问题排查与解决
问题描述
我是后端编程新手,终端提示Express中的send函数未定义,报错指向getGameData函数。我尝试过引入Express、更换函数格式,但问题依旧。更奇怪的是,该位置的所有函数都无法正常工作,哪怕返回其他数据结构也会报错,调整函数结构后还是没解决。
原代码
控制器代码(gameController.js)
var gameData = require('../models/gameData.js'); var player = "ed"; exports.updateGame = function(res,req){ gameData.gameData = req.data; } exports.resetGame = function(){ res.send(gameData.gameData); } exports.getGameData = function(res,req){ gameData.gameData.playerNames.me = player; res.setHeader('Content-Type','text/plain'); res.send(gameData.gameData.playerNames.me); }
路由配置代码
//all required js for Part 2 var game = require('./controllers/gameController'); var setup = require('./controllers/setupController'); var topTen = require('./controllers/topTenController'); // all routes // game data routes app.route('/api/gameData') .get(game.getGameData()) .patch(game.updateGame)
错误原因分析
- 路由调用错误:
get(game.getGameData())是直接执行函数,而非传递函数引用。这样函数会在路由初始化时就运行,此时没有请求上下文,req和res都未定义,自然会报错。 - 中间件参数顺序颠倒:Express请求处理函数的标准参数顺序是
(req, res),你写反成了(res, req),导致实际拿到的请求对象被当成响应对象用,真正的res根本没获取到,调用res.send()自然会提示未定义。 - resetGame函数缺少参数:
resetGame没有接收req和res参数,直接使用res必然会报错。
修正后的代码
修正后的控制器代码
var gameData = require('../models/gameData.js'); var player = "ed"; // 修正参数顺序:req在前,res在后,同时添加响应返回 exports.updateGame = function(req, res) { gameData.gameData = req.data; res.status(200).send('游戏数据已更新'); } // 添加req和res参数 exports.resetGame = function(req, res) { res.send(gameData.gameData); } // 修正参数顺序:req在前,res在后 exports.getGameData = function(req, res) { gameData.gameData.playerNames.me = player; res.setHeader('Content-Type','text/plain'); res.send(gameData.gameData.playerNames.me); }
修正后的路由配置代码
//all required js for Part 2 var game = require('./controllers/gameController'); var setup = require('./controllers/setupController'); var topTen = require('./controllers/topTenController'); // all routes // game data routes app.route('/api/gameData') // 去掉括号,传递函数引用,让Express在请求到来时自动传入req和res .get(game.getGameData) .patch(game.updateGame)
额外提示
- 所有Express请求处理函数必须遵循
(req, res[, next])的参数顺序,这是框架的约定,不能随意调换。 - 路由中注册处理函数时,只需要传递函数名(不要加括号),否则会立即执行函数而非等待请求触发。
- 每个请求处理函数都应该返回响应(比如
res.send()、res.json()等),避免客户端一直处于等待状态。
内容的提问来源于stack exchange,提问作者Adavis
相关产品推荐
相关产品推荐

