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

JavaScript异步函数返回值POST到后端显示为空花括号问题求助

问题原因

1. 前端逻辑冲突,index函数的Promise无法在当前点击流程中resolve

你当前的逻辑顺序完全颠倒:

  • 在SendId组件的点击回调里调用index()后,index()内部会先等待2秒,再给.remove元素新增一次点击事件监听
  • 这个Promise的resolve触发条件是下一次点击.remove时才会执行,因此当前这次点击的请求发送时,await index()永远处于pending状态,拿不到有效值,序列化后的JSON内容异常
  • 另外useEffect没有传空依赖数组,每次组件重渲染都会重复绑定点击事件,会导致同一点击触发多次回调的问题

2. 请求未设置正确的JSON标识头

用XMLHttpRequest发送JSON格式请求体时,没有指定Content-Type: application/json,后端服务无法识别请求体格式,自然解析不出内容,只会得到空对象

3. 后端缺少JSON解析中间件

Express v4.16+ 版本默认不内置解析JSON请求体的功能,需要主动启用express.json()中间件才能正常读取req.body内容


修复方案

第一步:调整前端逻辑,删除冗余的index函数

原来的index函数完全不需要,直接在点击回调中取值即可,修改后代码如下:

export default function SendId(){
    // 传入空依赖数组,仅在组件挂载时绑定一次事件
    React.useEffect(() => {
        const PORT = process.env.PORT || 3001;
        $("#noteDisplay").on("click", ".remove", (e) => {
            // 直接在这里获取你需要的index值
            const indexResult = "hello";
            // 如果你需要拿节点ID就放开下面这行
            // const indexResult = e.currentTarget.parentNode.id - 1;
            const index_note = { index: indexResult }
            const data = JSON.stringify(index_note);
        
            const xhr = new XMLHttpRequest();
            xhr.open('POST', `http://localhost:${PORT}/api/1`, true);
            // 新增JSON格式请求头
            xhr.setRequestHeader('Content-Type', 'application/json');
            xhr.send(data);
            console.log("the data was sent")
        });
    }, []);
    return null;
}

第二步:后端启用JSON解析中间件

在你Express服务的所有路由注册前,添加中间件注册代码:

// 必须放在所有app.post/app.get路由定义之前
app.use(express.json());

app.post("/api/:1", (req, res) =>{
  console.log(req.body);
  // 记得给前端返回响应,避免请求超时
  res.sendStatus(200);
});

内容的提问来源于stack exchange,提问作者king60096009

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:54:02