如何将Node.js的req.file数据传递给Python脚本处理并返回执行结果
实现方案
问题根源
你之前的实现存在两个核心错误:
- 直接将
req.file对象作为命令行参数传递,命令行参数仅支持字符串类型,对象自动调用toString()方法后就会输出[object Object] - 二进制buffer无法通过命令行参数直接传递,会被强制转为可读字符串,丢失原始字节信息
正确方案是通过子进程的**标准输入流(stdin)**传递二进制PDF数据,避免命令行参数的传输限制。
Node端代码修改
需要注意uploadToBlockchain必须放在子进程的close回调中执行,否则会在Python脚本处理完成前就执行,无法拿到处理结果:
app.post('/upload', upload.single('pdf'), function (req, res) { let pythonOut = Buffer.from(''); // 启动Python脚本,无需传文件参数 const python = spawn('python', ['Scripts/convert_pdf.py']); // 将PDF buffer写入Python进程的标准输入 python.stdin.write(req.file.buffer); python.stdin.end(); // 标记输入完成 // 收集Python返回的结果 python.stdout.on('data', function (data) { pythonOut = Buffer.concat([pythonOut, data]); }); // 打印Python脚本的报错信息,方便排查问题 python.stderr.on('data', function (err) { console.error('Python执行错误:', err.toString()); }); python.on('close', (code) => { console.log(`Python进程退出,状态码 ${code}`); const processResult = pythonOut.toString().trim(); console.log('Python处理结果:', processResult); // 处理完成后再调用上链方法 uploadToBlockchain(processResult); res.send('finished'); }); })
Python端代码修改
不需要读本地文件,直接从标准输入流读取二进制的PDF内容即可:
import sys from Transformer import Transformer as tf # 读取标准输入的全部二进制数据,就是Node传递的PDF文件内容 pdf_content = sys.stdin.buffer.read() a = tf.bytes_to_hash_array(pdf_content) # 打印结果会传递回Node的stdout监听 print(a)
补充说明
如果Python返回的是结构化数据(比如数组、对象),可以在Python端用json.dumps(a)序列化后输出,Node端再用JSON.parse(pythonOut.toString())反序列化为JS对象使用,不需要手动解析字符串。
内容的提问来源于stack exchange,提问作者magicusingjunta
相关产品推荐
相关产品推荐

