将JS对象传入res.json()是否可行?res.send传参结果一致原因咨询
问题解答
直接将JS对象传入res.json()完全没问题,这是Express框架推荐的返回JSON响应的标准写法。
你测试时发现res.send(JSON.stringify(docs))和res.send(docs)返回结果一致,是因为Express的res.send方法内部做了兼容处理:当传入参数为非字符串类型的对象/数组时,会自动调用JSON.stringify()进行序列化,同时自动设置Content-Type: application/json响应头,和你手动序列化的效果完全相同。
res.json()是Express专门为返回JSON响应封装的方法,相比直接用res.send有几个明确优势:
- 会自动对JS对象做JSON序列化,无需手动调用
JSON.stringify() - 会统一处理特殊类型的序列化逻辑,比如日期对象、正则对象、
null值等,序列化结果更符合前端预期 - 会自动设置正确的
Content-Type: application/json响应头,避免部分场景下前端解析出错 - 支持配置JSON序列化的全局参数,比如缩进、replacer函数等,拓展性更强
注意你当前服务端代码里写了连续两次
res.send,实际第二行不会执行,因为调用res.send后就已经结束了本次HTTP响应,你观察到的两行效果一致应该是分别注释其中一行测试得到的结果,实际开发中不要重复调用响应方法。
你可以直接把服务端代码改成更简洁的写法,前端代码不需要做任何调整:
app.get("/user/:code", function (req, res) { res.header("Access-Control-Allow-Headers","https://reactproject-oxzef.run.goorm.io") console.log("worked") Id.find({code:req.params.code}).lean().exec(function(err,docs){ // 直接传JS对象给res.json即可 res.json(docs); }) });
内容的提问来源于stack exchange,提问作者K K
相关产品推荐
相关产品推荐

