Я использую 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](https://i.stack.imgur.com/IcoF2.png)
, что мне кажется правильным, поэтому настройка кластера кажется правильной.
При попытке отладить это,тем не менее, я получаю разные результаты, и точки останова в состоянии 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](https://i.stack.imgur.com/HB3Ag.png)