javascript - Ladenie koncových bodov Nextjs API pomocou VSCode
Momentálne musím manuálne nájsť, v ktorom súbore (API endpoint) mám nastaviť breakpoint v priečinku /api vo VSCode.
Mám nasledujúci launch.json:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Attach to application",
"skipFiles": ["<node_internals>/**"],
"port": 9229
}
]
}
Existuje spôsob, ako automaticky zastaviť alebo nastaviť breakpoint kedykoľvek príde požiadavka na konkrétnu Nextjs API trasu?
Napríklad, povedzme, že mám /api/data.tsx :
import { NextApiRequest, NextApiResponse } from 'next';
import { StatusCodes } from 'http-status-codes';
import getConfig from 'next/config';
export default async (req: NextApiRequest, res: NextApiResponse): Promise<void> => {
console.log('do some logging');
res.status(StatusCodes.OK).json({message: 'Good job buddy!'});
}
A chcem zastaviť na console.log pri každom prichádzajúcom požiadavke. Ako to môžem urobiť?
Odpoveď č. 1
Mal som rovnaký problém kliknutím na postranný panel vo VSCode, aby som umiestnil červené bodky.
Dobrá správa je, že stále existuje riešenie. Vo VSCode namiesto toho, aby ste klikli a nastavili červenú bodku na riadku, ktorý chcete, jednoducho napíšte na tom riadku debugger. Nie je jasné, prečo by to fungovalo jedným spôsobom, ale nie druhým - možno existuje ešte jedno nastavenie, ktoré by umožnilo, aby nastavovanie bodiek kliknutím skutočne fungovalo? Zatiaľ je to pre mňa najlepšie riešenie s API trasami:
npm run devTeraz pripojte debugger s nasledujúcim launch.json. (Môj projekt next.js bol v podpriečinku mojej pracovnej zložky, takže moja vlastná konfigurácia to musela odrážať. Nižšie uvedená konfigurácia predpokladá, že koreň projektu Next.js je rovnaký ako $workspaceFolder.)
{
"name": "Attach",
"port": 9229,
"request": "attach",
"webRoot": "${workspaceFolder}", // mine had another subfolder here
"cwd": "${workspaceFolder}", // and here
"skipFiles": [
"<node_internals>/**"
],
"type": "pwa-node"
},
Teraz vo VSCode, kdekoľvek chcete bod prerušenia:
handler.get(async (req, res) => {
debugger;
console.log....
});
Malo by to skončiť niečím takýmto
Odpoveď č. 2
Mám rovnaký problém, ale vyriešil som ho dvoma krokmi:
Pridajte riadok do súboru settings.json vo VSCode:
"debug.javascript.usePreview": falseNepoužívajte
NODE_OPTIONS="--inspect"
Potom stále môžete vidieť nezviazaný bod prerušenia, ale spustite aplikáciu a znova nastavte bod prerušenia, bude červený a bude fungovať správne.
Aktualizovať
Niekedy mám stále problém s nastavením breakpointu na API, takže som si vyhradil niekoľko hodín, aby som zistil, čo je skutočný problém. Nakoniec som našiel príčinu:
Pretože keď spustíte aplikáciu Nextjs, Node najprv spustí skript next, potom skript next vytvorí dcérsky proces, ktorý je váš vlastný kód. Nextjs tiež automaticky nastaví NODE_OPTIONS=--inspect, keď používate režim vývoja, ale používa iné číslo portu a číslo sa automaticky mení. HLAVNÝ BOD je: Skript Next a dcérsky proces budú mať rôzne čísla portov na ladenie. To je dôvod, prečo niekedy nemôžete nastaviť body prerušenia.
Existujú niektoré scenáre:
- Ak spustíte svoj server manuálne v termináli VSCODE zadaním „npm run dev“, VSCODE automaticky nájde debugovacie porty a bude všetko v poriadku.
- Ak spustíte svoj server mimo VSCODE z terminálu a potom použijete
attach, VSCODE pripojí iba jeden port, obvykle iba k skriptu Nextjs. Preto nemôžete nastaviť bod prerušenia vo vlastnom kóde. - Ak použijete metódu
launchna spustenie servera v súbore launch.json, nastane rovnaký problém ako pri č. 2. Nemôžete nastaviť svoj breakpoint.
Existuje jednoduchý spôsob, ako vyriešiť problém: Buď spustite server z interného terminálu VSCODE, alebo do launch.json pridajte:
"autoAttachChildProcesses": true,
potom môžete začať ladenie stlačením F5 a všetko pôjde dobre.
{
"name": "Next.js: debug full stack",
"type": "node-terminal",
"request": "launch",
"command": "npm run dev",
"serverReadyAction": {
"pattern": "started server on .+, url: (https?://.+)",
"uriFormat": "%s",
"action": "debugWithChrome"
},
"autoAttachChildProcesses": true,
}
Nemusíte pridávať NODE_OPTION='--inspect', ani "debug.javascript.usePreview": false
