【问题标题】:Node.js jsdom/express response cache?Node.js jsdom/express 响应缓存?
【发布时间】:2015-10-12 16:19:16
【问题描述】:

我正在尝试创建一个 Express 服务器,它使用路径参数获取数据,然后在 SVG 中呈现。

我的问题是,当使用 REST 客户端对我的路由执行 GET 请求时,我似乎得到了一个缓存响应。如果我重新启动我的节点服务器,我会得到我想要的响应:'/:data' 字符串在我的 SVG 中呈现。任何后续请求都只是返回我启动节点服务器后提交的第一个请求参数。

如果我只是返回req.params.data,它会在我每次提出请求时更新,正如我希望的那样;在 SVG 渲染中使用它时,它不会更新 - 我的“rect”元素保留第一个请求的值。

app.get('/render/:data' controller.render);

Controller.js

exports.render = function(req, res) {

  var output = renderSVG(req.params.data);

  res.send(output);
  res.end();
};

function renderSVG(data) {
  var svg = window.d3.select('body')
    .append('div').attr('id', 'map')
    .append('svg')
    .attr("width", width)
    .attr("height", height);

  svg.append('rect').text(data);

  return window.d3.select('#map').html();
}

我正在使用 D3 和 jsdom 来渲染 SVG 服务器端。

我已经尝试通过使用中间件来确保我的响应中绝对没有缓存:

app.use(function noCache(req, res, next) {
  res.setHeader('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-age=0, max-stale=0, post-check=0, pre-check=0');
  res.setHeader("Pragma", "no-cache");
  res.setHeader("Expires", 0);
  next();
});

还是没用。

我怀疑它与 jsdom 有关...

【问题讨论】:

    标签: javascript node.js d3.js svg jsdom


    【解决方案1】:
    function renderSVG(data) {
      var svg = window.d3.select('body')
        .append('div').attr('id', 'map')
        .append('svg')
        .attr("width", width)
        .attr("height", height);
    
      svg.append('rect').text(data);
    
      return window.d3.select('#map').html();
    }
    

    看起来您总是重复使用同一个窗口。当您执行.append('div').attr('id', 'map') 时,您总是会向该窗口添加一个带有 id 的附加 div,这将导致您的窗口具有多个具有相同 id 的 div。在这种情况下,按 id 选择总是返回它找到的第一个具有该 id 的元素,导致您总是看到相同的输出。

    【讨论】:

      猜你喜欢
      • 2012-03-17
      • 2013-08-29
      • 2016-11-12
      • 2018-03-08
      • 1970-01-01
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      相关资源
      最近更新 更多