如何在Node.js和TypeScript中获取异步堆栈跟踪?

6

我希望在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);
})

导致的堆栈跟踪没有提到 level1level2level3

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

1个回答

8

经过一些调查并注意到__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

只需记住,如果您需要针对旧环境进行目标定位,则使用不同的生产目标即可。 - Aluan Haddad
注意,当目标设置为“es2017”时,我能够获得正确的堆栈跟踪。对于我的用例来说,这非常重要,因为使用“es2018”目标似乎会使Webpack的Terser插件非常不满意。 - Peter Wagener
要么是这个,要么是 Node.js 版本 16 帮了忙。我正在使用 ts-node - Riki137
1
@Riki137,仅仅这样做并没有添加堆栈跟踪,尽管我最初尝试了。我不确定它是否对我产生了影响,或者只有“es2018”的目标才能实现。 - Daniel Kaplan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接