You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:54:02