Node.js调用Python脚本的函数无法返回JSON,如何用async-await解决?
你当前遇到的返回undefined问题本质是异步逻辑执行顺序的问题:spawn创建子进程后,stdout.on、close.on这类事件回调需要等到子进程触发对应事件时才会执行,而原函数在创建完子进程、绑定完事件监听后会直接同步执行return,此时dataToSend还没被赋值,自然拿到的是初始值undefined。
要通过async-await实现你的需求,只需要把函数逻辑包装为Promise即可,改造后的代码如下:
const { spawn } = require('child_process') const getWeatherReport = (location) => { // 用Promise包装异步逻辑,成功时resolve结果,失败时reject错误 return new Promise((resolve, reject) => { let dataToSend const python = spawn('python', [__dirname + '\\weathergetter.py', location.toString()]) python.stdout.on('data', (data) => { console.log('Pipe data from python script ...') try { // 新增JSON解析异常捕获,避免格式错误直接崩溃 dataToSend = JSON.parse(data.toString().replace(/'/g, '"')) } catch (err) { reject(new Error(`JSON解析失败: ${err.message}`)) } }) python.stderr.on('data', data => { const errMsg = `Python脚本执行错误: ${data.toString()}` console.error(errMsg) reject(new Error(errMsg)) }) python.on('close', (code) => { console.log(`child process close all stdio with code ${code}`) // 子进程正常退出且拿到有效数据时返回结果 if (code === 0 && dataToSend) { resolve(dataToSend) } else { reject(new Error(`脚本执行异常,退出码: ${code}`)) } }) }) } // 调用方式:必须放在async函数内用await接收,或者用.then方法取结果 async function main() { try { const wea = await getWeatherReport("kolkata") console.log(wea) } catch (err) { console.error('获取天气数据失败:', err) } } main()
改造核心要点:
- 将所有异步事件逻辑绑定到Promise的
resolve/reject上,让函数返回Promise对象,才能支持await调用 - 新增了多场景的错误处理,避免子进程报错、数据格式错误时无感知
- 异步操作的结果无法同步返回,必须通过
await或者.then的方式接收返回值,不能直接同步赋值获取
内容的提问来源于stack exchange,提问作者Curious Learner
相关产品推荐
相关产品推荐

