2016-11-29 15 views
0

私はコーディングの初心者です。nodejs http要求が固まった

私は多くのウェブページを掻き集めたいので、私のコードがあります。 最初のものは、ホストとパスの2つの引数をとります。 forEachによって2番目の関数 'getXml'が呼び出され、ホストとパスを指定してWebページを1つずつスクレイプします。

通常は動作し、ウェブページを取得できないとエラーメッセージが表示されます。しかし、時にはそれは何のエラーも表示されず、プログラムはちょうどそこに止まった。 2つ目のコードに2つのconsole.logを追加して、何が起こるかを確認します。 console.log( 'chunk done'); console.log( 'http end'); プログラムが再び停止したとき。 コマンドラインにメッセージが

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

インターネット接続(時にはuntable)なのですか?もしそうなら、このような状況にどう対処するのですか?

誰かが私に助けを与えてアドバイスしますか?私はそれを非常に感謝しています。ありがとうございました。

マイノードのバージョンがV7.2.0

であり、私はまた、以下のモジュールを使用します。 「6.16.0」、「バベルプリセット最新」:「6.16.0」、「バベルプリセットステージ0」:「6.16.0」、「バベルプリセット」、「バベルプリセット」、「バブルプリセット」、 「: "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); 
    }); 
    }); 
}; 

答えて

0

私は10秒後にリクエストを中止し、で約束を拒否したsetTimeout()を追加します同時。有用かどうかわからない。

セカンドコード:

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); 
    }); 
    }); 
}; 
関連する問題