如何使用 Node 和 TypeScript 获取异步堆栈跟踪?
Posted
技术标签:
【中文标题】如何使用 Node 和 TypeScript 获取异步堆栈跟踪?【英文标题】:How can I get async stack traces with Node and TypeScript? 【发布时间】:2019-11-05 20:14:33 【问题描述】:我希望我可以让堆栈跟踪在 TypeScript 中工作。我似乎只看到最底部的函数名称。我在 Windows 10 (1803) 上使用 Node.js v12.4.0。
这是代码:
async function thrower()
throw new Error("test");
async function level1()
return await thrower();
async function level2()
return await level1();
async function level3()
return await level2();
async function main()
try
await level3();
catch(err)
console.warn("main error", err);
console.log("node version", process.version);
main().then(() =>
console.log("all done " + __filename);
).catch((err) =>
console.error("Something went wrong in here :(", __filename, err);
)
未提及level1
或level2
或level3
的结果堆栈跟踪:
ts-node test-stack.ts
node version v12.4.0
main error Error: test
at D:\dev\server\test-stack.ts:2:9
at step (D:\dev\server\test-stack.ts:31:23)
at Object.next (D:\dev\server\test-stack.ts:12:53)
at D:\dev\server\test-stack.ts:6:71
at new Promise (<anonymous>)
at __awaiter (D:\dev\server\test-stack.ts:2:12)
at thrower (D:\dev\server\test-stack.ts:37:12)
at D:\dev\server\test-stack.ts:6:16
at step (D:\dev\server\test-stack.ts:31:23)
at Object.next (D:\dev\server\test-stack.ts:12:53)
all done D:\dev\server\test-stack.ts
【问题讨论】:
另见:TypeScript tsconfig settings for Node.js 12? 【参考方案1】:经过一些研究并注意到__awaiter
,我决定检查 TypeScript 的目标是什么。那是我的问题。
这是我的错误tsconfig.json
:
"compilerOptions":
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"downlevelIteration": true,
,
"include": [
"server/**/*", "tests"
],
"exclude": [
"node_modules",
"**/*.spec.ts"
]
这个"target": "es2018"
修复了它:
"compilerOptions":
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"downlevelIteration": true,
"target": "es2018"
,
"include": [
"server/**/*", "tests"
],
"exclude": [
"node_modules",
"**/*.spec.ts"
]
导致此堆栈跟踪:
ts-node test-stack.ts
node version v12.4.0
main error Error: test
at thrower (D:\dev\server\test-stack.ts:2:9)
at level1 (D:\dev\server\test-stack.ts:6:16)
at level2 (D:\dev\server\test-stack.ts:10:16)
at level3 (D:\dev\server\test-stack.ts:14:16)
at main (D:\dev\server\test-stack.ts:19:11)
at Object.<anonymous> (D:\dev\server\test-stack.ts:27:1)
at Module._compile (internal/modules/cjs/loader.js:774:30)
at Module.m._compile (C:\Users\yuv\AppData\Roaming\npm\node_modules\ts-node\src\index.ts:439:23)
at Module._extensions..js (internal/modules/cjs/loader.js:785:10)
at Object.require.extensions.<computed> [as .ts] (C:\Users\yuv\AppData\Roaming\npm\node_modules\ts-node\src\index.ts:442:12)
all done D:\dev\server\test-stack.ts
【讨论】:
如果您必须针对旧环境,请记住使用不同的生产目标。 请注意,当定位“es2017”时,我能够获得正确的堆栈跟踪。这对我的用例很重要,因为使用“es2018”目标似乎让 Webpack 的 Terser 插件非常不爽。 无论是这个还是 nodejs 版本 16 都有帮助。我正在使用ts-node
。
@Riki137 仅此一项并没有添加堆栈跟踪,尽管我先尝试过。我不确定这是否对我有影响,或者是否只有 es2018
的目标做到了。以上是关于如何使用 Node 和 TypeScript 获取异步堆栈跟踪?的主要内容,如果未能解决你的问题,请参考以下文章
如何删除多行 typeorm - postgresql 和 node.js(typescript)
如何让 Webpack 和 Typescript 使用外部 node_module 文件夹?
如何在 React/TypeScript 应用程序中的模块方法上获取 VSCode 智能感知?