# 调用 NodeJS 脚本方案 ## 功能需求 - 参数1:脚本名称(`nodejs` 目录下的文件名,不含路径) - 参数2+:可变参数数组(传给脚本的参数) - 返回:脚本执行结果(JSON格式,包含输出和返回值) ## 实现方案 ### 1. IPC 函数(main.js) ```javascript 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) ```javascript contextBridge.exposeInMainWorld('electronAPI', { runNodejsScript: (scriptName, ...parameters) => ipcRenderer.invoke('run-nodejs-script', scriptName, ...parameters) }) ``` ### 3. 前端调用(React) ```javascript // 调用 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` ## 返回格式 ```javascript { success: true/false, // 是否成功 stdout: "脚本输出", // 标准输出 stderr: "错误信息", // 错误输出 exitCode: 0 // 退出码 } ```