Express.js返回对象为字符串的原因及res.send返回对象的解决方法
为什么Express的
res.send()返回数组变成了字符串? 这是个很常见的Express新手问题,我来给你拆解一下原因和解决办法:
问题原因
Express的res.send()方法会根据你传入的参数类型,自动推断响应的Content-Type并处理内容:
- 当传入普通对象时,它会默认序列化为JSON,设置
Content-Type: application/json; - 但当传入数组的时候,它会把数组当成HTML片段处理——把数组元素用逗号拼接成字符串,然后设置
Content-Type: text/html,这就导致调用端收到的是纯文本字符串,而不是JSON数组。
解决办法
有两种简单可靠的方式来正确返回JSON格式的数组:
方法1:使用res.json()(推荐)
Express专门提供了res.json()方法来处理JSON响应,不管你传入的是数组还是对象,它都会自动完成JSON序列化,并且设置正确的响应头。修改你的代码只需要把res.send()换成res.json():
const express = require('express'); const router = express.Router(); router.get('/', async function (req, res, next) { const cars = ["Saab", "Volvo", "BMW"]; res.json(cars); // 替换为res.json })
这个方法是Express官方推荐的,因为它处理了很多细节,比如自动处理空值、循环引用(虽然数组一般不会有),比手动处理更省心。
方法2:手动设置响应头并序列化(不推荐,但了解也有用)
如果你一定要用res.send(),可以手动把数组转成JSON字符串,同时设置Content-Type为application/json:
const express = require('express'); const router = express.Router(); router.get('/', async function (req, res, next) { const cars = ["Saab", "Volvo", "BMW"]; res.setHeader('Content-Type', 'application/json'); res.send(JSON.stringify(cars)); })
不过这种方式需要自己处理序列化,不如res.json()简洁,所以一般没必要这么做。
内容的提问来源于stack exchange,提问作者chaitu
相关产品推荐
相关产品推荐

