调用NodeJS脚本方案.md 2.0 KB

调用 NodeJS 脚本方案

功能需求

  • 参数1:脚本名称(nodejs 目录下的文件名,不含路径)
  • 参数2+:可变参数数组(传给脚本的参数)
  • 返回:脚本执行结果(JSON格式,包含输出和返回值)

实现方案

1. IPC 函数(main.js)

const { spawn } = require('child_process')
const path = require('path')

ipcMain.handle('run-nodejs-script', async (event, scriptName, ...parameters) => {
  return new Promise((resolve, reject) => {
    const scriptPath = path.join(__dirname, '../nodejs', `${scriptName}.js`)
    const nodeProcess = spawn('node', [scriptPath, ...parameters])
    
    let stdout = ''
    let stderr = ''
    
    nodeProcess.stdout.on('data', (data) => {
      stdout += data.toString()
    })
    
    nodeProcess.stderr.on('data', (data) => {
      stderr += data.toString()
    })
    
    nodeProcess.on('close', (code) => {
      resolve({
        success: code === 0,
        stdout: stdout.trim(),
        stderr: stderr.trim(),
        exitCode: code
      })
    })
    
    nodeProcess.on('error', (error) => {
      reject(error)
    })
  })
})

2. Preload 暴露(preload.js)

contextBridge.exposeInMainWorld('electronAPI', {
  runNodejsScript: (scriptName, ...parameters) => 
    ipcRenderer.invoke('run-nodejs-script', scriptName, ...parameters)
})

3. 前端调用(React)

// 调用 adb-connect.js,传递参数
const result = await window.electronAPI.runNodejsScript('adb-connect', '192.168.2.5', '5555')
console.log(result.stdout) // 脚本输出

脚本要求

  • 脚本需要接收命令行参数:process.argv[2], process.argv[3]
  • 脚本输出使用 console.log(),会捕获到 stdout
  • 错误输出使用 console.error(),会捕获到 stderr

返回格式

{
  success: true/false,  // 是否成功
  stdout: "脚本输出",    // 标准输出
  stderr: "错误信息",    // 错误输出
  exitCode: 0          // 退出码
}