Как ответить клиенту после обработки данных? (Экспресс + Нодейс) - PullRequest
0 голосов
/ 29 апреля 2018

Я просто не могу ухватиться за обратные вызовы, необходимые для этого. Я застрял на том, как ответить клиенту после получения данных. Пробовал много раз разные способы, но не могу заставить его работать. Помощь очень ценится.

app.get('/update', getdata);

function update(){
    getdata();
    //Wait for data to be fetched then respond to client
};

function getdata(i=0){
  const baseURL = "" //Empty as example

  var targets = ["" ]; //Empty as example

  var urls = targets.map(function(el) { 
    return baseURL + el; 
  })

  var alldata = {};
  if (i < urls.length){
      var url = urls[i]
      var urlsplit = targets[i].split("/");
      var categoryid = urlsplit[0]
      var id = urlsplit[1]

      console.log("Getting " + id)

      request.get(url, function(error, responce, html){
          var productdata = [];
          if (!error){
              let $ =  cheerio.load(html);
              var allitems = $("div.related-box");
              allitems.each(function(index){
                  productdata.push ({
                      "product_name": $(this).find('.name').find('a').text(),
                      "price": $(this).find('.price').children().remove().end().text().replace(/(\r\n|\n|\r)/gm,"").trim()
                  })
              })
              if (!(categoryid in alldata)){
                  alldata[categoryid] = {}; 
              }
                  alldata[categoryid][id] = productdata;
                  getdata(i+1)
          }
      });
  }
  else{
      fs.writeFile('Value.json', JSON.stringify(alldata, null, 2), function(){
          console.log("Data Saved")
      })
  }
};

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Я пытался понять ваш код и то, что вы пытаетесь достичь, а именно сделать несколько асинхронных вызовов (getData) к API, получить ответ и сохранить их во временном объекте (alldata) для последующей обработки. . И записать все данные в файл после выполнения всех вызовов API.

Хотя вам придется использовать res.send и res.end, вам, возможно, придется использовать обещания (см. здесь ) для выполнения нескольких асинхронных вызовов, а затем ждать ответа с любыми данными, которые вы хочу, чтобы после того, как эти обещания были решены или даны ответы.

app.get('/update', update);

function update(req, res) {
    var allAsyncFunctions = [];
    var targets = ...; //Your targets array
    var alldata = {};
    targets.forEach(function(tgt) {
        allAsyncFunctions.push(getData(tgt));
    }, this);
    Promise.all(allAsyncFunctions).then(function(values) {
        fs.writeFile('Value.json', JSON.stringify(alldata, null, 2), function() {
            console.log("Data Saved"); //Wait for data to be fetched then respond to client
            res.json({ "data": "All data saved or updated succesfully" });
        })
    });

};

function getdata(myCurrentTarget) {
    return new Promise(function(res, rej) {
        const baseURL = ""; //Empty as example
        var url = baseURL + myCurrentTarget; // As we are already traversing targets array in update function
        var urlsplit = targets[i].split("/");
        var categoryid = urlsplit[0]
        var id = urlsplit[1]

        console.log("Getting " + id)
        request.get(url, function(error, response, html) {
            var productdata = [];
            if (!error) {
                let $ = cheerio.load(html);
                var allitems = $("div.related-box");
                allitems.each(function(index) {
                    productdata.push({
                        "product_name": $(this).find('.name').find('a').text(),
                        "price": $(this).find('.price').children().remove().end().text().replace(/(\r\n|\n|\r)/gm, "").trim()
                    })
                })
                if (!(categoryid in alldata)) {
                    alldata[categoryid] = {};
                }
                alldata[categoryid][id] = productdata;
                res();
            }
        });

    });
};

НТН.

0 голосов
/ 29 апреля 2018

Добавьте два параметра к функции getData getData(req, res), и когда ваш процесс завершится, отправьте ответ. res.send(your data); res.end();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...