Необходимо запустить приложение NodeJs из другого приложения NodeJs - PullRequest
0 голосов
/ 18 января 2019

У меня есть приложение NodeJs, работающее в следующем каталоге

Путь первого приложения '/ users / user1 / projects / sampleProject' , работающее на 3000 порту.

Путь второго приложения '/ users / user1 / demoProjects / demo1' , который будет работать на порту 5000 при запуске функции маршрутизатора из первого приложения.

Второе приложение NodeJ еще не запущено (оно будет работать на порту 5000).Он должен запускаться независимо при нажатии на функцию маршрутизатора в первом приложении NodeJs, которое работает на порте 3000, т. Е. (http://localhost:3000/server/startServer). Я новичок в дочерних процессах NodeJ. Пожалуйста, исправьте меня, если я ошибаюсь. И предложите мнеправильный способ сделать это. Спасибо

Запустить приложение другого узла, используя node.js?

Я пробовал, как показано ниже

// First NodeJs application
import { exec } from "child_process";
router.get('/startServer', async (req, res, next) => {
    console.log("Initiated request")
    let startServerInstance = 'cd "/users/user1/demoProjects/demo1" && npm run dev'; // path for the second NodeJs application
    console.log("Server instance path => " + startServerInstance)
    try {
        // exec from child process, Spawns a shell then executes the command within that shell
        let child = exec(startServerInstance, function (err, stdout, stderr) {
            if (err) throw err;
            else {
                console.log("result ")
                res.json({
                    status: 'success'
                });
            }
        });
    } catch (error) {
        res.json({
            status: 'error',
            message: error
        });
    }    
});

Приведенный выше код выполняет команду и запускает второе приложение для запуска в фоновом режиме, но ничего не возвращает. Ошибка или результат успеха.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Обратный вызов дочернего процесса вызывается только после завершения процесса. Если процесс продолжает выполняться, обратный вызов не запускается.

Объяснено здесь - https://nodejs.org/docs/latest-v10.x/api/child_process.html#child_process_child_process_exec_command_options_callback

0 голосов
/ 18 января 2019

Вам необходимо использовать stout и stderror для проверки журналов других серверов. Также ваш код неверен. Если вы используете if без {}, оно не перейдет к выражению else. Вот почему вы не видите текст «результата» в консоли.

import {
    exec
} from "child_process";
router.get('/startServer', async (req, res, next) => {
    console.log("Initiated request")
    let startServerInstance = 'cd "/users/user1/demoProjects/demo1" && npm run dev'; // path for the second NodeJs application
    console.log("Server instance path => " + startServerInstance)
    try {
        // exec from child process, Spawns a shell then executes the command within that shell
        let child = exec(startServerInstance, function(err) {
            if (err) throw err;
            console.log("Server started");
        });

        child.stdout.on('data', (data) => {
            // this is new server output
            console.log(data.toString());
        });
        child.stderr.on('data', (data) => {
            // this is new server error output
            console.log(data.toString());
        });

        res.json({
            status: 'success'
        });
    } catch (error) {
        res.json({
            status: 'error',
            message: error
        });
    }
});
...