6

I wish I could get stack traces to work in TypeScript. I only seem to see the bottommost function name. I'm using Node.js v12.4.0 on Windows 10 (1803).

This is the code:

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

The resulting stack trace that does not mention level1 or level2 or 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
Pang
  • 9,564
  • 146
  • 81
  • 122
ubershmekel
  • 11,864
  • 10
  • 72
  • 89
  • See also: [TypeScript tsconfig settings for Node.js 12?](https://stackoverflow.com/q/59787574) – Pang Jan 27 '21 at 00:51

1 Answers1

7

After some research and noticing the __awaiter, I decided to inspect what's TypeScript targeting. That was my problem.

Here's my bad tsconfig.json:

{
    "compilerOptions": {
      "experimentalDecorators": true,
      "emitDecoratorMetadata": true,
      "downlevelIteration": true,
    },
    "include": [
        "server/**/*", "tests"
    ],
    "exclude": [
        "node_modules",
        "**/*.spec.ts"
    ]
}

And this "target": "es2018" fixed it:

{
    "compilerOptions": {
      "experimentalDecorators": true,
      "emitDecoratorMetadata": true,
      "downlevelIteration": true,
      "target": "es2018"
    },
    "include": [
        "server/**/*", "tests"
    ],
    "exclude": [
        "node_modules",
        "**/*.spec.ts"
    ]
}

Resulting in this stack trace:

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
Pang
  • 9,564
  • 146
  • 81
  • 122
ubershmekel
  • 11,864
  • 10
  • 72
  • 89
  • Just remember to use a different production target if you have to target older environments. – Aluan Haddad Jun 24 '19 at 07:00
  • Note I'm able to get the proper stack track when targeting "es2017". This is important for my use case as using the "es2018" target seems to make the Terser plugin of Webpack very unhappy. – Peter Wagener Jan 15 '20 at 14:21
  • either this or nodejs version 16 helped. I am using `ts-node`. – Riki137 Jun 14 '21 at 19:44
  • 1
    @Riki137 that alone didn't add stack traces, though i tried it first. I'm not sure if it made a difference for me or if only the target of `es2018` did it. – Daniel Kaplan Jan 16 '22 at 06:55