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

Draft.js convertFromRaw报错:Cannot convert undefined or null to object求助

解决Draft编辑器JSON内容传输后损坏的问题

我一眼就看出问题出在哪了——你用application/x-www-form-urlencoded格式发送JSON字符串,但没对JSON做URL编码,导致传输过程中JSON里的特殊字符(比如引号、方括号)被服务器当成了表单参数的分隔符,直接把你的JSON拆得七零八落,存到数据库里自然就残缺不全了,后面解析肯定报错。

下面给你两个靠谱的解决方案,按需求选就行:

方案一:对JSON字符串做URL编码后发送

既然你要坚持用application/x-www-form-urlencoded,那得把JSON里的特殊字符转义成服务器能识别的格式,用encodeURIComponent就能搞定:

const content = this.state.editorState.getCurrentContent();
const raw = JSON.stringify(convertToRaw(content));
// 关键一步:对JSON字符串做URL编码
const encodedRaw = encodeURIComponent(raw);
// 构造符合表单格式的请求体
const formData = `htmlcode=${encodedRaw}`;

// 发送请求
const post = new XMLHttpRequest();
post.open('POST', '/你的接口地址', true);
post.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
post.send(formData);

服务器端拿到req.body.htmlcode后,只要你用了常规的表单解析中间件(比如Express的urlencoded),它会自动帮你解码,直接存这个字符串就行,后面取出来解析也不会有问题。

方案二:改用JSON格式发送(更推荐)

其实你本来就是要传JSON数据,干嘛绕弯子用表单格式?直接设置Content-Type为application/json,把JSON字符串直接发过去,简单又不容易出错:

const content = this.state.editorState.getCurrentContent();
const raw = JSON.stringify(convertToRaw(content));

const post = new XMLHttpRequest();
post.open('POST', '/你的接口地址', true);
// 改成JSON格式的请求头
post.setRequestHeader('Content-type', 'application/json');
// 直接发送JSON字符串
post.send(raw);

服务器端记得配置解析JSON的中间件,比如Express里加一行app.use(express.json()),这样req.body直接就是解析好的JSON对象,你可以直接把它转成字符串存数据库,或者如果你的数据库支持JSON类型(比如MySQL 5.7+、PostgreSQL),直接存对象更方便。

额外提醒:修复已损坏的数据

如果数据库里已经存了那些残缺的JSON,得手动或者写脚本修复——因为现在的内容是不完整的,根本没法正常解析。比如找到那条数据,把残缺的部分补全成正确的JSON格式(比如你例子里缺了]}结尾),之后再用上面的方法重新存储就没问题了。

测试的时候,先在服务器端打个日志,看看收到的htmlcode是不是完整的JSON字符串,确认没问题再存,这样就能避免再踩坑啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:27:05