Draft.js convertFromRaw报错:Cannot convert undefined or null to object求助
我一眼就看出问题出在哪了——你用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

