Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.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脚本中运行Node.js脚本_Javascript_Node.js - Fatal编程技术网

Javascript 如何从另一个Node.js脚本中运行Node.js脚本

Javascript 如何从另一个Node.js脚本中运行Node.js脚本,javascript,node.js,Javascript,Node.js,我有一个名为compile.js的独立节点脚本。它位于一个小型Express应用程序的主文件夹中 有时我会从命令行运行compile.js脚本。在其他情况下,我希望它由Express应用程序执行 这两个脚本都从package.json加载配置数据Compile.js此时不导出任何方法 加载并执行此文件的最佳方式是什么?我已经研究了eval()、vm.RunInNewContext和require,但不确定什么是正确的方法 谢谢你的帮助 分支子进程可能很有用,请参见 从链接处的示例: var cp

我有一个名为
compile.js
的独立节点脚本。它位于一个小型Express应用程序的主文件夹中

有时我会从命令行运行
compile.js
脚本。在其他情况下,我希望它由Express应用程序执行

这两个脚本都从
package.json
加载配置数据
Compile.js
此时不导出任何方法

加载并执行此文件的最佳方式是什么?我已经研究了
eval()
vm.RunInNewContext
require
,但不确定什么是正确的方法


谢谢你的帮助

分支子进程可能很有用,请参见

从链接处的示例:

var cp = require('child_process');

var n = cp.fork(__dirname + '/sub.js');

n.on('message', function(m) {
  console.log('PARENT got message:', m);
});

n.send({ hello: 'world' });
现在,子进程将像。。。同样从示例中可以看出:

process.on('message', function(m) {
  console.log('CHILD got message:', m);
});

process.send({ foo: 'bar' });

但是为了完成简单的任务,我认为创建一个扩展events.EventEmitter类的模块就可以了

您可以使用子进程来运行脚本,并侦听退出和错误事件,以了解进程何时完成或错误何时退出(在某些情况下可能导致退出事件未触发)。此方法的优点是可以使用任何异步脚本,即使是那些没有明确设计为作为子进程运行的脚本,例如您希望调用的第三方脚本。例如:

var childProcess = require('child_process');

function runScript(scriptPath, callback) {

    // keep track of whether callback has been invoked to prevent multiple invocations
    var invoked = false;

    var process = childProcess.fork(scriptPath);

    // listen for errors as they may prevent the exit event from firing
    process.on('error', function (err) {
        if (invoked) return;
        invoked = true;
        callback(err);
    });

    // execute the callback once the process has finished running
    process.on('exit', function (code) {
        if (invoked) return;
        invoked = true;
        var err = code === 0 ? null : new Error('exit code ' + code);
        callback(err);
    });

}

// Now we can run a script and invoke a callback when complete, e.g.
runScript('./some-script.js', function (err) {
    if (err) throw err;
    console.log('finished running some-script.js');
});

请注意,如果在可能存在安全问题的环境中运行第三方脚本,则最好在沙盒vm上下文中运行该脚本。

将此行放在节点应用程序的任何位置

require('child_process').fork('some_code.js'); //change the path depending on where the file is.
在某些_code.js文件中

console.log('calling form parent process');

您是否考虑过var exec=require('child_process')。exec;exec('node/compile.js',…)?会满足您的需要吗?为什么不简单地要求它呢?@dandavis,“compile.js此时不导出任何方法。”@dandavis我实际上认为require可能会工作,只是脚本中有一些异步的东西。可能有一个版本的require具有回调?如果您想向正在调用的节点js脚本添加参数:var process=childProcess.fork(scriptPath,['arg1','arg2']);如果要同步运行简单任务,还需要
子进程.execFileSync(file[,args][,options])
。请参阅,即使我执行
进程,也不会触发on
退出
。退出(0)
子进程。有什么想法吗?最后是一个简单而简短的答案!!非常感谢。