Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js中的ES6样式子进程_Javascript_Node.js_Ecmascript 6 - Fatal编程技术网

Javascript Node.js中的ES6样式子进程

Javascript Node.js中的ES6样式子进程,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,我是一名后院开发人员,在许多项目中使用Node.js。我还尝试在可能的情况下使用ES6类,因为我更喜欢采用这种结构。然而,我在让子进程与ES6类一起运行时遇到了问题 对于测试,test1.js是一个传统模块: var cp = require( 'child_process' ); var kid = cp.fork( 'test2.js' ); kid.send( {msg: "Hey there kid"} ); setTimeout( () => { process.exit(0)

我是一名后院开发人员,在许多项目中使用Node.js。我还尝试在可能的情况下使用ES6类,因为我更喜欢采用这种结构。然而,我在让子进程与ES6类一起运行时遇到了问题

对于测试,test1.js是一个传统模块:

var cp = require( 'child_process' );
var kid = cp.fork( 'test2.js' );
kid.send( {msg: "Hey there kid"} );
setTimeout( () => { process.exit(0) }, 2000 );
和test2.js

console.log( "Regular child is alive now" );
function yay( message ) { console.log( "Regular kid got", message ); }
process.on( 'message', (m) => { yay(m) } );  
ES6中相同,test1.mjs:

import cp from 'child_process';
const kid = cp.fork( 'test2.mjs' );
kid.send( { msg: "Hey there kid" } );
setTimeout( () => { process.exit(0) }, 2000 );  
和test2.mjs

class Test2 {
  constructor() {
    console.log( "Experimental child is alive now" );
  }
  yay(message) {
    console.log( "Experimental kid got", message );
  }
}
const test2 = new Test2();
process.on( 'message', (m) => { test2.yay(m) } );
执行这些操作时,只有传统的子级接收消息。实验版记录了它的实例化,但没有收到任何消息

我做错了什么?或者ES6模块是否超出了Node.js的范围(使用--experimental modules标志)

编辑:

我也在n Node.js help git tracker上问过这个问题,并指出了这个问题。send()在IPC连接建立之前发生。将kid.send()放入setTimeout可以演示这一点。正如有人向我指出的那样,在没有确认连接的情况下,不应尝试任何消息交换。

安装巴贝尔

npm install babel-register babel-preset-es2015 --save-dev
创建调用
test1.js

require('babel-register')({ presets: [ 'es2015' ] });

require('./test1.js');
➜  node index.js 
Experimental child is alive now
Experimental kid got { msg: 'Hey there kid' }
现在尝试
node index.js

require('babel-register')({ presets: [ 'es2015' ] });

require('./test1.js');
➜  node index.js 
Experimental child is alive now
Experimental kid got { msg: 'Hey there kid' }

您还可以使用“createRequire”,它非常简单(使用NodeJs 14.15.5测试):

在您的代码中:

shellExec.exec(command,callback);
您还可以使用shellExec中的其他方法,如 ChilldProcess、execFile、execFileSync、Fork、spawn、spawnSync


我经常将此技术用于不支持“导入”的“旧模块”,如MongoDb。

您使用的是哪个版本的节点?对我来说,在v8.10.0上工作很好,我喜欢后院开发者的部分…如果你的节点版本不支持ES6,也许可以使用Babel transpilation?@Nitin,你是否收到了“experimental kid get…”的消息?我正在运行8个最新版本,只是离开机器一段时间。@Nitin,确认一下,我正在运行8.11.2。我收到了“实验中的孩子现在还活着”的信息,但不是“实验中的孩子得到了…”的信息。谢谢你的例子。我真的希望不用从巴别塔那里传来消息就可以工作。我正在深入研究这个问题。这似乎与IPC和ES6有关。不过,这可能是一个选项。请注意对文章的编辑。我的测试用例中的问题已经确定。谢谢!已经兜了好长时间的圈子了