ในส่วนนี้ให้เรียนรู้เกี่ยวกับวิธีการของ NodeJs เพื่อดำเนินการที่ไม่ปิดกั้น
ก่อนอื่นแก้ไขตัวจัดการเริ่ม:
การคัดลอกรหัสมีดังนี้:
var exec = ต้องการ ("child_process"). exec;
ฟังก์ชั่นเริ่มต้น () {
console.log ("คำขอเริ่มต้น 'start' ถูกเรียก");
var content = "ว่าง";
exec ("ls -lah", ฟังก์ชั่น (ข้อผิดพลาด, stdout, stderr) {
เนื้อหา = stdout;
-
ส่งคืนเนื้อหา;
-
ฟังก์ชั่นอัปโหลด () {
console.log ("คำขอตัวจัดการ 'อัพโหลด' ถูกเรียกว่า");
กลับ "สวัสดีอัปโหลด";
-
ExportS.Start = Start;
ExportS.UPLOAD = อัปโหลด;
รหัสนี้สร้างเนื้อหาตัวแปรใหม่ (ค่าเริ่มต้นคือ "ว่าง") ดำเนินการคำสั่ง "ls -lah" กำหนดผลลัพธ์ให้กับเนื้อหาและในที่สุดก็ส่งคืนเนื้อหา
เราได้เปิดตัวโมดูล Node.js ใหม่ child_process ซึ่งใช้ในการดำเนินการที่ไม่ปิดกั้นอย่างง่ายและใช้งานได้จริง: exec ()
แล้ว Exec () ทำอะไร?
มันดำเนินการคำสั่งเชลล์จาก node.js ในตัวอย่างด้านบนเราใช้มันเพื่อรับไฟล์ทั้งหมดในไดเรกทอรีปัจจุบัน ("ls -lah") จากนั้นส่งออกข้อมูลไฟล์ไปยังเบราว์เซอร์เมื่อ /starturl คำขอ
เราเริ่มต้นเซิร์ฟเวอร์และเยี่ยมชม "http: // localhost: 8888/start" และเราจะพบว่าเอาต์พุตเนื้อหาในหน้าว่างเปล่า
EXEC () ทำงานและด้วยมันเราสามารถดำเนินการเชลล์ที่ใช้เวลานานมากโดยไม่ต้องบังคับให้แอปของเราหยุดและรอการดำเนินการนั้น
อย่างไรก็ตามเรื่องนี้เอาต์พุตเนื้อหาของหน้าดูเหมือนจะไม่เป็นผลลัพธ์ที่เราต้องการ
มาวิเคราะห์เหตุผล:
รหัสของเราดำเนินการแบบซิงโครนัสซึ่งหมายความว่าหลังจากการเรียกใช้ exec (), node.js จะเรียกใช้เนื้อหาที่ส่งคืนทันที
ในเวลานี้เนื้อหายังคง "ว่าง" เนื่องจากฟังก์ชั่นการโทรกลับผ่านไปยัง exec () ยังไม่ถูกดำเนินการ - เนื่องจากการดำเนินการของ exec () เป็นแบบอะซิงโครนัส
ในส่วนถัดไปเราจะอธิบายวิธีการแก้ปัญหานี้