【问题标题】:nodejs http request stucknodejs http请求卡住了
【发布时间】:2016-11-29 03:20:36
【问题描述】:

我是编码初学者。

我想抓取很多网页,所以有我的代码。 第一个接受 2 个参数,主机和路径。 它将通过forEach调用第二个函数'getXml',并为其提供主机和路径以逐个抓取网页。

它通常有效,并在无法获取网页时告诉我错误消息。但有时它不会显示任何错误,程序只是卡在那里。我在我的第二个代码中添加了两个 console.log 看看会发生什么, console.log('块完成'); console.log('http 结束'); 当程序再次卡住时。 命令行上的消息是

chunk done
chunk done
chunk done
http end
scrape webpage done(succeed to scrape a webpage)
chunk done
chunk done
http end
scrape webpage done (succeed to scape a webpage)
chunk done
chunk done
chunk done
(somethimes it stucks here, and no message shows, it just don't move on)

我不知道这里发生了什么以及如何解决它。 这个问题类似: request get stuck from nodejs

是因为互联网连接(有时无法连接)吗?如果是,这种情况如何处理?

有人能给我一些帮助和建议吗?我将非常感激。谢谢。

我的节点版本是v7.2.0

而且我还使用以下模块。

“babel-polyfill”:“6.16.0”,“babel-preset-latest”:“6.16.0”,“babel-preset-stage-0”:“6.16.0”,“babel-register” :“6.18.0”

第一个代码:

import {getXml} from './getXml.js';
import fs from 'fs';

export function scrape(host, paths) {    
  let ready = Promise.resolve(null);

  paths.forEach((path, index) => {
    ready = ready.then(() => {
      return getXml(host, path);
    }).then((xml) => {
      // do something with the xml
      // I use fs.writeFileSync to save the xml
      console.log('scrape', host + path, 'done');
    }, (errMessage) => {
      // do somthing if there is error
      // I use fs.appendFileSync to save the err messages
      console.log('scrape failed:', errMessage);
    });
  });
};

第二个代码:

import http from 'http';

export function getXml(host, path) {
  return new Promise((resolve, reject) => {
    let option = {
      "host": host,
      "path": path
    };

    http.get(option, (res) => {
      let xml = '';
      res.setEncoding('utf8');
      res.on('data', (chunk) => {
        xml += chunk;
        console.log('chunk done');
      });

      res.on('end', () => {
        resolve(xml);
        console.log('http end');
      });
    }).on('error', (err) => {
      let errMessage = host + path;
      reject(errMessage);
    });
  });
};

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    我添加 setTimeout() 以在 10 秒后中止请求,同时拒绝 Promise。不知道有没有用。

    第二个代码:

    import http from 'http';
    
    export function getHttpXml(host, path) {
      return new Promise((resolve, reject) => {
        let option = {
          'host': host,
          'path': path
        };
        let errMessage = host + path;
    
        // add setTimeout() here
        let timer = setTimeout(() => {
          req.abort();
          reject(errMessage);
        }, 10000);
    
        let req = http.get(option, (res) => {
          let xml = '';
          res.setEncoding('utf8');
          res.on('data', (chunk) => {
            xml += chunk;
          });
          res.on('end', () => {
    
            // add clearTimeout() here
            clearTimeout(timer);
            resolve(xml);
          });
        }).on('error', (err) => {
    
          // add clearTimeout() here
          clearTimeout(timer);
          reject(errMessage);
        });
      });
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2018-10-07
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      相关资源
      最近更新 更多