2012-02-10 30 views
17

Tôi có một tập lệnh/máy chủ node.js đọc một số đầu vào từ stdin khi được khởi chạy. Tuy nhiên, đôi khi không có dữ liệu được thông qua. Điều này là phiền hà vì có vẻ như trong trường hợp này, không phải sự kiện data cũng không phải end được gọi. Làm thế nào tôi có thể phát hiện khi đây là trường hợp trong mã node.js?node.js: Cách phát hiện luồng stdin trống?

Tôi muốn tránh phải thêm các ký tự "kết thúc" đặc biệt ở cuối đầu vào, để không làm phiền khách hàng. Mã được liên kết dưới:

var newHTML = ''; 
    var gfm = spawn(__dirname + '/node_modules/docter/bin/github-flavored-markdown.rb'); 
    process.stdin.on('data', function(chunk){ 
    gfm.stdin.write(chunk); 
    }); 
    process.stdin.on('end', function(){ 
    gfm.stdin.end(); 
    }); 
    gfm.stdout.on('data', function(data) { 
    newHTML += data; 
    }); 
    gfm.on('exit',function(ecode){ 
    socket.emit('newContent', newHTML); 
    }); 
    process.stdin.resume(); 
+1

Các bạn đã thử process.stdin.on ('lỗi', function() {})? – Marshall

+0

hoặc gfm.stdout.on ('error', function() {}) – Marshall

+0

tìm thấy giải pháp? điều đó dường như là không thể. – antitoxic

Trả lời

3

rỗng hoặc không có dòng STDIN được phát hiện bởi các sự kiện end từ process.stdin.

Kịch bản này đơn giản stdin.js chứng minh rằng:

process.stdin.on('data', function(data) { console.log(data) }); 
process.stdin.on('end', function() { console.log('EOF') }); 

kịch bản khác nhau:

$ echo test | node stdin.js 
<Buffer 74 65 73 74 0a> 
EOF 
$ echo -n | node stdin.js 
EOF 
$ node stdin.js < /dev/null 
EOF 
$ 

Kịch bản này pipe.js chứng minh rằng việc sử dụng ống để một quá trình con sinh ra hoạt động rất tốt:

var spawn = require('child_process').spawn; 
var cat = spawn('/bin/cat'); 
cat.stdout.on('data', function(data) { console.log(data) }); 
cat.stdout.on('end', function() { console.log('EOF') }); 

process.stdin.pipe(cat.stdin); 

Như mong đợi:

$ echo test | node pipe.js 
<Buffer 74 65 73 74 0a> 
EOF 
$ echo -n | node pipe.js 
EOF 
$ node pipe.js < /dev/null 
EOF 
$ 
4

Tôi tin rằng những gì có thể xảy ra là, bạn không hề tạo ra hơi nước stdin.

dụ Øystein Steimler cho thấy bạn ăn /dev/null vào ứng dụng của bạn:

nút pipe.js </dev/null

Tuy nhiên, không bao giờ được giải quyết khi bạn không dòng stdin cho ứng dụng. Chỉ cần chạy node pipe.js sẽ không thoát vì nó vẫn đang chờ stdin.

Bạn có thể kiểm tra điều này cho mình với các chương trình unix khác, ví dụ cat

Thử chạy này:

cat < /dev/null 

Bây giờ hãy thử chỉ chạy:

cat 

Nó không thoát vì nó đang đợi stdin. Bạn có thể nhập vào thiết bị đầu cuối và gửi đến chương trình bằng cách nhấn enter. Nó sẽ vẫn không thoát (và chờ cho đầu vào nhiều hơn) cho đến khi nó nhận được EOF mà bạn có thể làm với ctrl + d

+2

Làm thế nào tôi có thể phát hiện khi điều này xảy ra? Tôi không nhận được bất kỳ sự kiện 'readline'' close' hoặc 'process.stdin'' end' nào. – spiffytech

1

Something bạn có thể làm là làm cho ứng dụng của bạn chấp nhận một cuộc tranh cãi như -s mà làm cho nó đọc từ stdin.

Đó là những gì công cụ CLI LiveScript của không:

-s, --stdin read stdin

Các vấn đề liên quan