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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:24:02