2016-10-25 1 views
0

Expressとnodejs child_processを使用して、blogFeedPageにリクエストを行い、子プロセスを通してスクレイプし、クライアントに送り返します。ブログコンテンツのJSON表現。 以下のコードスニペットは、クライアントへの応答をどのように処理しているかを示しています。子プロセスから 'exit'イベントと 'error'イベントを処理するための最良の方法がわかりません。私の主な関心事は、レスポンスの送信を二度試みたことですが、クライアントが応答なしで待っているのを避けることも望みます。nodejs子プロセス上のリスナーの場合、ダブル・レスポンス送信の試行を避けるために、レスポンス送信を処理する方法

request.get({ url: blogUrl }, function (err, res, blogFeedPage) { 
if (err) return next({ status: 502, message: 'error while trying to contact the blog feed server' }) 

var child = childProcess.fork(__dirname + '/child.js') 

child.on('message', function (blogFeeds) { 
    child.kill() 
    if (!blogFeeds || blogFeeds && blogFeeds.error) { 
    return next({ status: 503, message: 'Error while trying to parse the blog feed' }) 
    } 
    clientRes.sendSuccess(200, 'success', blogFeeds) 
    res.status(200).send({ status: 'success', data: blogFeeds }) 
}) 

child.on('exit', function (code, signal) { 
    // ??? send response to the Client if not already sent 
    child.kill() 
}) 

child.on('error', function (error) { 
    // ??? send response to the Client if not already sent 
    child.kill() 
}) 

child.send({ html: blogFeedPage }) 
+0

なぜ進捗状況を記録するためのローカル変数を導入しないのですか?応答がすでに送信されている場合はtrueに設定します。 –

+0

ありがとう@ジョナスKöritzしかし、それほどエレガントなソリューションではありません。 – matteo

+0

各メッセージイベントの応答をローカル変数に集約し、終了時に収集されたすべてを送信することもできます。 –

答えて

0

メッセージで子供を殺さないでください。代わりにblogFeedsをcalblackの外に保存してください。次に、終了時にメッセージを送信します。子プロセスにタイムアウトを設定する場合は、最初に空の結果を初期化し、タイムアウト後に子プロセスを終了します。 Exitが実行され、空の結果が返されます(またはエラーメッセージ)。

関連する問題