后端新手求助: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 }) })
- 后端安装并启用跨域中间件:
先安装依赖:
在API代码中引入并使用:npm install corsconst 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
相关产品推荐
相关产品推荐

