操作完成后需要发送响应

时间:2016-02-28 21:55:36

标签: node.js asynchronous web-crawler imdb

我正在尝试制作一个抓取IMDB并列出电影名称和评级的网络抓取工具。这是我的index.js文件。 假设我正在爬行10部电影。然后我将抓取的结果保存在另一个文件中,例如'message.txt'。现在我想发送此message.txt文件作为对任何请求的响应。但每当我提出请求时,它总是最初向我发送一个空文件到我的浏览器。然后我注意到爬行结果保存在message.txt文件中需要一些时间。我认为这是因为所有动作在nodejs中都是异步的。那么有没有办法在爬行完成后发送message.txt文件?

let cell = UITableViewCell(style: .Subtitle, reuseIdentifier: "defaultCell")

3 个答案:

答案 0 :(得分:0)

fs.appendFile('message.txt', JSON.stringify(json, null, 4) + '\n', function(err) {
//This part is executed after the process has been completed 
});   

您必须在那里进行回调,因为只有在您的操作执行后才会调用该部分。

我们正在使用这里的回调功能,虽然除了我们的错误之外没有任何具体的回调,但我们不需要任何其他的错误。

请尝试。

答案 1 :(得分:0)

fs.appendFile()是异步的,因此当函数返回时,附加到文件的内容不会立即存在。因此,如果您想阅读将该文件发送给用户,则需要在您提供给fs.appendFile()的回调中执行此操作。

app.get('/', function(req, res) {
...
        fs.appendFile(
          'message.txt',
          JSON.stringify(json, null, 4) + '\n',
          function(err) {
            if (err) {
              // Log the error and send a message to the user here
              return;
            }
            res.sendFile(__dirname + '/index.js')
          }
        );   
      };
    });
  };
});

您可能想要使用fs.appendFileSync()。对于命令行工具来说没问题,但由于这是一个Web服务器,所以不要这样做。它会在I / O发生时锁定线程。

答案 2 :(得分:0)

您可以使用非常适合控制流的异步包,例如:

  console.log('Recieved the get Request');
  var i = 1;
  var count = 0;
  while (count < 10) {
    var url = 'http://www.imdb.com/title/tt' + i + '/';
    console.log(url);
    count = count + 1;
    i = i + 1;
    async.waterfall([
        function sendRequest (callback) {
            if (!error) {
                var $ = cheero.load(html);
                var json = {
                    title: '',
                    ratings: '',
                    released: ''
                }
            }
            $('.title_wrapper').filter(function() {
                var data = $(this);
                json.title = data.children().first().text().trim();
                json.released = data.children().last().children().last().text().trim();
            });
            $('.ratingValue').filter(function() {
                var data = $(this);
                json.ratings = parseFloat(data.text().trim());
            });
            callback(null, JSON.stringify(json, null, 4) + '\n');
        },
        function appendFile (json, callback) {
            fs.appendFile('message.txt', json, function(err) {
                if (err) { callback(err); }
                callback();
            });
        }
    ], function(err) {
        res.sendFile(__dirname + '/index.js');
    });