Node.js 如何运行外部进程
Node.js 是一个跨平台的开源后端JavaScript运行时环境,它使用V8引擎在网页浏览器之外执行JavaScript代码。Node.js允许开发者利用JavaScript创建命令行工具和服务器端脚本,这涉及在将页面发送到用户浏览器之前在服务器上运行脚本。
在本文中,我们将讨论如何在Node.js中运行外部进程。
child_process模块为我们提供了在Node.js中运行外部进程的能力。借助child process模块,我们可以将任何系统命令作为“子进程”来访问操作系统功能。该模块为我们提供了四种创建子进程的方法:
- spawn
- fork
- exec
- execFile
现在让我们看看如何使用这些方法来运行外部进程:
注意: 在运行文件之前,请确保在package.json文件中设置 “type”: “module” 以使用import语法。
1. 使用spawn方法: 使用提供的命令和args中的命令行参数,spawn()函数会创建一个新的子进程。
语法:
spawn(command[, args][, options])
示例: 现在让我们看看如何使用spawn()方法来运行外部进程。在下面的示例中,我使用spawn()方法来列出当前工作目录中的所有文件和子目录。
index.js
import { spawn } from 'child_process';
const lsProcess = spawn('ls');
lsProcess.stdout.on('data', data => {
console.log(`stdout:\n{data}`);
})
lsProcess.stderr.on("data", (data) => {
console.log(`stdout:{data}`);
});
lsProcess.on('exit', code => {
console.log(`Process ended with ${code}`);
})
运行应用程序的步骤: 在终端中输入以下命令来运行应用程序:
node index.js
输出:
2. 使用fork方法: fork()方法是spawn()方法的特殊情况,允许父进程和子进程使用send()方法进行通信。它允许将计算密集型的任务与主事件循环分离开来。
语法:
fork(modulePath[, args][, options])
示例: 现在让我们看一下如何使用fork()方法来运行外部进程。我在这里创建了两个独立的进程,parentFile.js和childFile.js,并通过使用fork()方法在它们之间进行通信。
parentFile.js
import { fork } from 'child_process';
const child = fork('childFile.js');
child.on('message', (msg) => {
console.log(`From child process: ${msg}`);
})
child.send('This is parent process.')
- childFile.js
process.on('message', (msg) => {
console.log(`From parent process ${msg}`);
})
process.send('Hi from child process');
运行该应用的步骤: 在终端中输入以下命令以运行该应用:
node parentFile.js
输出:
3. 使用exec方法: 在运行命令之前,exec函数首先建立一个shell。
语法:
exec(command[, options][, callback])
示例: 现在让我们看一下如何使用exec()方法来运行外部进程。在以下代码中,我只是运行一个echo命令。
index.js
import { exec } from 'child_process';
exec('echo Hi', (err, stdout, stderr) => {
if(err){
console.log(err);
return;
}
console.log(`stdout: ${stdout}`);
})
process.on('message', (msg) => {
console.log(`From parent process ${msg}`);
})
process.send('Hi from child process');
运行该应用的步骤: 在终端中输入以下命令来运行该应用:
node index.js
输出结果:
4. 使用execFile方法: execFile()方法默认不会创建shell,这使得它比exec()方法更高效。
语法:
execFile(file[, args][, options][, callback])
示例: 现在我们来看一下如何使用execFile()方法来运行外部进程。在下面的例子中,我使用execFile()方法在一个node.js文件中运行一个python文件。我已经在与node.js文件相同的目录中创建了python文件。项目结构应该如下所示:
geeksforgeeks/
├─ node_modules/
├─ hello.py
├─ index.js
├─ package.json
hello.py
print("Hello World!")
index.js
import { execFile } from 'child_process';
const pythonProcess = execFile('python3', ['hello.py']);
pythonProcess.stdout.on("data", (data) => {
console.log(`stdout:\n{data}`);
});
pythonProcess.stderr.on("data", (data) => {
console.log(`stdout:{data}`);
});
pythonProcess.on("exit", (code) => {
console.log(`Process ended with ${code}`);
});
运行应用程序的步骤: 在终端中写入以下命令以运行应用程序:
node index.js
输出: