ajax异步请求,但是express req.json 返回数据后,将html字符串插入到元素中出现了引号,可咋办?
发布于 9 年前 作者 ZhangHang-z 5077 次浏览 最后一次编辑是 8 年前 来自 问答

使用marked将markdown转换为html

转换后的html字符串

"<p><strong>优秀的美剧学习平台</strong></p><p><br/>是一个美剧的学习交流的平台。</p><p><br/></p>"

后台路由

router.get('/explain', function(req, res) {
  if (req.query['WhichExplain'])
  {
    var filename = '/path/' + req.query['WhichExplain'] + '.md';
    fs.readFile(filename, 'utf-8', function(err, data) {
      if (err){
        console.log(err);
      } else {
        var text = mark(data);
        res.json(text.toString().replace(/\s+/g, ''));   // 去除了换行符\n
      }
    });
  }
  else   // 默认渲染没有问题
  {
    fs.readFile("/path/default.md", 'utf-8', function (err, data) {
      if (err) throw err;
      var source = data.toString();
      var about_html = mark(source);
      res.render('explain', {about_content: about_html});
    });
  }
});

前台ajax处理响应

    function XHRReadyState(xhr, Fun){
      return function() {
        if (xhr.readyState == 4) {
          if ((xhr.status >= 200 && xhr.status < 300 || xhr.status == 304)) {
            var content = xhr.responseText;  
            var explainCont = Fun();   // 返回要插入的div对象
            explainCont.innerHTML = content;
          }
          else
          {
            console.log('Request was unsuccessful: ' + xhr.status);
          }
        }
        else
        {
          console.log('正在加载中......' + xhr.readyState);
        }
      };
    }

结果有引号 saasasa

8 回复

那你request default 会出现引号么?

@leapon 这个直接在ejs上面渲染的不会

在 chrome 的 network 里查一下,看两个情况的返回值有什么不同。

@leapon 默认的渲染后元素标签都正常,ajax请求后返回了字符串,然后元素出现了多余的文本节点 Screenshot from 2015-09-30 08:13:50.png

现在只有remove firstChild lastChild 但不知道为什么会多出文本节点,这样的做法感觉不太好

你的后台返回的是一个json的字符串,而不是一个纯的字符串

假设你的json内容是abcdef,那么res.json后的内容实际是"abdef",在前台接受到的时候,你的content实际上是'"abdef"' 那两个引号的出现是因为json把字符串编码了

你需要在前台改为var content = JSON.parse(xhr.responseText);

或者修改后台,使用res.end(text.toString().replace(/\s+/g, ''));,返回一个纯的字符串而不是json

@rapidhere 感谢,问题找到。

这时候res.send蛮好用的,非要用json么

回到顶部