javascript - Feilsøk Node.js Async/Await med Typescript+VSCode


Jeg har sjekket de følgende svarene:

async await med nodejs 7

Hvordan feilsøke async/await i Visual Studio Code?

Men ingen av dem har løst problemet mitt.

Jeg vil kunne feilsøke native Async/Await fra VSCode ved bruk av Node.js v7.4.0 uten den forferdelige Typescript-transpilerte versjonen. Jeg klarer å få Typescript til å generere riktig kode, altså uten __awaiter osv. Imidlertid, når jeg prøver å feilsøke koden, dukker all den transpilerte tilstandsmaskinkoden opp!? Så jeg kan feilsøke koden, det er bare ikke koden jeg ønsker å feilsøke. Finnes det en måte å hindre at den feilsøkte koden får den transpilerte tilstandsmaskinkoden?

Her er konfigurasjonsfilene jeg har:

tsconfig.json

{
    "compilerOptions": {
        "target": "es2017",

        "module": "commonjs",
        "noImplicitAny": false,
        "sourceMap": true,
        "outDir": "lib",
        "noUnusedParameters": false,
        "noUnusedLocals": false,
        "skipLibCheck": true
        //"importHelpers": true
    },
        "exclude": [
        "node_modules"
    ]
}

launch.json

{
    "name": "Launch",
    "type": "node",
    "request": "launch",
    "program": "${workspaceRoot}/node_modules/jest-cli/bin/jest.js",
    "stopOnEntry": false,
    "cwd": "${workspaceRoot}",
    //"preLaunchTask": "tsc",
    "runtimeExecutable": null,
    "args": [
        "--runInBand"
    ],
    "runtimeArgs": [
        "--harmony-async-await",
        "--no-deprecation"
    ],
    "env": {
        "NODE_ENV": "development"
    },
    "console": "integratedTerminal",
    "sourceMaps": true,
    "outFiles": [
        "${workspaceRoot}/{lib}/**/*.js"
    ],
    "skipFiles": [
        "node_modules/**/*.js",
        "lib/**/*.js"
    ]
}

For å illustrere nærmere hva jeg mener, her er et utdrag av kode i den genererte JavaScript-en:

let handler = subscription.messageSubscription.handler;
debugger;
await handler(message.message, context);

Men når det feilsøkes ser det slik ut:

case 4:
    handler = subscription.messageSubscription.handler;
    debugger;
    return [4 /*yield*/, handler(message.message, context)];
case 5:

Svar #1

Jeg legger til "smartStep": true i launch.json og feilsøking av await/async-mønsteret fungerer som ønsket (ved bruk av Node v8.4.0).

Dette er min launch.json:

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Launch Program",
      "program": "${workspaceRoot}/src/main.ts",
      "cwd": "${workspaceRoot}",
      "console": "integratedTerminal",
      "outFiles": [ "${workspaceRoot}/dist/*.js" ],
      "sourceMaps": true,
      "preLaunchTask": "build",
      "smartStep": true
    }
  ]

}

For flere detaljer, se https://code.visualstudio.com/updates/vApril#_smart-code-stepping.

Det er ikke en perfekt løsning, fordi med smartStep kan du ikke feilsøke i bibliotekkode, så du må manuelt kommentere ut dette alternativet hvis du vil feilsøke i biblioteket. Kanskje noen vet hvordan man kan løse denne lille ubeleiligheten.

Svar #2

Endelig funnet ut av det. Bruker Typescript og Jest. Deling av det jeg har, forhåpentligvis vil det hjelpe noen. Node 11, VScode 1.34.0

launch.json:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "Jest Current File",
            "program": "${workspaceFolder}/node_modules/.bin/jest",
            "args": ["-i", "${relativeFile}"],                
            "console": "integratedTerminal",
            "internalConsoleOptions": "neverOpen",
            "disableOptimisticBPs": true,
            "sourceMaps": true,
            "smartStep": true,
            "windows": {
                "program": "${workspaceFolder}/node_modules/jest/bin/jest"
            }
        }
    ]
}


tsconfig.json:

{
    "compileOnSave": false,
    "compilerOptions": {
        "baseUrl": ".",
        "outDir": "./dist/out-tsc",
        "sourceMap": true,
        "inlineSources": true,
        "sourceRoot": "/",
        "declaration": false,
        "module": "es2015",
        "esModuleInterop": true,
        "resolveJsonModule": true,
        "stripInternal": true,
        "moduleResolution": "node",
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "target": "es2017",
        "typeRoots": ["node_modules/@types"],
        "lib": ["es2018", "dom", "esnext.asynciterable"],
        "types": ["chrome", "node", "jest"]         
    }
}

Dette fungerer imidlertid bare i noen scenarier. Hvis du kan kompilere appen din til JS ES2017, fungerer det. Angular kan ikke kompileres til den ES-versjonen, så det fungerer bare med noen testfiler. Det er veldig frustrerende at Angular-kompilering ikke gir ut ES2017, og det vil ikke gjøre det de neste mange årene heller.

Relaterte artikler