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

Express/JavaScript报错TypeError: res.json is not a function求助

解决服务器端 TypeError: res.json is not a function 错误

嘿,这个报错我太熟了,大概率是服务器端的几个常见小问题导致的,给你梳理一下排查方向和解决方案:

1. 先检查请求处理函数的参数顺序

Express的请求处理函数参数是**(req, res, next)**,如果不小心把顺序搞反写成(res, req),那第一个参数其实是请求对象req——它根本没有json()方法,自然会报错。

举个错误的例子:

// controller.js 里的错误写法
exports.getYourData = (res, req) => {
  // 这里的res其实是req,调用res.json肯定报错
  res.json({ status: 'success', data: [] });
};

改成正确的顺序就好:

// controller.js 正确写法
exports.getYourData = (req, res) => {
  res.json({ status: 'success', data: [] });
};

2. 确认路由里没有直接执行controller函数

如果你的server.js里配置路由时,不小心直接执行了controller的函数(加了括号),而不是传递函数引用,那Express的req和res就不会被正确传入,导致res不是预期的响应对象。

错误示例:

// server.js 错误写法
const yourController = require('./controller');
app.get('/api/your-data', yourController.getYourData()); // 这里加了括号,直接执行了函数

正确的写法是去掉括号,传递函数本身:

// server.js 正确写法
const yourController = require('./controller');
app.get('/api/your-data', yourController.getYourData); // 让Express自动传入req/res

3. 排查中间件有没有覆盖res对象

如果有自定义中间件不小心把整个res对象替换成了自定义对象,也会丢失json()方法。比如这种错误的写法:

app.use((req, res, next) => {
  // 错误:直接替换了res对象,新对象没有json方法
  res = { user: req.user };
  next();
});

正确的做法是给res添加属性,而不是替换整个对象:

app.use((req, res, next) => {
  res.locals.user = req.user; // 给res的locals加属性,不会影响原有方法
  next();
});

4. 快速排查小技巧

在controller的GET函数开头加一句console.log(res),看看输出的是不是Express的响应对象——正常情况下它应该包含json、send等方法。如果输出的是普通对象或者undefined,那就能定位到问题出在参数传递环节。

另外也可以检查下Express的版本,确保是兼容的稳定版本,避免旧版本的API差异问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:01:03