Node.js调用Python文件触发ERR_UNHANDLED_REJECTION错误的解决方法
修复Node.js调用Python脚本时的未处理Promise拒绝错误
原问题代码
const { exec } = require("child_process"); const executePy = (filepath) => { return new Promise((resolve, reject) => { exec( `python ${filepath}`, (error, stdout, stderr) => { error && reject({ error, stderr }); stderr && reject(stderr); resolve(stdout); } ); }); };
触发的错误信息
node:internal/process/promises:279 triggerUncaughtException(err, true /* fromPromise */); ^ [UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "#<Object>".] { code: 'ERR_UNHANDLED_REJECTION' }
修复后的完整实现
const { exec } = require("child_process"); const executePy = (filepath) => { return new Promise((resolve, reject) => { // 兼容不同系统的Python命令,Windows优先用python,类Unix优先用python3 const cmd = process.platform === "win32" ? `python "${filepath}"` : `python3 "${filepath}" || python "${filepath}"`; exec(cmd, (error, stdout, stderr) => { // 优先处理执行层面的错误(如找不到Python、脚本不存在等) if (error) { return reject({ type: "execution_error", message: error.message, details: stderr.trim() }); } // 处理脚本输出的错误信息,若仅为警告可改为返回stdout+stderr而非reject if (stderr) { return reject({ type: "script_error", error_msg: stderr.trim() }); } // 返回清理后的标准输出 resolve(stdout.trim()); }); }); }; // 正确调用示例(必须处理Promise的reject分支) async function runPythonScript(filepath) { try { const result = await executePy(filepath); console.log("脚本执行结果:", result); return result; } catch (err) { console.error("执行失败:", err); // 可在此添加错误上报、重试等逻辑 throw err; } } // 调用示例 runPythonScript("./your_script.py");
关键修复点说明
处理未捕获的Promise拒绝:
调用executePy时必须通过try/catch(async函数内)或.catch()(链式调用)捕获reject,避免触发未处理拒绝错误。规避命令注入与路径问题:
将文件路径用双引号包裹,防止路径含空格/特殊字符时执行异常;同时兼容Windows和类Unix系统的Python命令差异。优化错误判断逻辑:
用return终止后续代码执行,避免Promise被多次调用(原代码reject后仍会执行resolve,存在逻辑漏洞);区分执行层面错误和脚本自身输出的错误信息,提升调试效率。输出内容清理:
对stdout和stderr执行trim(),去除多余换行和空白字符,让输出更整洁。
内容的提问来源于stack exchange,提问作者Jagadish S
相关产品推荐
相关产品推荐

