2015-11-20 26 views
5

Tôi đang cố gắng đưa các kết quả grep vào tập lệnh nodejs. Tôi đã tìm thấy, rằng tôi sẽ nhận được dữ liệu từ process.stdin.Phương thức không xác định process.openStdin()

Ngoài ra tôi đã tìm thấy một số cách để làm việc với stdin. Nhưng chúng khác nhau và tôi không thể tìm thấy tất cả thông tin về nó. Tôi biết bốn cách (3 trận đầu tiên với var data = ""):

1) Phổ biến nhất trong kết quả tìm kiếm

process.stdin.resume(); 
process.stdin.setEncoding('utf8'); 
process.stdin.on('data', function(chunk) { data += chunk; }); 
process.stdin.on('end', function() { console.log('data: ' + data); }); 

2) Hình như người đầu tiên, nhưng với chức năng chưa biết process.openStdin()

var stdin = process.openStdin(); 
stdin.on('data', function(chunk) { data += chunk; }); 
stdin.on('end', function() { console.log('data: ' + data); }); 

3) Trong tài liệu tôi đã đọc, hãy gọi stdin.resume() thay đổi stdin thành 'kiểu cũ'. Vì vậy, nếu chúng tôi không gọi là 'tiếp tục' - chúng tôi có thể sử dụng sự kiện 'có thể đọc'

process.stdin.setEncoding('utf8'); 
process.stdin.on('readable', function() { data += process.stdin.read(); }); 
process.stdin.on('end', function() { console.log('data: ' + data); }); 

4) Sử dụng readline của mô-đun. Nó rất hữu ích miễn là kết quả grep nằm trong dòng mutiple và ở đó tôi không cần phải tách dữ liệu nhận được một mình. Nhưng trong một thời gian dài tôi không thể hiểu tại sao tất cả các thông tin được dẫn đến stdout trực tiếp. Sau đó, tôi đã tìm thấy rằng chúng tôi có thể vượt qua đối tượng trống thay vì process.stdout trong khi tạo giao diện và dữ liệu sẽ không được dẫn đến đầu ra.

var readline = require('readline'), 
//rl = readline.createInterface(process.stdin, process.stdout); 
rl = readline.createInterface(process.stdin, {}); 
rl.on('line', function(data) { console.log('line: ' + data); }); 

5) Biến thể của riêng tôi. Sử dụng một mô-đun 'tách' khác - nó cho phép đọc từ luồng và chia dữ liệu thành chuks theo ký hiệu được chỉ định (theo mặc định là \r?\n). Tôi đã sử dụng nó để làm việc với socket và ngay sau khi stdin cũng có thể đọc được luồng - chúng ta có thể sử dụng nó ở đây.

var split = require('split'); 
process.stdin.setEncoding('utf8'); 
process.stdin.pipe(split()).on('data', function(data) { console.log('line: ' + data); }); 

Câu hỏi của tôi là "process.openStdin(); ????" là gì? "

Tôi đã tìm kiếm mọi trang trong google, nhưng không tìm thấy bất kỳ tài liệu nào về chức năng này! Ngoài ra trong khi tìm kiếm tôi đã phát hiện, tài liệu chính thức cho nodejs là xấu - không được đề cập vì phương pháp phiên bản nào có sẵn, không có mô tả chi tiết về nhiều đối tượng/phương pháp, không có nhận xét của người dùng. Và phương pháp này (openStdin) - tồn tại và hoạt động, nhưng hư không hư hỏng! WTF ???

Trả lời

4

Trong khi viết câu hỏi tôi đã tìm thấy câu trả lời :)

Đó là trong source code của nodejs:

process.openStdin = function() { 
    process.stdin.resume(); 
    return process.stdin; 
}; 

Nhưng tôi tự hỏi, tại sao nó không được mô tả trong tài liệu? Nếu nó là một chức năng cho chỉ sử dụng riêng, tại sao nó được sử dụng bởi nhiều người, những người đã viết về làm việc với stdin?

+0

Tốt nhất tôi có thể biết, [nó không được phản hồi trong 0.3.3] (https://github.com/nodejs/node/blob/43e4efdf210adb2cc3ba26518fd4588f9e0152ff/doc/changelogs/CHANGELOG_ARCHIVE.md#20110102-version-033-unstable) vẫn phải tồn tại để tương thích ngược. – vossad01

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