2016-06-27 52 views
0

我使用NodeJS創建了一個API。每個請求都會返回一個JSON。有些請求調用python腳本,我想將由python生成的JSON發送給用戶。該代碼將如下所示:NodeJS從python流式傳輸JSON

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)... 
}); 

不過,我不希望加載所有的標準輸出中的變量。但如果我不這樣做,我可以檢查標準輸出是否是JSON。 我可以強制python打印只是json嗎?。總是使用json.dumps和全局try catch就足夠了?

謝謝。

+0

只需檢查它是否爲JSON,'stdout'是一個字符串,所以用'JSON.parse'解析它。如果失敗,它不是JSON結構 – Yerken

+0

chunk包含stdout的一部分。所以,也許它不是JSON。 chunk1 = {...'color':'bl; chunk2 = ue'...; chunkN = ...}。 –

回答

1

而不是使用spawn的,你可能想使用exec,這將等待Python的進程退出併爲您提供它的輸出(你可以隨後嘗試解析爲JSON):

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輸出中使用大小限制。另外,通過這種方式,您將擁有變量中的所有stdout ...我更喜歡使用塊。 –

+0

那麼如果你不先讀它,你是如何測試輸出的有效性的? – robertklep

+0

是的,這是不可能的。解決方案是強制python只寫json –

0

所以你需要一個NodeJS中的流式JSON驗證器。問題是,如果您開始通過網絡傳輸JSON數據,並在JSON中途發現錯誤,則無法將通信回滾到http標頭,並將200 ok更改爲500 ise。如果您想首先檢查輸出,則必須在發送之前將其累積在服務器中。

你現在的代碼會做同樣的事情。如果發生錯誤事件,客戶端將收到一個200 ok,並在最後有一個半stdout和一個json對象。 (或者,如果您在發送狀態碼後嘗試設置狀態碼,則響應對象會拋出錯誤,我不知道這種情況如何處理。)