是否可以在也具有 IPC 挂钩的 node.js 文件中导出类?

Posted

技术标签:

【中文标题】是否可以在也具有 IPC 挂钩的 node.js 文件中导出类?【英文标题】:Is it possible to export a class in a node.js file that also has IPC hooks? 【发布时间】:2019-07-21 18:34:55 【问题描述】:

[Node.js v8.10.0]

为了清楚起见,我将大大简化此示例。我有 3 个脚本:parent.js、first.js 和 second.js

父.js:

'use strict';

const path = require('path');
const fork = require('child_process');

const firstScript = path.resolve('first.js');
const first = fork(firstScript);

const secondScript = path.resolve('second.js');
const second = fork(secondScript);

first.on('message', message => 
  console.log('parent received message from first: ' + message);
  second.send(message);
);

second.on('message', message => 
  console.log('parent received message from second: ' + message);
);

first.send('original message');

first.js:

'use strict';

class First 


process.on('message', async (message) => 
  console.log('first received message: ' + message);
  process.send(message);
);

module.exports = First;

second.js:

'use strict';

const First = require('./first.js');

process.on('message', message => 
  console.log('second received message: ' + message);
  process.send(message);
);

预期输出:

第一个收到的消息:原始消息

父母收到第一条消息:原始消息

第二个收到的消息:原始消息

父母收到第二个消息:原始消息

实际输出:

第一个收到的消息:原始消息

父母首先收到消息:原始消息

第一个收到的消息:原始消息

第二个收到的消息:原始消息

父母收到第二个消息:原始消息

父母收到第二个消息:原始消息

在这个例子中,First 类是没有意义的。但它说明了我试图避免的问题。具体来说,second.js 中的 const First = require('./first.js'); 行对 IPC 造成了严重破坏(如实际输出所示,与预期输出相比)。

目前,我正在通过将 First 类移动到单独的文件来“解决”这个问题。但我想知道是否可以将所有内容保存在一个文件中(即,仍然可以在 first.js 中导出类——但不会造成与 IPC 相关的混乱)。

【问题讨论】:

【参考方案1】:

问题是,当你 require 一个脚本时,在后台,脚本是 ran 并且导出在最后被提取。你看到的完全是逻辑 - 当你运行$ node parent.js时基本上有四个进程而不是一个进程@

    父级,由$ node parent.js 创建 首先,由fork(firstScript)创建 第二个,由fork(secondScript)创建 另一个First,由require('./first.js')创建

如果您需要我添加一个显示消息交换和流程创建的 ascii 艺术流程树,请告诉我,或者是否可以!

啊,有道理!但是...如何在不执行创建 IPC 挂钩的脚本部分的情况下导出文件?

javascript(node 或 web)中,一种常见的设计模式是 除了一个之外只有一个静音文件。也就是说,所有文件都只是导入/导出类和常量,但只有一个主文件通过引用源代码中其他地方的所有智能来实际触发整个程序。基本上是这样的:

// hello.js
module.exports = () => console.log('hello world');
// main.js
const hello = require('./hello');
hello();

最好将您的代码考虑在内以简化您的工作,但如果您不能这样做,您始终可以根据脚本是必需还是称为,正如here 解释的那样。在您的情况下,将first.js 重写为以下内容:

'use strict';

class First 


// called only if invoked as script
if (require.main==module) 
  process.on('message', async (message) => 
    console.log('first received message: ' + message);
    process.send(message);
  );


module.exports = First;

在运行 node parent.js 时给出您描述的预期输出。

【讨论】:

不,这是有道理的(我假设“另一个 First”从 Second 继承 IPC 通道,这就是父级在该通道上接收 2 条消息的原因)。就像我说的那样,我已经将所有内容分开以避免这个问题 - 我只是想知道是否可以在不实际运行整个脚本的情况下导出类(在 node.js 中)(如你所提到的)。 是的!我将编辑我的答案以简化格式 完成!还有其他问题吗?

以上是关于是否可以在也具有 IPC 挂钩的 node.js 文件中导出类?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Node.js / Express 应用程序的 Mongoose 预挂钩中查询?

Node.js 和 Java 之间的 IPC 通信

Node.js:使用 IPC 的 master 和 worker 之间的请求/响应

带有 C/C++ 和 nw.js/node.js/node-native-module (C++) 的终端服务器上的 IPC?

C++ DLL(本地挂钩)和 C# 应用程序之间的合适 IPC

适合我情况的 IPC 形式