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

后端新手求助:POST请求更新SQL用户信息遇name字段非空错误

问题排查与解决

核心原因:mode: 'no-cors' 导致请求无法被正确解析

你前端请求里设置了mode: 'no-cors',这个模式下浏览器会强制将请求的Content-Type改为text/plain,且限制请求体格式,后端的jsonParser无法解析这种请求体,导致req.body为空,name变量自然是undefined,触发SQL的Column 'name' cannot be null错误。而Postman不受浏览器跨域规则限制,所以能正常调用API。

解决步骤

1. 移除mode: 'no-cors',后端配置跨域支持

  • 前端代码删除mode: 'no-cors'行:
fetch(url, {
    // 删掉这一行:mode: 'no-cors',
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({
        "name": 'Nikitosik',
        "scnmb": 5
    })
})
  • 后端安装并启用跨域中间件:
    先安装依赖:
    npm install cors
    
    在API代码中引入并使用:
    const cors = require('cors');
    app.use(cors()); // 放在路由定义之前
    

2. 修复前端DOM元素获取时机问题(规范写法)

初始代码中在DOMContentLoaded事件外提前获取输入框值,此时DOM未加载完成,会导致name和school变量为undefined,应把变量获取逻辑放到点击事件内部:

btn.addEventListener('click', function () {
    // 点击时再获取输入框最新值
    let name = document.getElementById('text1').value;
    let school = document.getElementById('text2').value;
    console.log(name, school);
    // 后续请求逻辑...
})

3. 后端代码优化建议(提升稳定性)

  • 不要每次请求创建新数据库连接,改用连接池:
    const pool = mysql.createPool({
        host: 'localhost',
        user: 'root',
        database: 'testdb',
        password: ''
    });
    // 后续用pool.query代替conn.query,无需手动管理连接
    
  • 错误处理避免重复发送响应,比如conn.connect中发送错误响应后,后续事务逻辑不要再发送响应,防止报错。

验证方法

修改后重启后端和前端,点击按钮发送请求,查看后端控制台的req.body输出,若能正确拿到name和scnmb的值,问题即解决。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:53:21