HTTP请求返回空Map问题:如何正确返回嵌套Map与布尔值
解决Express+Axios POST请求中Map返回为空的问题
问题根源
你的代码存在三个核心错误:
- Axios请求体格式错误:POST请求的body内容被错误包裹在
params字段中,params是用于设置URL查询参数的,而非请求体。 - 服务器端请求体读取路径错误:客户端传参结构错误,导致
req.body.params.names无法获取到有效数据,最终Map没有被填充。 - Map序列化方式错误:直接使用
JSON.stringify()处理Map会得到空对象(JSON不支持直接序列化Map)。
修正后的代码
客户端代码(Axios请求部分)
// 修正POST请求的传参方式 const serverResponse = axios.post('http://localhost:3000/start', { names: listOfNames // 直接将数组放在请求体根节点 }).then(function (response) { const recievedMap = new Map(Object.entries(response.data.scoreboard)); console.log(recievedMap); }) .catch(function (error) { console.log(error); });
服务器端代码
const express = require('express'); var bodyParser = require('body-parser'); const app = express() app.use(bodyParser.json()); const port = 3000 var listOfNames = []; app.post('/start', async (req, res) => { // 直接读取请求体中的names数组 listOfNames = req.body.names; // 每次请求创建新的Map,避免全局变量污染 const scoreboard = new Map(); for(let i = 0; i < listOfNames.length; i++){ scoreboard.set(listOfNames[i],[]); } // 将Map转换为普通对象后返回(JSON可正常序列化) var responseObj = { gameRunning: true, scoreboard: Object.fromEntries(scoreboard), }; res.status(200).send(responseObj); }); app.get('/', function(req, res, next) { res.send("Welcome to the homepage of bowling"); }) app.listen(port, () => { console.log('Listening to request on port 3000'); });
修正说明
- 客户端:移除
params包裹,直接将names数组作为请求体内容发送,确保服务器能正确读取。 - 服务器端:
- 调整请求体读取路径为
req.body.names,匹配客户端传参结构; - 每次请求新建
scoreboardMap,避免多次请求复用同一Map导致数据混乱; - 使用
Object.fromEntries()将Map转换为普通对象,保证JSON序列化后能传递有效数据,客户端再通过Object.entries()转回Map即可正常使用。
- 调整请求体读取路径为
验证效果
修改后,客户端输入玩家名称后,控制台会输出正确的Map内容:Map(1) { 'dadada' => [] },而非原有的空对象。
内容的提问来源于stack exchange,提问作者macman926
相关产品推荐
相关产品推荐

