javascript - Feilsøking av Nextjs API-endepunkter ved hjelp av VSCode
For øyeblikket må jeg manuelt finne hvilken fil (API-endepunkt) jeg skal sette breakpoint i /api-mappen i VSCode.
Jeg har følgende launch.json:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Attach to application",
"skipFiles": ["<node_internals>/**"],
"port": 9229
}
]
}
Finnes det en måte å automatisk stoppe eller sette et stoppunkt når det kommer en forespørsel til den spesifikke Nextjs API-ruten?
For eksempel, la oss si at jeg har en /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!'});
}
Og vil stoppe på console.log ved hver innkommende forespørsel. Hvordan kan jeg gjøre det?
Svar #1
Jeg hadde samme problemet med å klikke på sidemenyen i VSCode for å plassere de røde prikkene.
Den gode nyheten er at det fortsatt finnes en måte. I VSCode, i stedet for å klikke for å sette den røde prikken på linjen du vil, skriv bare debugger på den linjen i stedet. Ikke sikker på hvorfor det skulle fungere på en måte men ikke den andre - kanskje det finnes en justering til som kan gjøre at det å klikke for å sette prikker faktisk fungerer? Så langt er dette så bra som det blir for meg med API-rutene:
npm run devNå kobler du til feilsøkeren med følgende launch.json. (Mitt Next.js-prosjekt lå i en undermappe av arbeidsområdet mitt, så min egen konfigurasjon måtte reflektere det. Konfigurasjonen nedenfor antar at Next.js-prosjektets rotmappe er den samme som $workspaceFolder.)
{
"name": "Attach",
"port": 9229,
"request": "attach",
"webRoot": "${workspaceFolder}", // mine had another subfolder here
"cwd": "${workspaceFolder}", // and here
"skipFiles": [
"<node_internals>/**"
],
"type": "pwa-node"
},
Nå i VSCode, hvor som helst du vil ha brytpunktet:
handler.get(async (req, res) => {
debugger;
console.log....
});
Bør ende opp med noe som dette
Svar #2
Jeg har det samme problemet, men løst i to trinn:
Legg til en linje i VSCode settings.json:
"debug.javascript.usePreview": falseIkke bruk
NODE_OPTIONS="--inspect"
Da kan du fortsatt se udefinert pausepunkt, men kjør appen og sett pausepunktet igjen, det vil være rødt og fungerer godt.
Oppdater
Noen ganger har jeg fortsatt problemer med å sette et breakpoint på API-en, så jeg brukte noen timer på å finne ut hva det virkelige problemet var. Endelig fant jeg problemet:
Fordi når du kjører en Nextjs-app, vil Node først kjøre next-skriptet, deretter vil next-skriptet starte en underprosess som er din egen kode. Nextjs setter også automatisk NODE_OPTIONS=--inspect når du bruker utviklingsmodus, men den bruker et annet portnummer og tallet endres automatisk. HOVEDPOENGET er: Next-skriptet og underprosessen vil ha forskjellige portnumre for feilsøking. Det er grunnen til at du noen ganger ikke kan sette brytepunkter.
Det finnes noen scenarier:
- Hvis du starter serveren din manuelt i VSCODE-terminalen ved å skrive "npm run dev", vil VSCODE automatisk finne feilsøkingsportene, og du vil være i orden.
- Hvis du starter serveren din utenfor VSCODE fra en terminal, og deretter bruker
attach, vil VSCODE bare koble til én port, vanligvis bare koblet til Nextjs-scriptet. Derfor kan du ikke sette et breakpoint i din egen kode. - Hvis du bruker
launch-metoden for å starte serveren i launch.json, vil samme problem som nummer 2 oppstå. Du kan ikke sette ditt breakpoint.
Det finnes en enkel måte å løse problemet på: Enten start serveren fra VSCODEs interne terminal eller legg til i launch.json:
"autoAttachChildProcesses": true,
så kan du starte feilsøking ved å trykke F5, og alt går bra.
{
"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,
}
Du trenger ikke å legge til NODE_OPTION='--inspect', heller ikke "debug.javascript.usePreview": false
