Node.js jsdom/кеш экспресс-ответов?

Я пытаюсь создать сервер Express, который использует параметр пути для получения данных для последующего рендеринга в SVG.

Моя проблема в том, что при использовании клиента REST для выполнения запросов GET к моему маршруту я, похоже, получаю кешированный ответ. Если я перезапущу свой сервер узлов, я получу желаемый ответ: строка «/: data» отображается в моем SVG. Любые последующие запросы просто возвращают первый параметр запроса, который я отправил после запуска сервера узла.

Если я просто верну req.params.data, он будет обновляться каждый раз, когда я делаю запрос, как я и надеюсь; при использовании его в рендеринге SVG он не обновляется - мой элемент 'rect' сохраняет значение первого запроса.

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

Контроллер.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...


person Joe Withey    schedule 12.10.2015    source источник


Ответы (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'), вы всегда добавляете в это окно дополнительный элемент div с идентификатором, в результате чего в вашем окне будет несколько элементов div с одинаковым идентификатором. В этом случае выбор по идентификатору всегда возвращает первый найденный элемент с этим идентификатором, что приводит к тому, что вы всегда видите один и тот же вывод.

person Sebmaster    schedule 13.10.2015