2013-07-19 22 views
14

Tôi đã tạo một ứng dụng node.js để liệt kê tất cả các tệp .txt từ một thư mục đệ quy và, cho mỗi thư mục, làm một số thứ.NodeJS: ném er; // Unhandled 'error' event (events.js: 72) khi sử dụng phương thức đẻ trứng child_process

Dưới đây là app.js tôi:

var spawn = require('child_process').spawn, 
    dir = spawn('dir', ['*.txt', '/b']); 

dir.stdout.on('data', function (data) { 
    //do some stuff with each stdout line... 
    console.log('stdout: ' + data); 
}); 

dir.stderr.on('data', function (data) { 
    //throw errors 
    console.log('stderr: ' + data); 
}); 

dir.on('close', function (code) { 
    console.log('child process exited with code ' + code); 
}); 

Khi tôi chạy node app.js qua giao diện điều khiển, tôi nhận được thông báo lỗi dưới đây:

events.js:72 
     throw er; // Unhandled 'error' event 
      ^
Error: spawn ENOENT 
    at errnoException (child_process.js:980:11) 
    at Process.ChildProcess._handle.onexit (child_process.js:771:34) 

Tôi đang sử dụng nút v0.10.13 tại win32 môi trường.

tôi làm theo cách này (spawn) bởi vì tôi muốn để xử lý stdout từng dòng (các exec phương pháp phát hành toàn bộ stdout là một chuỗi).

* CẬP NHẬT *

Bằng cách này, sử dụng spawn cho child_process không đảm bảo rằng đầu ra cho cmd dir sẽ từng dòng. Tôi cũng đã tạo một question for that.

Trả lời

17

Điều đó xảy ra vì dir không phải là tệp thực thi trong Windows. Đó là một lệnh từ trình bao.
Giải pháp cho vấn đề của bạn như sau:

var dir = spawn('cmd', ['/c', 'dir']); 
dir.stdout.on("data", function() { 
    // do things 
}) 

vấn đề chính xác Đây là here cũng có.

+1

Downvoter, bạn có thể giải thích tại sao không ?? – gustavohenke

+4

Tôi đã không downvote, nhưng câu trả lời này không thực sự trả lời câu hỏi - nơi nào chúng tôi đính kèm một ('lỗi', fn) xử lý trên để nắm bắt các lỗi (không chỉ ngăn ngừa lỗi!). –

+0

@AlexMills Không có câu hỏi thực sự ở đây, không có "?" :) Và trình xử lý 'error' nên được gắn vào quá trình sinh ra. – gustavohenke

12

Một số điều:

  • dir không phải là một thực thi thực trong các cửa sổ, vì vậy Node.js không thể tìm chương trình bạn muốn chạy.
  • Bạn đã không ràng buộc một trình xử lý 'error' với quy trình con của bạn và sự kiện đã bị biến thành một ngoại lệ đã làm hỏng phiên bản nút của bạn. Làm điều này:
 
dir.on('error', function (err) { 
    console.log('dir error', err); 
}); 
  • Sử dụng fs.readdir để thay thế. Đó là API node.js chuẩn thực hiện điều tương tự.
Các vấn đề liên quan