Persyaratan
Ini akan membutuhkan Node.js 7 atau yang lebih baru dengan dukungan untuk Promises dan Async / Await.
Larutan
Buat fungsi pembungkus yang memanfaatkan janji untuk mengontrol perilaku child_process.exec
perintah.
Penjelasan
Dengan menggunakan promise dan fungsi asynchronous, Anda bisa meniru perilaku shell yang mengembalikan output, tanpa jatuh ke neraka panggilan balik dan dengan API yang cukup rapi. Dengan menggunakan await
kata kunci, Anda dapat membuat skrip yang dapat dibaca dengan mudah, namun tetap dapat menyelesaikan pekerjaan child_process.exec
.
Contoh kode
const childProcess = require("child_process");
/**
* @param {string} command A shell command to execute
* @return {Promise<string>} A promise that resolve to the output of the shell command, or an error
* @example const output = await execute("ls -alh");
*/
function execute(command) {
/**
* @param {Function} resolve A function that resolves the promise
* @param {Function} reject A function that fails the promise
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
*/
return new Promise(function(resolve, reject) {
/**
* @param {Error} error An error triggered during the execution of the childProcess.exec command
* @param {string|Buffer} standardOutput The result of the shell command execution
* @param {string|Buffer} standardError The error resulting of the shell command execution
* @see https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
*/
childProcess.exec(command, function(error, standardOutput, standardError) {
if (error) {
reject();
return;
}
if (standardError) {
reject(standardError);
return;
}
resolve(standardOutput);
});
});
}
Pemakaian
async function main() {
try {
const passwdContent = await execute("cat /etc/passwd");
console.log(passwdContent);
} catch (error) {
console.error(error.toString());
}
try {
const shadowContent = await execute("cat /etc/shadow");
console.log(shadowContent);
} catch (error) {
console.error(error.toString());
}
}
main();
Output Sampel
root:x:0:0::/root:/bin/bash
[output trimmed, bottom line it succeeded]
Error: Command failed: cat /etc/shadow
cat: /etc/shadow: Permission denied
Cobalah secara online.
Repl.it .
Sumber daya eksternal
Janji .
child_process.exec
.
Node.js dukungan meja .