首页 > 解决方案 > NW.js 在孩子中接收消息不起作用?

问题描述

我在 nw.js 中有以下代码:

服务器:

    log_fd = fs.openSync("./logs/child.txt", "a");

let cwd = path.resolve(process.cwd());
    child = spawn(
        '/Users/fl/nwjs-sdk-v0.50.1-osx-x64/nwjs.app/Contents/MacOS/nwjs',
        [
            "--no-first-run",
            "--enable-node-worker",
            "--enable-logging=stderr",
            "--user-data-dir=/tmp/" + Date.now(),
            "--ignore-certificate-errors",
            "--ignore-urlfetcher-cert-requests",
            "--window-size=500,500",
            "--host-rules=MAP *." + domain + " 127.0.0.1:" + portno,
            "."
        ],
        {
            stdio: ['pipe', log_fd, log_fd, 'ipc'],
            cwd: cwd + '/binary'
        }
    );

    let res = child.stdin.write('ARGS: test ' + domain + ' ' + portno); //try write via stdin
    console.log('Send to child proc ', res)
    let res2 = child.send('Via IPC'); //try write via IPC send method, as IPC channel should be opened

客户:

process.on('uncaughtException', function (e) {
    console.group('Node uncaughtException');
    if (!!e.message) {
        console.log(e.message);
    }
    if (!!e.stack) {
        console.log(e.stack);
    }
    console.log(e);
    console.groupEnd();
});

console.log('Wait for msg - gets printed')

process.stdin.on('data', (data) => {
  console.log(data)  
}
                 
process.on('message', data => {
    console.log('GOT FROM IPC ', data)
})

console.log('CHild here - this gets printed')

孩子package.json

{
  "name": "child_proc",
  "main": "index.js",
  "dependencies": {
    "body-parser": "^1.19.0",
    "ejs": "^3.1.5",
    "express": "^4.17.1"
  }
}

服务器能够产生子
节点相同的代码在 node.js 中工作,通过IPCpipe机制,如您所见,我在这里使用了两者,也使用了其中一个,但子节点不接收消息。
孩子只是坐在那里并没有退出(我认为是由于 nw.js)。和的
子输出被重定向到stdoutstderrlog_fd

这是(几乎)在 Node.js 中工作的相同代码:

服务器:

const path = require('path');
const fs = require('fs');

const spawn = require('child_process').spawn;

const program = path.resolve('child_node.js');
let cwd = path.resolve(process.cwd());
const file_d = fs.openSync("/tmp/kkt.txt", "a");
const options = {
    stdio: ['pipe', file_d, file_d, 'ipc'],
    cwd
};

const child = spawn('node', ['child_node.js'], options);
child.stdin.write('Hello via stdin');
child.send('Hi');

child.on('message', message => {
    console.log('message from child:', message);
});

孩子:

process.on('message', message => {
    console.log('message from parent:', message);
    process.send('Hello 2');
});

process.stdin.on('data', message => {
    console.log('message from parent stdin:', message);
})

标签: ipcnode-webkit

解决方案


推荐阅读