2015-11-02 16 views
8

Tôi gặp sự cố với mô-đun xử lý con, đặc biệt với child.spawn và child.fork. Tôi dựa vào tài liệu của child_process.fork, mà nói:Làm thế nào để truyền thông điệp cũng như stdout từ trẻ sang phụ huynh trong mô-đun quá trình con node.js?

This is a special case of the child_process.spawn() functionality for spawning Node.js processes. In addition to having all the methods in a normal ChildProcess instance, the returned object has a communication channel built-in. See child.send(message, [sendHandle]) for details.

tôi đã đơn giản hóa vấn đề của tôi dưới đây:

parent.js là:

var cp = require('child_process'); 
var n = cp.fork('./child.js'); 
n.send({a:1}); 
//n.stdout.on('data',function (data) {console.log(data);}); 
n.on('message', function(m) { 
    console.log("Received object in parent:"); 
    console.log(m); 
}); 

child.js là:

process.on('message', function(myObj) { 
    console.log('myObj received in child:'); 
    console.log(myObj); 
    myObj.a="Changed value"; 
    process.send(myObj); 
}); 
process.stdout.write("Msg from child"); 

Như dự kiến. Đầu ra là:

Msg from child 
myObj received in child: 
{ a: 1 } 
Received object in parent: 
{ a: 'Changed value' } 

Tôi muốn nó hoạt động với dòng nhận xét trong parent.js chưa được chú giải. Nói cách khác, tôi muốn bắt stdout trong quá trình con trong câu lệnh n.stdout.on ('data' ... trong tiến trình cha mẹ. Nếu tôi bỏ ghi chú, tôi gặp lỗi:

n.stdout.on('data',function (data) {console.log(data);}); 
    ^
TypeError: Cannot read property 'on' of null 

Tôi không quan tâm đến việc sử dụng bất kỳ biến thể không đồng bộ nào của con, exec, fork hoặc spawn.Bất cứ gợi ý nào:

+0

ai đó có thể vui lòng giải thích - tại sao thích người nghe 'message' thay vì' dữ liệu' trong khi đang phát ... dữ liệu? – ymz

Trả lời

17

Bạn cần đặt thuộc tính im lặng trên đối tượng tùy chọn khi bạn chuyển nó vào ngã ba() theo thứ tự cho stdin, stdout và stderr để lấy đường ống trở lại quy trình gốc.

ví dụ var n = cp.fork('./child.js', [], { silent: true });

+0

Nhân tiện, có cách nào để đọc các bản ghi này và xử lý chúng trong khi sử dụng '{silent: true}'? – Kunok

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