2017-01-05 32 views
0

私はnodejsのパーサで作業しています。したがって、私はウェブサイトを要求し、HTMLを解析します。 私はrequire( "htmlparser")で作業しており、リクエストには( 'follow-redirects')。httpが必要です。チャンクが終了するのをNodejs関数が複数回呼び出されました

Writing to the handler after done() called is not allowed without calling a reset()

は、どのように私は待つことができます。今

requestSite(options); 
console.log("Done\n"); 
parser.done(); 

function requestSite(options) { 
http.get(options, function(res) { 
    console.log("Got response: " + res.statusCode); 
    res.setEncoding('utf8'); 
    res.on('data', function (chunk) { 
      parser.parseChunk(chunk.toString('utf8')); 
    }); 
}).on('error', function(e) { 
    console.log("Got error: " + e.message); 
}); 
} 

私の問題はrequestSite機能は、実際に次のエラーが生じ、そのチャンクが完了する前に行う()が呼び出されるということですか?

+0

on( 'end')イベントで呼び出すことができます? – ojf

答えて

0

nodejの非同期性を考慮していません。 requestSiteを呼び出し、moveonを実行して次の文を実行し、requestSiteが実行される前にparser.doneを呼び出します。代わりにこれを行います。

requestSite(options, parser); 
console.log("Done\n"); 

function requestSite(options, parser) { 
http.get(options, function(res) { 
    console.log("Got response: " + res.statusCode); 
    res.setEncoding('utf8'); 
    res.on('data', function (chunk) { 
      parser.parseChunk(chunk.toString('utf8')); 
    }) 
    .on("end", function(){ 
      parser.done(); 
     }) 
}).on('error', function(e) { 
    console.log("Got error: " + e.message); 
}); 
} 
0

よくこれはnode.jsとイベント駆動型アーキテクチャの基本です。あなたはそれが印刷されるべきだと思うだろうと

console.log(1); 
setTimeout (function(err, res) { 
    console.log(2); 
}, 0); 
console.log(3); 

ノードは...パイソンなど、この単純な例で

見PHPのようなラインのプログラミングによって行ないが1,2,3

しかし、これは1,3,2を印刷します。

あなたの例では、HTTPリクエストの「終わり」に

parser.done(); 

を移動する必要があります。 現在、データのチャンクを取得するイベントがあるので、単に onEndなどを使用してください。「parser.done()」を配置しないでください。

関連する問題