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

