You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将转义JSON字符串转为JS对象?JSON.parse报错解决

解决Express connect-flash的JSON解析报错问题

嘿,我来帮你搞定这个JSON.parse报错的麻烦!咱们先理清楚问题出在哪,再一步步解决:

问题根源

你遇到的"不是有效的JSON报错,本质是模板引擎的自动HTML转义搞的鬼:

  • 当你用#{JSON.stringify(locals.flashes)}把闪存消息转成JSON字符串嵌入模板时,模板引擎(看起来像是Pug)会自动把HTML特殊字符转义——比如把双引号"转成",把&转成&,最后就生成了{"info":[...]}这种双重转义的字符串。
  • 前端用JSON.parse解析时,根本认不出"这种格式,自然就报错了。

快速解决方法

针对Pug模板(你代码里的script.语法是Pug的写法),只需要把模板里的插值语法从#{}改成!{},禁用自动转义:

if Object.keys(locals.flashes).length !== 0
  script.
    const flashArr = !{JSON.stringify(locals.flashes)};
    // 现在你可以正常使用这个对象,不需要额外JSON.parse了

!{}会直接输出JSON字符串的原始内容,不会转义任何字符,这样前端拿到的就是标准的JSON格式,比如{"info":["Image has been added"],"success":["No success Sorry!"]},自然能被正确识别。

额外安全提示(可选)

如果你的闪存消息里可能包含HTML特殊字符(比如<>"),直接禁用转义可能有XSS风险。这时候可以先在后端对消息内容进行HTML转义,再生成JSON:

// 在Express的中间件里处理flash消息
app.use((req, res, next) => {
  // 初始化locals.flashes
  res.locals.flashes = {};
  // 遍历所有flash类型
  Object.keys(req.flash()).forEach(key => {
    res.locals.flashes[key] = req.flash(key).map(msg => {
      // 转义HTML特殊字符
      return msg
        .replace(/&/g, '&amp;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;')
        .replace(/"/g, '&quot;');
    });
  });
  next();
});

之后模板里还是用!{JSON.stringify(locals.flashes)},这样既保证了JSON结构的正确性,又能安全地把消息插入DOM。

内容的提问来源于stack exchange,提问作者Aditya Raj

火山引擎 最新活动