javascript - 调试 NodeJS 子进程的 VSCode babel-node
问题描述
我在我的中使用babel-node
我的,如this answer所示。这样做的原因是因为我在 VSCode 中使用 ES6 导入和断点,因为转译和源映射而移动了。runtimeExecutable
launch.json
启动.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
。当跳过通过我 fork new process 的行时,我在控制台中收到此错误:
错误:未知选项 `--inspect-brk'
我从这个答案autoAttachChildProcesses
中得到了规则,但我假设这很复杂。babel-node
我在“消息”事件的回调中的one.js和two.js中都有断点,但是当我初始化调试时它们成为未经验证的断点。
编辑
由于我发现的所有示例都在使用,我现在已经改为使用 NodeJScluster
模块而不是纯粹使用。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
which 运行:
NODE_ENV=开发 $(npm bin)/babel-node index.js
我得到输出:
这对我来说似乎是正确的,所以集群的设置似乎是正确的。
但是,在尝试调试时,我得到了不同的结果,并且else
条件中的断点永远不会与“我是新工人!”一起被击中。从不记录。调试时的命令是:
babel-node --nolazy --inspect-brk=33597 index.js
我在src/app.js和index.js周围放置了断点。最初,一切似乎都很好,但是在for
循环完成并且两个cluster.fork()
s 都运行之后,发生了一件奇怪的事情。调试返回并命中父进程的index.js 。在此之前,子进程存在于调用堆栈中,但仅存在一定时间(但没有控制台日志显示它们已退出)。在此之后,调试器说它仍在运行,但没有遇到断点。src/worker.js中的断点未验证。结果,我在控制台中看到的所有日志都是:
解决方案
我最终让它工作了,正如我所怀疑的那样,它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"]
}
]
}
即使这是问题所在,我仍然不确定为什么会出现问题。如果有人能够找到问题的原因,那么我会很高兴地奖励你赏金......否则它会浪费掉:)
推荐阅读
- python - 当pypy导入任何模块时,有“utf8'编解码器无法解码位置的字节0xcd”
- ruby-on-rails - 如何使 Ajax 与 Rails 中的 form_tag 一起工作?
- python-3.x - TypeError:+ 不支持的操作数类型:Pyspark 的“map”和“list”
- php - 为什么数据不使用 controller@store 方法存储
- c# - 异常在错误的地方被捕获
- c# - 如何将 GridView 中 LinkButton 的 CommandName 传递给 OnClick 事件
- node.js - 尝试发布到 mysql 数据库时出错:“无法读取未定义的属性‘创建’”
- json - 使用 GSON api 解析 JSON 数据
- c - 如何在 switch-case 函数中使用数组?
- google-cloud-dataprep - 删除重复项 + 第一次出现