Come faccio a eseguire uno script Node.js da un altro script Node.js

Ho uno script Node standalone chiamato compile.js . Si trova all’interno della cartella principale di una piccola app Express.

A volte compile.js script compile.js dalla riga di comando. In altri scenari, voglio che venga eseguito dall’app Express.

Entrambi gli script caricano i dati di configurazione da package.json . Compile.js non esporta alcun metodo in questo momento.

Qual è il modo migliore per caricare questo file ed eseguirlo? Ho esaminato eval() , vm.RunInNewContext e vm.RunInNewContext require , ma non sono sicuro di quale sia l’approccio giusto.

Grazie per qualsiasi aiuto!!

È ansible utilizzare un processo figlio per eseguire lo script e ascoltare gli eventi di uscita e di errore per sapere quando il processo è completato o errori (che in alcuni casi potrebbe provocare l’triggerszione dell’evento di uscita). Questo metodo ha il vantaggio di lavorare con qualsiasi script asincrono, anche quelli che non sono progettati in modo esplicito per essere eseguiti come un processo figlio, come uno script di terze parti che si desidera richiamare. Esempio:

 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, eg runScript('./some-script.js', function (err) { if (err) throw err; console.log('finished running some-script.js'); }); 

Si noti che se si eseguono script di terze parti in un ambiente in cui possono esistere problemi di sicurezza, potrebbe essere preferibile eseguire lo script in un contesto VMM sandbox.

Il processo di forking di un figlio può essere utile, vedi http://nodejs.org/api/child_process.html

Dall’esempio al link:

 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' }); 

Ora, il processo figlio sarebbe come … anche dall’esempio:

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

Ma per svolgere compiti semplici penso che creare un modulo che estenda gli eventi. La class EventoEmitter farà … http://nodejs.org/api/events.html