javascript - 如何使用 Node 和 TypeScript 获取异步堆栈跟踪?

标签 javascript node.js typescript asynchronous

我希望能够在 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

最佳答案

经过一番研究并注意到 __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

关于javascript - 如何使用 Node 和 TypeScript 获取异步堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56729503/

相关文章:

javascript - 我如何强制 Angular 手动重新运行其绑定(bind)?

javascript - jQuery 处理按键组合

javascript - 没有回调函数的 SetTimeout() 调用会出现意外的行为

javascript - React setState 重新渲染

node.js - Passport.authenticate() 中间件删除所有 session key

javascript - TypeScript 中的嵌套类抛出错误

typescript - 关于 Vue 3 + TypeScript 和 Augmenting-Types-for-Use-with-Plugins 的问题

node.js - 已成功将 Node 应用程序部署到 OpenShift,OpenShift 仍显示默认页面

javascript - 使用 casperjs 测试 angularjs 应用程序

reactjs - MUI 芯片作为可以选择的标签(类似复选框的行为)