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

Node.js路由中PythonShell异步执行顺序异常求助

Node.js中PythonShell异步执行顺序问题修复

问题根源

你当前代码的核心问题是:PythonShell.run是回调式API,并非Promise,所以你加的await根本不会等待Python脚本执行完成。goToScript函数虽然标记了async,但内部的await无效,导致调用goToScript()后,程序直接跳过执行Step 03和res.json,直到Python脚本跑完触发回调才会执行Step 02,这就是顺序错乱的原因。

修复方案

把PythonShell.run包装成Promise,让await能真正等待执行完成,同时调用goToScript时也要加await,确保逻辑按预期顺序执行。此外还要完善错误处理,避免异常时无响应。

修复后的代码

router.put("/uploads/script-03", async (req, res) => {
    let options = {
        scriptPath: "scripts",
        args: JSON.stringify(req.body)
    };

    // 把PythonShell.run包装成Promise
    const goToScript = async () => {
        return new Promise((resolve, reject) => {
            PythonShell.run("script-01.py", options, (err, scriptRes) => {
                if (err) {
                    // 出错时拒绝Promise,上层捕获处理
                    return reject(err);
                }
                if (scriptRes) {
                    const responseData = JSON.parse(scriptRes);
                    console.log('Step 02');
                    // 成功时返回解析后的数据
                    resolve(responseData);
                }
            });
        });
    };

    console.log('Step 01');

    try {
        // 等待goToScript执行完成,拿到返回数据
        const responseScript = await goToScript();
        console.log('Step 03');
        // 用拿到的数据响应客户端
        res.json(responseScript);
    } catch (err) {
        // 处理Python脚本执行出错的情况
        console.error("Python脚本执行出错:", err);
        res.status(500).json({ error: "脚本执行失败" });
    }
});

module.exports = router

关键改动说明

  • 将goToScript改为返回Promise,用resolve和reject处理PythonShell的回调结果
  • 调用goToScript时添加await,确保等待脚本执行完成后再执行后续逻辑
  • 用try/catch捕获异常,避免程序崩溃并给客户端返回错误响应
  • 移除了未声明的responseScript全局变量,改为在try块内声明,避免变量污染

内容的提问来源于stack exchange,提问作者João Denari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:50:18