Использование jsdom и обновление при каждой переменной запроса POST с элементами, но не работает

у меня проблема, что моя функция ответа не обновляет переменную, которая берет элемент из файла:

Почтовая функция:

app.post("/profile", function(req, res) {
var id = req.body.playerid;
request("https://statsroyale.com/profile/" + id).pipe(fs.createWriteStream('stats.html'));
var wins1 = document.getElementsByClassName('statistics__metricCounter ui__headerExtraSmall statistics__trophyMetric');
var wins = wins1[0].innerHTML;
res.render("profile", {person: id, wins: wins}); });

Функция jsdom.env (которая устанавливает файл один раз в начале):

jsdom.env({
file: 'stats.html',
done: function (err, window) {
    GLOBAL.window = window;
    GLOBAL.document = window.document;
}

});

Но затем, если я запрошу другой идентификатор, он покажет мне старый элемент

СРЦ:

 var express = require("express");
var app = express();
var bodyParser = require('body-parser')
var request = require("request")
var fs = require("fs");
var $ = require("jquery");
var jsdom
try {
  jsdom = require("jsdom/lib/old-api.js"); // jsdom >= 10.x
  const { JSDOM } = jsdom;
} catch (e) {
  jsdom = require("jsdom"); // jsdom <= 9.x
  const { JSDOM } = jsdom;
}
app.use( bodyParser.json() );
app.use(bodyParser.urlencoded({
  extended: true
}));
app.set("view engine", "ejs");
app.get("/", function(req, res) {
    res.render("home");
});
app.post("/profile", function(req, res) {
    var id = req.body.playerid;
    jsdom.JSDOM.fromURL("https://statsroyale.com/profile/" + id).then(dom => {
      var wins1 = dom.window.document.getElementsByClassName('statistics__metricCounter ui__headerExtraSmall statistics__trophyMetric');
      var wins = wins1[0].innerHTML;
      res.render("profile", {person: id, wins: wins});
    });
});
app.get("/profile", function(req, res) {
    var id = req.query.playerid;
    res.render("profile", {person: id});
});
app.listen(3000);

person NightScap3    schedule 20.06.2017    source источник
comment
Не делай этого try catch. Я не знаю, кто сказал вам это сделать, но это мешает вам получить доступ к удобному методу fromURL. Просто сделай var jsdom = require('jsdom');   -  person Patrick Roberts    schedule 20.06.2017
comment
Хорошие работы сейчас!   -  person NightScap3    schedule 20.06.2017


Ответы (1)


Настройка среды jsdom выполняется только один раз. Вам потребуется использовать fs.watchFile(), чтобы отслеживать любые изменения, которые происходят с файлом и повторно инициализируют среду каждый раз, когда вызывается обратный вызов. Кроме того, вам нужно убедиться, что

var wins1 = document.getElementsByClassName('statistics__metricCounter ui__headerExtraSmall statistics__trophyMetric');
var wins = wins1[0].innerHTML;
res.render("profile", {person: id, wins: wins}); });

не вызывается до тех пор, пока не завершится асинхронный pipe и не будет повторно инициализирован jsdom с обновленным файлом.

Обновлять

Еще проще: вместо использования глобального dom, инициализированного из локального HTML-файла, вы можете вызывать jsdom непосредственно из URL-адреса. :

jsdom.JSDOM.fromURL("https://statsroyale.com/profile/" + id, options).then(dom => {
  var wins1 = dom.window.document.getElementsByClassName('statistics__metricCounter ui__headerExtraSmall statistics__trophyMetric');
  var wins = wins1[0].innerHTML;
  res.render("profile", {person: id, wins: wins});
});
person Patrick Roberts    schedule 20.06.2017
comment
Хорошенький, Спасибо! - person NightScap3; 20.06.2017
comment
Но это показывает, что нет никакого метода, подобного fromURL()... Я не знаю, что делать - person NightScap3; 20.06.2017
comment
Я бы предположил, что ваш сервер падает, а не отстает. Вы вызываете .substring(...) для dom.window.document.getElementsByClassName(...), который не является строкой. - person Patrick Roberts; 20.06.2017