5

複数のページをロードしてコンテンツを分析する node.js でアプリケーションを構築しています。

node.js はチャンクを送信するため、チャンクを分析できます。チャンクにたとえば index,nofollow が含まれている場合、その接続を閉じて残りを続行したいと思います。

var host  = 'example.com',
    total = '',
    http  = require('http');

var req = http.request({hostname: host, port: 80, path: '/'}, function(res) {
    res.on('data', function(chunk) {
        total += chunk;
        if(chunk.toString().indexOf('index,nofollow') == -1) {
            // do stuff
        } else {
            /*
             * WHAT TO DO HERE???
             * how to close this res/req?
             * close this request (goto res.end or req.end????
             */
        }
    }).on('end', function() {
        // do stuff
    });
}).on('error', function(e) {
    // do stuff
    console.log("Got error: " + e.message);
});

私が理解できない唯一のことは、その接続を終了することです。または、データが必要ないため、データの取得を停止します..

req.end(); 機能しません..データ/チャンクの取得を続けます..(私のテストでは14個のチャンクを取得しますが、最初のチャンクで他のチャンクは必要ないことがわかっているので、リクエストを終了したいです/応答)。

私は今、他のチャンクの分析をスキップするブール値を持っていますが、私の意見では、データの取得をスキップする方が良いですか?

どの関数を呼び出すか? それとも、すべてを取得する必要があるため不可能ですか?

4

1 に答える 1

2

私はまだそれをテストしていません、これをあなたのelseブロックに入れることはうまくいくはずです:res.removeAllListeners('data');

基本的に、あなたresEventEmitterObjectの子です。これを呼び出すことによりremoveAllListeners('data')、イベントにバインドされているすべてのハンドラーdataが削除され、コールバックは実行されなくなります。ただし、すべてのデータイベントが通過するのを待つ必要があります。そうしendないerrorと、リクエストでイベントが発行されます。

詳細については、 nodejsEventEmitterのドキュメントもお読みください。

アップデート:

次のように、elseブロック内のオブジェクトに対してendまたはcloseイベントを発行してみてください。イベントのclientResponeオブジェクトに関するドキュメントには、resres.emit('end');res.emit('close');end

応答ごとに1回だけ発行されます。その後、応答で「データ」イベントは発行されなくなります。

于 2013-01-22T13:39:35.423 に答える