You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HTTP请求返回空Map问题:如何正确返回嵌套Map与布尔值

解决Express+Axios POST请求中Map返回为空的问题

问题根源

你的代码存在三个核心错误:

  1. Axios请求体格式错误:POST请求的body内容被错误包裹在params字段中,params是用于设置URL查询参数的,而非请求体。
  2. 服务器端请求体读取路径错误:客户端传参结构错误,导致req.body.params.names无法获取到有效数据,最终Map没有被填充。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:50:30