process.send在Node.js中有条件地定义

Ale*_*lls 10 node.js

无论出于何种原因,在Node.js中,函数process.send在某些​​环境中定义,但在其他环境中未定义.例如,当我从Node.js中的父进程分叉子进程时,如下所示:

//parent process
var cp = require('child_process');
var k = cp.fork('./child.js',['arg1','arg2','arg3']);
k.send('fail'); //k.send is defined...
process.send("ok, let's try this..."); //process.send is NOT defined
Run Code Online (Sandbox Code Playgroud)

在子进程内:

//child.js
process.send('message');  //process.send is defined, and will send a message to the parent process above
Run Code Online (Sandbox Code Playgroud)

为什么process.send在某些Node.js进程中有条件地定义而不是其他进程?看起来像Node.js架构师的糟糕设计决策.

我知道如何解决这个问题的唯一方法是:

if(typeof process.send === 'function'){ 
process.send('what I want to send')
});
Run Code Online (Sandbox Code Playgroud)

Ale*_*lan 18

子进程有一种process.send方法可以与生成它们的进程进行通信,而根进程没有任何"父"进行通信,所以它不在那里.来自文档:

在子进程中,进程对象将具有send()方法,并且进程将在每次在其通道上接收消息时发出对象.

为了避免"使用条件"丢弃代码,临时解决方案可能只是将"noop"函数放在可能产生进程的任何"根"文件顶部的位置:

process.send = process.send || function () {};
Run Code Online (Sandbox Code Playgroud)

  • 这是超级跛脚的IMO.所有进程都应该有一个父进程 - 如果没有人在监听,process.send应该什么都不做,就像其他所有发布/子类型API一样.但是没关系,正如我在OP的编辑中提到的那样,我们可以用条件语来乱丢代码 (3认同)
  • @AlexMills 当然。`process.send` 使用 JSON-over-IPC-fd 机制,该机制完全特定于节点。使用它来尝试向非节点进程发送消息是没有意义的。那么为什么不将其默认为无操作呢?因为将有意义的命名方法设为 no-op 是灾难性的无法发现和令人困惑的。你可以很容易地把它变成一个无操作,因为这个答案很清楚,而相反的并不是真的(当它的唯一影响是在另一个过程中时,你如何确定它是无操作?)。 (2认同)