javascript - nodejs http请求卡住

标签 javascript node.js

我是编码初学者。

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

它通常有效,并在无法获取网页时告诉我错误消息。但有时它不会显示任何错误,程序就卡在那里。我在第二个代码中添加了两个 console.log 来看看会发生什么, console.log(' block 完成'); 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

是因为网络连接(有时不稳定)吗?如果是的话,这种情况该如何处理?

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

我的 Node 版本是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);
    });
  });
};

最佳答案

我添加了 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);
    });
  });
};

关于javascript - nodejs http请求卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40857221/

相关文章:

node.js - “npm update -g”, “npm upgrade -g”, “npm install -g npm”和 “n stable”有什么区别?

javascript - 如何使用 jsdom、D3 和 IJavascript 在 Jupyter notebook 中输出 SVG

javascript - 在不使用 ?id=xxx 的情况下单击链接时传递参数

javascript - 如何在网格中使用 ng-repeat

javascript - 类似于 JavaScript 主干的 json 对象匹配的 lambda?

node.js - 如何将在前端创建的 Canvas 动画保存到 Node.js 后端?

javascript - 如何在 SimpleSchema Meteor 中使用自动值定义子文档,而不将其插入到每个父文档插入中?

javascript - 当包含 jquery 移动 CSS 时, Bootstrap 模式触发事件的顺序不正确

javascript - 他们是怎么做到的?使用 Flash 还是什么?

javascript - 使用 Joi、nodejs 验证 header 参数?