调用 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 // 退出码
}