Узел JS работает на втором или третьем вызове

Я написал сервер node.js, который создает сервер и печатает выходные данные, когда выполняется асинхронная функция. Хотя я всегда могу получить правильный вывод в console.log. То же самое не отражается в моем ответе. Вот мой фрагмент кода:-

var request = require('request');
var http = require('http');
var cheerio = require('cheerio');
var url = require('url');
var Curl = require( 'node-libcurl' ).Curl;
var sleep = require('sleep');
isDone = 0;
globalImage = "";

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  var url_parts = url.parse(req.url, true);
  var query = url_parts.query;
  var main_url = query["link"];
  if (req.url != '/favicon.ico') { 
    res.writeHead(200);

    if(main_url != undefined ){
      var position = parseInt(query["position"]);
     // web_scrap()
     web_scrap(main_url,position, function(image) {

      console.log("Console log : " + image); 
      globalImage = image;

    });
     res.write(globalImage);
     res.end("HEY");
   }
   }
    else {//For favicon and other requests just write 404s
      res.writeHead(404);
      res.write('This URL does nothing interesting');
      res.end();
    }
}).listen(3000, '127.0.0.1');
console.log('Server running at http://127.0.0.1:3000/');


function web_scrap(url, position, callback){
  // do something
  callback(JSON.stringify(product));
}

Теперь при запуске сервера и доступе к нему в браузере с параметрами и позицией как получить, я получаю вывод при втором или третьем обновлении. Я получаю идеальный вывод в console.log, хотя!

Может ли кто-нибудь помочь или направить меня в этом отношении?

Спасибо!

1 ответ

Решение

Из того, что я понимаю, вы загружаете изображение из внешнего источника, асинхронно.

Таким образом, ваша функция продолжает работать, даже если загрузка еще не завершена. И как твой globalImage является глобальной переменной, после загрузки она остается в памяти, поэтому вы получаете данные после нескольких попыток.

Просто переместите ваши res.write и res.end в функцию обратного вызова, таким образом, контент будет отправлен после загрузки изображения.

web_scrap(main_url,position, function(image) {
  console.log("Console log : " + image); 
  globalImage = image;
  res.write(globalImage);
  res.end("HEY");
});

В любом случае, кроме случаев, когда вы хотите кэшировать свое изображение, у вас не должно быть globalImage переменная, так как она останется в памяти, даже если вы хотите, чтобы она собиралась мусором. Вы можете удалить переменную и просто сделать это:

web_scrap(main_url,position, function(image) {
  console.log("Console log : " + image); 
  res.write(image);
  res.end("HEY");
});
Другие вопросы по тегам