关于数据库存储【\】转义字符反斜杠丢失的问题

背景

开始的时候,发现一个很奇怪的现象

富文本编辑器,前端存储带有"的内容,回显的时候解析就会出问题

后来发现,其实是只要是需要带有\进行转义的内容就会有问题

排查

从前端提交数据,后端获取数据,到数据库存储数据,再从数据库查询返回给前端这个过程

PS:我这里的内容因为是一个动态表单,所以是一个数组,里面有一个富文本,我省略了一些无关的数据

  1. 富文本的字段内容为: "<p> <a href=\"2\" target=\"_blank\">12</a> </p>"
  2. 把动态表单arr进行JSON.stringify进行json一遍,结果为<p> <a href=\\"2\\" target=\\"_blank\\">12</a> </p>
  3. 然后前端进行post提交的时候,作为body本身又会被json一次
  4. 但是到了后端,本身又会被parse一次,所以这两次相互抵消
  5. 然后会把<p> <a href=\"2\" target=\"_blank\">12</a> </p>这个存入数据库,这里看起来和我们预期是一样的
  6. 然后关键的来了,存储到数据库之后变成了<p> <a href="2" target="_blank">12</a> </p>,也就是这里丢失了转义
  7. 导致查询返回给前端的时候,变成了<p> <a href=\"2\" target=\"_blank\">12</a> </p>,这里进行parse解析的时候报错了
    我这里贴一下完整的测试数据
    let a = [
      {
        id: 28,
        name: "",
        logo: "",
        arr: '[{"text":"","content":"<p> <a href="2" target="_blank">12</a> </p>"}]',
        create_time: "2024-06-14 11:05:23",
      },
    ];
    JSON.parse(a[0].arr);
    

解决方案

开始的时候本想通过mysql或者express之类的配置解决这个问题,但是没有找到解决方案

最后用一个比较丑陋的方式解决的:就是在存入数据库之前用替换的方式手动增加一个\,这样的话相当于没丢

const realSql = insertSql.replace(/\\/g, "\\\\");

如果有大佬有更好的方案欢迎留言

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-17 18:50:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-17 18:50:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-17 18:50:04       82 阅读
  4. Python语言-面向对象

    2024-06-17 18:50:04       91 阅读

热门阅读

  1. 喜马拉雅项目调整

    2024-06-17 18:50:04       33 阅读
  2. 胡说八道(24.6.16)——数字电子技术以及通信杂谈

    2024-06-17 18:50:04       35 阅读
  3. Docker

    2024-06-17 18:50:04       21 阅读
  4. vue中ref与$parent/$children⽗⼦组件通信例子

    2024-06-17 18:50:04       31 阅读
  5. 微信小程序的常用api

    2024-06-17 18:50:04       27 阅读
  6. 【无标题】

    2024-06-17 18:50:04       25 阅读
  7. [C语言]条件编译

    2024-06-17 18:50:04       26 阅读
  8. 敏捷测试:方法和实践

    2024-06-17 18:50:04       29 阅读
  9. Linux sudo -i取消密码的方法

    2024-06-17 18:50:04       30 阅读