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

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)

错误原因分析

  1. 路由调用错误:get(game.getGameData())是直接执行函数,而非传递函数引用。这样函数会在路由初始化时就运行,此时没有请求上下文,req和res都未定义,自然会报错。
  2. 中间件参数顺序颠倒:Express请求处理函数的标准参数顺序是(req, res),你写反成了(res, req),导致实际拿到的请求对象被当成响应对象用,真正的res根本没获取到,调用res.send()自然会提示未定义。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:41:26