Node.js调用Django REST Framework接口POST返回200但Postgres无数据存入
问题排查原因
前端侧核心问题(概率最高)
- 提交的请求体为空:你当前代码中直接将
document.getElementById('form')获取的DOM对象传入JSON.stringify(),DOM对象无法被序列化为表单键值对,最终发给后端的请求体是{}空对象,后端自然没有有效数据可以入库。 - 判断逻辑完全无效:代码中
x = document.getElementById('Date')拿到的是DOM元素对象,y = x.value是字符串值,两者比较x != y永远为真,这段逻辑无实际作用还增加了排查难度。
修复后的前端提交代码参考:
function handleSubmit(event) { event.preventDefault(); // 正确序列化表单数据 const formEl = document.getElementById('form'); const formData = new FormData(formEl); const data = Object.fromEntries(formData.entries()); fetch('http://127.0.0.1:8000/sender', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(data), }).then(response => response.json()).then(data => { console.log('Success:', data); }).catch((error) => { console.error('Error:', error); }); } const form = document.querySelector('form'); form.addEventListener('submit', handleSubmit);
后端侧可能的问题
- Serializer配置错误或未执行保存:检查DRF的Serializer配置,确认
fields字段包含所有前端提交的字段,且字段名、类型完全匹配;同时检查视图逻辑,确认调用serializer.is_valid()之后执行了serializer.save()方法,漏写save是DRF开发中常见的不入库原因。 - 返回逻辑异常:如果你的视图没有做参数校验,哪怕收到空参数也直接返回200,就会出现状态码正常但无数据写入的情况,建议给Serializer的必填字段加上
required=True配置,调用is_valid时开启raise_exception=True,参数错误时直接返回400方便排查。 - 字段命名不匹配:Django模型默认使用蛇形命名(比如
sender_id),如果前端提交的是驼峰命名(比如SenderId),需要在Serializer中显式指定source参数对应模型字段,否则字段值会被直接丢弃。 - 事务或拦截逻辑问题:如果视图开启了事务管理,需要确认没有异常触发回滚;同时检查是否有中间件、权限拦截逻辑静默拦截了写入操作但仍然返回200。
内容的提问来源于stack exchange,提问作者Sidhartha Bhowmik
相关产品推荐
相关产品推荐

