Supertest发送HTTPS POST请求时Body未定义等问题求助
解决你在Supertest中遇到的三个问题
嘿,我来帮你逐个拆解这些问题,结合你的代码来分析:
1. 为什么req.body的值是undefined?
这是因为Express默认不会自动解析JSON格式的请求体,你需要手动添加解析中间件。你的代码里没有配置这个环节,所以Express无法识别POST请求里的JSON数据,自然req.body就是undefined了。
解决方法:
在定义路由之前,加上express.json()中间件:
const app = express(); // 添加这行代码,解析JSON请求体 app.use(express.json()); // 之后再定义你的路由 app.post('/failService', function(req, res) { console.log('failService: ', req.body); // 现在就能拿到{name: 'john'}了 res.send('hello'); });
2. 命令行查看和检查对象的实用技巧
这里有几个我常用的方法,能让你更清晰地查看对象内容:
- 用
JSON.stringify()格式化输出:把对象转成带缩进的JSON字符串,可读性拉满:console.log('failService: ', JSON.stringify(req.body, null, 2)); - 用Node.js内置的
util.inspect():支持显示嵌套对象的完整层级,还能加颜色高亮:const util = require('util'); console.log('failService: ', util.inspect(req.body, { depth: null, colors: true })); - 开启Node.js调试模式:如果需要深度调试,运行测试时加上
--inspect参数:
然后打开Chrome浏览器访问mocha supertest.js --inspectchrome://inspect,就能断点调试,直观查看对象的所有属性。
3. 为什么测试没有打印出"hello"?
你的代码里res.send('hello')返回的是纯文本响应,但Supertest默认会尝试把响应解析成JSON(尤其是你设置了Accept: /json/请求头),所以res.body其实是空对象(或者undefined),而真正的响应文本存在res.text属性里。
解决方法:
把测试里的console.log改成读取res.text:
.end(function(err, res) { if (err) return done(err); console.log('response: '+res.text); // 现在就能打印出"hello"了 done(); });
如果想让响应是JSON格式,也可以把后端的res.send('hello')改成res.json({ message: 'hello' }),这样res.body.message就能拿到"hello"了。
内容的提问来源于stack exchange,提问作者otembajelle
相关产品推荐
相关产品推荐

