我有一个独立的Node脚本,名为compile.js
。它位于小型Express应用程序的主文件夹中。
有时,我会从命令行运行compile.js
脚本。在其他情况下,我希望它由Express应用程序执行。
这两个脚本都从package.json
中加载配置数据。目前,compile.js
没有导出任何方法。
什么是最好的方法来加载并执行这个文件呢?我已经查看了eval()
,vm.RunInNewContext
和require
,但不确定哪种方式是正确的。
感谢您的帮助!
我有一个独立的Node脚本,名为compile.js
。它位于小型Express应用程序的主文件夹中。
有时,我会从命令行运行compile.js
脚本。在其他情况下,我希望它由Express应用程序执行。
这两个脚本都从package.json
中加载配置数据。目前,compile.js
没有导出任何方法。
什么是最好的方法来加载并执行这个文件呢?我已经查看了eval()
,vm.RunInNewContext
和require
,但不确定哪种方式是正确的。
感谢您的帮助!
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');
});
请注意,如果在可能存在安全问题的环境中运行第三方脚本,则最好在沙盒虚拟机上下文中运行该脚本。child_process.execFileSync(file[, args][, options])
。请参阅https://nodejs.org/api/child_process.html#child_process_child_process_execsync_command_options。 - João Pimentel Ferreiraprocess.exit(0)
,exit
事件也没有被触发。有什么想法吗? - João Pimentel Ferreira将此行代码放置在 Node 应用程序的任何位置。
require('child_process').fork('some_code.js'); //change the path depending on where the file is.
在 some_code.js 文件中
console.log('calling form parent process');
创建子进程可能很有用,参见http://nodejs.org/api/child_process.html
参考链接中的示例:
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 类的模块就可以了... http://nodejs.org/api/events.html