Отладка дочернего процесса NodeJS 'babel-узел VSCode - PullRequest
0 голосов
/ 07 февраля 2019

Я использую babel-node для моего runtimeExecutable в моем launch.json, как показано в в этом ответе .Причина этого заключается в том, что я использую импорт ES6 и точки останова в VSCode, перемещенные из-за транспорта и исходных карт.

launch.json

{
    "version": "0.2.0",
    "configurations": [{
        "type": "node",
        "request": "launch",
        "name": "Debug",
        "autoAttachChildProcesses": true,
        "program": "${workspaceFolder}/index.js",
        "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/babel-node",
        "runtimeArgs": [
            "--nolazy"
        ],
        "env": {
            "BABEL_ENV": "debug"
        }
    }]
}

app.js (где я разветвляю дочерние процессы)

(async () => {
    const process1 = fork(path.join(__dirname, "children", "process", "one.js"));
    const process2 = fork(path.join(__dirname, "children", "process", "two.js"));

    process1.send("start");
    process2.send("start");
})();

one.js / two.js

process.on("message", async (message) => {
    console.log("message - " + message);
    await init();
});

Содержание файлов не так важно, но я все равно их туда положу.Я могу отлаживать IIFE app.js отлично.При пропуске пропущенных строк, где я запускаю новый процесс ', я получаю эту ошибку в консоли:

ошибка: неизвестный параметр `--inspect-brk'

Iвзял autoAttachChildProcesses правило от этого ответа , но я предполагаю, что babel-node имеет сложные вещи.

У меня есть точки останова в обоих one.js и two.js в обратных вызовах для события «message», но они становятся непроверенными точками останова при инициализации отладки.

EDIT

Теперь я изменил использование модуля NodeJS cluster вместо child_process исключительно из-за всех найденных примеров использования cluster.

My now launch.json config:

{
    "type": "node",
    "request": "launch",
    "name": "Debug 2",
    "autoAttachChildProcesses": true,
    "stopOnEntry": false,
    "program": "${workspaceFolder}/index.js",
    "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/babel-node",
    "console": "internalConsole",
    "runtimeArgs": [
        "--nolazy"
    ],
    "env": {
        "BABEL_ENV": "debug"
    },
    "skipFiles": [
        "node_modules/**/*.js",
        "<node_internals>/**/*.js"
    ]
}

Проект инициализируется index.js:

require("dotenv").config();
console.log("::: index.js :::");

require("./src/app.js")

src / app.js

import express from "express";
import session from "express-session";
import bodyParser from "body-parser";
import morgan from "morgan";
import cors from "cors";
import chalk from "chalk";
import cluster from "cluster";

const app = express();
const log = console.log;
const numCpus = 4;
console.log("::: app.js :::");

console.log(`::: Master or Worker?: ${(cluster.isMaster) ? "Master" : "Worker"}`);
if (cluster.isMaster) {
    app.use(bodyParser.json());
    app.use(morgan("combined"));
    app.use(cors());
    app.use(session({
        secret: "test",
        resave: false,
        saveUninitialized: true,
    }));

    app.listen(process.env.PORT || 3000, () => {
        log(chalk.green("--------------------"));
        log(chalk.green(`Host:\t${process.env.HOST || "localhost"}`));
        log(chalk.green(`Port:\t${process.env.PORT || 3000}`))
        log(chalk.green("--------------------"));
    });

    for (let i = 0; i < numCpus; i++) {
        console.log("::: forking :::");
        cluster.fork();
    }

    cluster.on("online", (worker) => {
        console.log(`Worker ${worker.id} is now online after it has been forked`);
    });
    cluster.on("listening", (worker, address) => {
        console.log(`A worker is now connected to ${address.address}:${address.port}`);
    });
    cluster.on("fork", (worker) => {
        console.log(`New worker being forked: ${worker.id}`)
    });
    cluster.on("exit", (worker, code, signal) => {
        console.log(`Worker ${worker.id} died ${signal || code}`);
    });
    cluster.on("death", (worker) => {
        console.log(`Worker ${worker.id} died`)
    });
} else {
    require("./worker.js")
}

export default app;

src/worker.js

console.log("I'M A NEW WORKER!")

Если из терминала я запускаю npm run start:dev, который запускается:

NODE_ENV = development $ (npm bin) / babel-узел index.js

Я получаюВывод:

enter image description here

, что мне кажется правильным, поэтому настройка кластера кажется правильной.

При попытке отладить это,тем не менее, я получаю разные результаты, и точки останова в состоянии else никогда не появляются вместе с надписью «Я НОВЫЙ РАБОТНИК!»никогда не регистрируется.Команда при отладке:

babel-node --nolazy --inspect-brk = 33597 index.js

Я установил точки останова вокруг src/app.js и index.js .Сначала все кажется нормальным, но после завершения цикла for и запуска обоих cluster.fork() происходит странная вещь.Отладка возвращается и вызывает index.js для процесса parent .До этого дочерние процессы существуют в стеке вызовов, но только в течение установленного промежутка времени (но нет журналов консоли, сообщающих, что они вышли) .После этого отладчик говорит, что он все еще работает, но ни одна точка останова не была достигнута.Точки останова в src / worker.js - это не проверено .В результате все журналы, которые я вижу в консоли:

enter image description here

1 Ответ

0 голосов
/ 09 февраля 2019

У меня со временем все заработало, и, как я и подозревал, это вызвало babel-node проблему.Я удалил babel-node из runtimeExecutable в моем launch.json и вместо этого добавил @babel/register в качестве аргумента командной строки для транспиляции.Мой окончательный launch.json выглядит следующим образом:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "Debug",
            "autoAttachChildProcesses": true,
            "program": "${workspaceFolder}/index.js",
            "console": "internalConsole",
            "runtimeArgs": ["--nolazy", "--require", "@babel/register"],
            "env": {
                "BABEL_ENV": "debug",
                "NODE_ENV": "debug"
            },
            "skipFiles": ["node_modules/**/*.js", "<node_internals>/**/*.js"]
        }
    ]
}

Несмотря на то, что это была проблема, я все еще не уверен относительно , почему это была проблема.Если кто-то сможет найти причину, почему это была проблема, тогда я с радостью наградлю вас за вознаграждение ... иначе это пойдет на пользу:)

...