2016-06-27 7 views
0

NodeJSでAPIを作成しています。リクエストごとにJSONが返されます。いくつかのリクエストはpythonスクリプトを呼び出し、Pythonで生成されたJSONをユーザーに送信したいとします。コードは次のようになります:PythonからのNodeJSストリーミング

child = child_process.spawn(cmd, args); 

child.stdout.on('data', (chunk) => { 
    res.write(chunk); 
}); 

child.on('error', function(err) { 
    res.status(500).json({...}); 
}); 

child.on('close', (code) => { 
    res.end(); 
}); 

このコードの問題は、Python出力がJSONであるかどうかを確認できないことです。たぶん、Pythonは...警告、エラーを書き込み

私はJSONに別の何かを取得するユーザーを防ぐために何ができます?。

var output = []; 

command.stdout.on('data', (chunk) => { 
    output.push(chunk) 
}); 

command.on('close', (code) => { 
    var stdout = output.join(''); 
    json_cmd = tryParseJSON(stdout) 
    if (json_cmd) 
     res.send(json_cmd)... 
}); 

しかし、私は、変数内のすべての標準出力をロードする必要はありません。今の私のコードがある

EDIT

。しかし、私はそれをしない場合、私はstdoutがJSONかどうかを確認することができます。 pythonにjsonだけを強制的に印刷させることはできますか?。常にjson.dumpsとグローバルなtry catchを使用すれば十分でしょうか?

ありがとうございました。

+0

ちょうどチェックし、あなたの 'stdout'ですJSON.parseで解析します。失敗した場合は、JSON構造体ではありません – Yerken

+0

チャンクはstdoutの一部を含んでいます。だから、JSONではないかもしれない。 chunk1 = {... 'color': 'bl; chunk2 = ue '...;チャンクN = ...}。 –

答えて

1

代わりに(あなたが、その後JSONとして解析しようとすることができます)、その出力であなたを終了して提供するために、Pythonのプロセスを待ちますspawnを、あなたはおそらくexecを使用する場合は、使用しての:

const exec = require('child_process').exec; 
... 
exec(cmdline, (err, stdout, stderr) => { 
    if (err) return res.status(500).json({...}); 
    // Try to parse stdout as JSON: 
    try { 
    res.json(JSON.parse(stdout)); 
    } catch(e) { 
    res.status(500).json({...}); 
    } 
}); 
+0

execにはバッファ制限があります。私はサイズの制限をpythonの出力にしたくありません。また、そのようにして、変数内のすべての標準出力を持つことになります...私はチャンクを使用することを好みます。 –

+0

最初にそれを読まないと、出力の妥当性をどのようにテストしたいのですか? – robertklep

+0

はい、できません。解決策は、Pythonにjsonのみを書き込ませることです –

0

したがって、NodeJSにストリーミングJSON検証ツールが必要です。問題は、ネットワーク経由でJSONデータをストリーミングし、JSONの途中でエラーが見つかった場合、httpヘッダーへのトラフィックをロールバックすることができず、200 ok500 iseに変更することができないということです。最初に出力をチェックする場合は、送信する前にサーバに蓄積する必要があります。

あなたの現在のコードは同じです。エラーイベントが発生した場合、クライアントは半分のstdoutとjsonオブジェクトを最後に200 okを受け取ります。 (または応答オブジェクトは、あなたがそれを送信した後にステータスコードを設定しようと、私はこのケースが処理されるかわからないエラーがスローされます。)それはJSONであれば

関連する問題