我的Node和Python后端运行得很好,但是现在遇到一个问题,如果我从Python向后发送的JSON没有Node太长,它将被拆分为两个,而我在Node端的JSON.parse失败。
我该如何解决?例如,第一批剪辑在
... [1137.6962355826706, -100.78015825640887], [773.3834338399517, -198
第二个有剩余的几个条目
.201506231888], [-87276.575065248, -60597.8827676457], [793.1850250453127, -192.1674702207991], [1139.4465453979683, -100.56741252031816], [780.498416769341, -196.04064849430705]]}
我是否必须在节点侧为长JSON创建一些逻辑,还是我在Python侧遇到的某种缓冲问题,可以通过适当的设置来克服?这是我在python方面所做的一切:
outPoints, _ = cv2.projectPoints(inPoints, np.asarray(rvec), np.asarray(tvec), np.asarray(camera_matrix), np.asarray(dist_coeffs)) # flatten the output to get rid of double brackets per result before JSONifying flattened = [val for sublist in outPoints for val in sublist] print(json.dumps({'testdata':np.asarray(flattened).tolist()})) sys.stdout.flush()
而在节点端:
// Handle python data from print() function pythonProcess.stdout.on('data', function (data){ try { // If JSON handle the data console.log(JSON.parse(data.toString())); } catch (e) { // Otherwise treat as a log entry console.log(data.toString()); } });
发出的数据已分块,因此,如果要解析a JSON,则需要加入所有块,并在endperform 上执行JSON.parse。
JSON
end
JSON.parse
默认情况下,在父Node.js进程与生成的子进程之间建立了stdin,stdout和stderr的管道。这些管道的容量有限(且特定于平台)。如果子进程超过该限制写入stdout而没有捕获输出,则子进程将阻塞等待管道缓冲区接受更多数据。
在Linux中,每个块都限于65536字节。
65536
在2.6.11之前的Linux版本中,管道的容量与系统页面大小相同(例如,在i386上为4096字节)。从Linux 2.6.11开始,管道容量为65536字节。
let result = ''; pythonProcess.stdout.on('data', data => { result += data.toString(); // Or Buffer.concat if you prefer. }); pythonProcess.stdout.on('end', () => { try { // If JSON handle the data console.log(JSON.parse(result)); } catch (e) { // Otherwise treat as a log entry console.log(result); } });