javascript - 调试 NodeJS 子进程的 VSCode babel-node

标签 javascript node.js visual-studio-code child-process

我在 launch.json 中为我的 runtimeExecutable 使用了 babel-node,如 this answer 所示。 .这样做的原因是因为我在 VSCode 中使用 ES6 导入和断点由于转译和源映射而四处移动。

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 (我在其中 fork 子进程)

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

文件的内容不太重要,但我还是想把它们放在那里。我可以完美地调试 app.js 的 IIFE。当跳过通过我 fork 新进程的行时,我在控制台中收到此错误:

error: unknown option `--inspect-brk'

我从 this answer 中获取了 autoAttachChildProcesses 规则但我假设 babel-node 有复杂的东西。

在“消息”事件的回调中,我在 one.jstwo.js 中都有断点,但它们变成了未验证的断点当我初始化调试时。

编辑

我现在已经更改为使用 NodeJS cluster 模块而不是 child_process 纯粹是因为我发现的所有示例都使用 cluster 代替。

我现在的 launch.json 配置:

{
    "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-node index.js

我得到输出:

enter image description here

这对我来说似乎是正确的,因此集群的设置似乎是正确的。

然而,当尝试调试它时,我得到了不同的结果,else 条件中的断点永远不会与“我是一名新员工!”一起出现。永远不会记录。调试时的命令是:

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

我在 src/app.jsindex.js 周围放置了断点。最初,一切似乎都很好,但是在 for 循环完成并且两个 cluster.fork() 都已运行后,奇怪的事情发生了。调试返回并点击 parent 进程的 index.js。在此之前,子进程存在于调用堆栈中,但仅存在一段设定的时间(但没有控制台日志表明它们已退出)。在此之后,调试表明它仍在运行,但从未遇到过断点。 src/worker.js 中的断点未验证。结果,我在控制台中看到的所有日志都是:

enter image description here

最佳答案

我最终让它工作了,正如我所怀疑的那样,是 babel-node 导致了这个问题。我在 launch.json 中删除了 babel-node 作为 runtimeExecutable 而是添加了 @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"]
        }
    ]
}

尽管这是问题所在,但我仍然不确定为什么这是问题所在。如果有人能够找到问题的原因,那么我会很高兴地奖励你......否则它会浪费掉:)

关于javascript - 调试 NodeJS 子进程的 VSCode babel-node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54563965/

相关文章:

javascript - Chrome 版 Firefox 插件 jsView

javascript - 如何在radioButtonList中获得选中的值

javascript - 使用 Axios Node 发布 Tableau REST API

git - 对开发团队的 Codespaces 设置的基数感到困惑

javascript - 复选框状态变化检测

javascript - 检查数组元素的第一个字符

javascript - 如何编写自定义断言以使用磁带测试 Node 或 javascript,或检查子字符串而不是 t.deepEquals()?

azure - 无法在 VSCode 中添加新的 azure 函数

visual-studio-code - 在哪里定义一个共享的problemMatcher来检查终端?

javascript - 将 JS 处理的值附加到要以表单发送的文本区域