Dans ce chapitre nous allons voir l'objet process qui nous permet d'intéragir avec le process NodeJS courant. On a sur cet objet 3 propriété qui permettent de communiquer avec le système.
stdin
est un flux de lecture connecté au "standard input" qui recevra les données envoyées au terminal.stdout
est un flux d'écriture connecté au "standard output"stderr
est un flux d'écriture connecté au "standard error"
Par exemple, pour afficher tout ce qui est rentré dans le terminal.
import { stdin, stdout } from 'node:process'
stdin.pipe(stdout)
Aussi, il sera possible de récupérer les arguments passé à la commande à l'aide de argv
(un tableau de chaîne de caractère).
En plus de contrôler le processus principal on aura la possibilité de créer des processus enfants. La méthode exec
permet d'éxécuter un processus enfant et de recevoir le retour du stdout et stderr.
const { exec } = require('node:child_process')
exec('ls -lah', (error, out, err) => {
console.log(out)
})
La méthode spawn
permet de créer un processus enfant et de récupérer la sortie sous forme de flux.
import { spawn } from 'node:child_process'
const ls = spawn('ls', ['-lah', '/usr'])
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`)
})
ls.stderr.on('data', (data) => {
console.error(`stderr: ${data}`)
})
ls.on('close', (code) => {
console.log(`child process exited with code ${code}`)
})
Exercice
Afin d'éviter d'avoir à relancer notre serveur à chaque modification, on veut créer un processus JavaScript qui observera les modifications des fichiers JavaScript et qui relancera automatiquement le server.
import {exec, spawn} from 'node:child_process'
import { watch } from 'node:fs/promises'
const [node, _, file] = process.argv
function spawnNode () {
const childProcess = spawn(node, [file])
childProcess.stdout.on('data', (data) => {
console.log(data.toString('utf8'))
})
childProcess.stderr.on('data', (data) => {
console.error(data.toString('utf8'))
})
childProcess.on('close', (code) => {
if (code > 0) {
throw new Error('Process exited : ' + code)
}
})
return childProcess
}
let childNodeProcess = spawnNode()
const watcher = watch('./', {recursive: true})
for await (const event of watcher) {
if (event.filename.endsWith('.js')) {
childNodeProcess.kill()
childNodeProcess = spawnNode()
}
}
On pourra ensuite utiliser ce watcher pour lancer un script NodeJS et le relancer dès qu'un fichier est modifié.
node watcher.js app.js