Yêu cầu
Điều này sẽ yêu cầu Node.js 7 trở lên có hỗ trợ Promises và Async / Await.
Giải pháp
Tạo một hàm wrapper dùng đòn bẩy để kiểm soát hành vi của child_process.exec
lệnh.
Giải trình
Sử dụng các hứa hẹn và một hàm không đồng bộ, bạn có thể bắt chước hành vi của một trình bao trả về đầu ra, mà không rơi vào địa ngục gọi lại và với một API khá gọn gàng. Sử dụng await
từ khóa, bạn có thể tạo một tập lệnh dễ đọc, trong khi vẫn có thể hoàn thành công việc child_process.exec
.
Mẫu mã
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);
});
});
}
Sử dụng
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();
Đầu ra mẫu
root:x:0:0::/root:/bin/bash
[output trimmed, bottom line it succeeded]
Error: Command failed: cat /etc/shadow
cat: /etc/shadow: Permission denied
Hãy thử nó trực tuyến.
Repl.it .
Nguồn lực bên ngoài
Những lời hứa .
child_process.exec
.
Bảng hỗ trợ Node.js .