Подтвердить что ты не робот

Как запустить Node.js script из другого Node.js script

У меня есть автономный Node script, называемый compile.js. Он находится внутри основной папки небольшого приложения Express.

Иногда я запускаю compile.js script из командной строки. В других сценариях я хочу, чтобы он выполнялся приложением Express.

Оба сценария загружают данные конфигурации из package.json. compile.js не экспортирует никаких методов в настоящее время.

Каков наилучший способ загрузить этот файл и выполнить его? Я просмотрел eval(), vm.RunInNewContext и require, но не уверен, что это правильный подход.

Спасибо за любую помощь!

4b9b3361

Ответ 1

Вы можете использовать дочерний процесс для запуска script и прослушивать события выхода и ошибки, чтобы знать, когда процесс завершен или ошибки (что в некоторых случаях может привести к тому, что событие выхода не будет запущено). Этот метод имеет преимущество в работе с любым async script, даже те, которые явно не предназначены для запуска в качестве дочернего процесса, например, для третьей стороны script, которую вы хотите вызвать. Пример:

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

Обратите внимание, что при запуске сторонних скриптов в среде, где могут возникнуть проблемы с безопасностью, может быть предпочтительнее запустить script в изолированном контексте vm.

Ответ 2

Привлечение дочернего процесса может быть полезно, см. 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' });

Но для выполнения простых задач я думаю, что создание модуля, расширяющего события. Класс EventEmitter будет... http://nodejs.org/api/events.html