{"id":47708,"date":"2022-03-17T05:58:45","date_gmt":"2022-03-17T08:58:45","guid":{"rendered":"https:\/\/kinsta.com\/pt\/?p=47708&#038;preview=true&#038;preview_id=47708"},"modified":"2023-08-22T04:39:41","modified_gmt":"2023-08-22T07:39:41","slug":"como-depurar-codigo-no-node-js","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/","title":{"rendered":"Como Depurar o C\u00f3digo no Node.js Usando M\u00faltiplas Ferramentas"},"content":{"rendered":"<p><a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-node-js\/\">Node.js \u00e9 um JavaScript runtime<\/a> baseado no mesmo motor V8 usado no navegador Chrome do Google. Ele \u00e9 frequentemente usado para construir aplicativos de servidor e terminal em v\u00e1rias plataformas. <a href=\"https:\/\/kinsta.com\/pt\/blog\/aplicativos-node-js\/\">Node.js tem se tornado cada vez mais popular<\/a> na \u00faltima d\u00e9cada porque \u00e9 <a href=\"https:\/\/kinsta.com\/pt\/blog\/como-instalar-o-node-js\/\">f\u00e1cil de instalar<\/a>, pr\u00e1tico de usar, r\u00e1pido, e permite que os desenvolvedores web do lado do cliente <a href=\"https:\/\/kinsta.com\/pt\/blog\/salario-desenvolvedor-node-js\/\">aproveitem suas habilidades em outros lugares<\/a>.<\/p>\n<p>Entretanto, o desenvolvimento de software continua sendo uma tarefa complexa, e seu c\u00f3digo Node.js falhar\u00e1 em algum momento. Este tutorial demonstra v\u00e1rias ferramentas para ajudar a depurar aplicativos e encontrar a causa de um problema.<\/p>\n<p>Vamos mergulhar.<\/p>\n<h3>Confira nosso Guia em V\u00eddeo para <a href=\"https:\/\/www.youtube.com\/watch?v=Kz8EB9Lhul8\">Depura\u00e7\u00e3o de C\u00f3digo do Node.js<\/a><\/h3>\n<kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=Kz8EB9Lhul8\"><\/kinsta-video>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p><a href=\"https:\/\/deno.land\/\" target=\"_blank\" rel=\"noopener noreferrer\">Deno<\/a> \u00e9 uma alternativa ao JavaScript runtime. \u00c9 similar ao Node.js, mas mais novo, e suaviza algumas das rachaduras e inconsist\u00eancias. As ferramentas e informa\u00e7\u00f5es abaixo podem ser frequentemente aplicadas aos aplicativos Deno e Node.js.<\/p>\n<\/aside>\n\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Vis\u00e3o geral da depura\u00e7\u00e3o<\/h2>\n<p>&#8220;Debugging&#8221; ou &#8220;depura\u00e7\u00e3o&#8221; \u00e9 o nome dado aos v\u00e1rios meios de corre\u00e7\u00e3o de defeitos do software. A corre\u00e7\u00e3o de um bug \u00e9 muitas vezes simples. Encontrar a causa do bug pode ser consideravelmente mais complexo e envolver muitas horas de reflex\u00e3o.<\/p>\n<p>As se\u00e7\u00f5es seguintes descrevem tr\u00eas tipos gerais de erros que voc\u00ea ir\u00e1 encontrar.<\/p>\n<h3>Erros de sintaxe<\/h3>\n<p>Seu c\u00f3digo n\u00e3o segue as regras da linguagem &#8211; por exemplo, quando voc\u00ea omite um par\u00eantese de fechamento ou escreve errado uma declara\u00e7\u00e3o como <code>console.lag(x)<\/code>.<\/p>\n<p>Um bom editor de c\u00f3digo pode ajudar a detectar problemas comuns:<\/p>\n<ul>\n<li>Declara\u00e7\u00f5es com c\u00f3digo de cores v\u00e1lidas ou inv\u00e1lidas<\/li>\n<li>Vari\u00e1veis de verifica\u00e7\u00e3o de tipo<\/li>\n<li>Fun\u00e7\u00e3o de autocompletar e nomes de vari\u00e1veis<\/li>\n<li>Destaque para os par\u00eanteses correspondentes<\/li>\n<li>Blocos de c\u00f3digo de auto endenta\u00e7\u00e3o<\/li>\n<li>Detectando c\u00f3digo inalcan\u00e7\u00e1vel<\/li>\n<li>Refatora\u00e7\u00e3o de fun\u00e7\u00f5es desordenadas<\/li>\n<\/ul>\n<p><a href=\"https:\/\/kinsta.com\/pt\/blog\/editores-html-gratuitos\/\">Editores gratuitos<\/a> como <a href=\"https:\/\/code.visualstudio.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">VS Code<\/a> e <a href=\"https:\/\/atom.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Atom<\/a> t\u00eam grande suporte para Node.js, JavaScript, e TypeScript (que transp\u00f5e para JavaScript). Problemas b\u00e1sicos de sintaxe normalmente podem ser detectados antes de voc\u00ea salvar e testar o seu c\u00f3digo.<\/p>\n<p>Um linter de c\u00f3digo como o <a href=\"https:\/\/eslint.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">ESLint<\/a> tamb\u00e9m relatar\u00e1 erros de sintaxe, endenta\u00e7\u00e3o ruim, e vari\u00e1veis n\u00e3o declaradas. O ESLint \u00e9 uma ferramenta Node.js com a qual voc\u00ea pode instalar globalmente:<\/p>\n<pre><code class=\"language-bash\">npm i eslint -g<\/code><\/pre>\n<p>Voc\u00ea pode verificar os arquivos JavaScript a partir da linha de comando usando:<\/p>\n<pre><code class=\"language-bash\">eslint mycode.js<\/code><\/pre>\n<p>&#8230;mas \u00e9 mais f\u00e1cil usar um plugin de editor como <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=dbaeumer.vscode-eslint\" target=\"_blank\" rel=\"noopener noreferrer\">ESLint para VS Code<\/a> ou <a href=\"https:\/\/atom.io\/packages\/linter-eslint\" target=\"_blank\" rel=\"noopener noreferrer\">linter-eslint para Atom<\/a>, que valida automaticamente o c\u00f3digo \u00e0 medida que voc\u00ea digita:<\/p>\n<figure id=\"attachment_115102\" aria-describedby=\"caption-attachment-115102\" style=\"width: 913px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-115102\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/eslint-vscode.png\" alt=\"ESlint em VS Code\" width=\"913\" height=\"564\"><figcaption id=\"caption-attachment-115102\" class=\"wp-caption-text\">ESlint em VS Code.<\/figcaption><\/figure>\n<h3>Erros l\u00f3gicos<\/h3>\n<p>Seu c\u00f3digo funciona, mas n\u00e3o funciona como voc\u00ea espera. Por exemplo, um usu\u00e1rio n\u00e3o \u00e9 desconectado quando o solicita; um relat\u00f3rio mostra n\u00fameros incorretos; os dados n\u00e3o s\u00e3o totalmente salvos em um banco de dados; etc.<\/p>\n<p>Erros de l\u00f3gica podem ser causados por:<\/p>\n<ul>\n<li>Usando a vari\u00e1vel errada<\/li>\n<li>Condi\u00e7\u00f5es incorretas, por exemplo, <code>if (a &gt; 5)<\/code> em vez de <code>if (a &lt; 5)<\/code><\/li>\n<li>C\u00e1lculos que n\u00e3o levam em conta a preced\u00eancia do operador, por exemplo, <code>1+2*3<\/code> resulta em 7 ao inv\u00e9s de 9.<\/li>\n<\/ul>\n\n<h3>Erros Runtime (ou execu\u00e7\u00e3o)<\/h3>\n<p>Um erro s\u00f3 se torna evidente quando o aplicativo \u00e9 executada, o que muitas vezes leva a uma falha. Os erros de tempo de execu\u00e7\u00e3o podem ser causados por:<\/p>\n<ul>\n<li>Dividindo por uma vari\u00e1vel que foi definida como zero<\/li>\n<li>Tentativa de acessar um item de matriz que n\u00e3o existe<\/li>\n<li>Tentando escrever em um arquivo somente leitura<\/li>\n<\/ul>\n<p>Erros l\u00f3gicos e de tempo de execu\u00e7\u00e3o s\u00e3o mais dif\u00edceis de detectar, embora as seguintes t\u00e9cnicas de desenvolvimento possam ajudar:<\/p>\n<ol>\n<li><strong>Use o Desenvolvimento Guiado por Testes:<\/strong> TTD incentiva voc\u00ea a escrever testes antes que uma fun\u00e7\u00e3o seja desenvolvida, por exemplo, X \u00e9 retornado da fun\u00e7\u00e3oY quando Z \u00e9 passado como um par\u00e2metro. Estes testes s\u00e3o executados durante o desenvolvimento inicial e atualiza\u00e7\u00f5es subsequentes para garantir que o c\u00f3digo continue a funcionar como esperado.<\/li>\n<li><strong>Use um sistema de rastreamento de problemas: <\/strong>N\u00e3o h\u00e1 nada pior do que um e-mail afirmando <i>&#8220;Seu software n\u00e3o funciona&#8221;<\/i>! Sistemas de rastreamento de problemas permitem que voc\u00ea registre problemas espec\u00edficos, etapas de reprodu\u00e7\u00e3o de documentos, determine prioridades, atribua desenvolvedores e acompanhe o progresso das corre\u00e7\u00f5es.<\/li>\n<li><strong>Use o controle de origem: <\/strong>Um sistema de controle de c\u00f3digo fonte <a href=\"https:\/\/kinsta.com\/pt\/blog\/git-vs-github\/\">como o Git<\/a> ir\u00e1 ajud\u00e1-lo a fazer backup do c\u00f3digo, gerenciar as revis\u00f5es e identificar onde um bug foi introduzido. Os reposit\u00f3rios online, incluindo <a href=\"https:\/\/kinsta.com\/pt\/blog\/que-github\/\">Github<\/a> e <a href=\"https:\/\/kinsta.com\/pt\/blog\/bitbucket-vs-github\/\">Bitbucket<\/a>, fornecem espa\u00e7o livre e ferramentas para projetos menores ou de c\u00f3digo aberto.<\/li>\n<\/ol>\n<p>Voc\u00ea ainda encontrar\u00e1 bugs do Node.js, mas as se\u00e7\u00f5es seguintes descrevem maneiras de localizar esse erro elusivo.<\/p>\n<h2>Definir Vari\u00e1veis de Ambiente Apropriadas do Node.js<\/h2>\n<p>As vari\u00e1veis de ambiente definidas no sistema operacional do host podem controlar as configura\u00e7\u00f5es do o aplicativo Node.js e do m\u00f3dulo. A mais comum \u00e9 <code>NODE_ENV<\/code>, que normalmente \u00e9 configurada para desenvolvimento quando da depura\u00e7\u00e3o ou produ\u00e7\u00e3o quando rodando em um servidor ao vivo. Configure ambientes vari\u00e1veis no MacOS ou Linux com o <a href=\"https:\/\/kinsta.com\/pt\/blog\/comandos-linux\/\">comando<\/a>:<\/p>\n<pre><code class=\"language-js\">NODE_ENV=development<\/code><\/pre>\n<p>ou no prompt de comando (cl\u00e1ssico) do Windows:<\/p>\n<pre><code class=\"language-js\">set NODE_ENV=development<\/code><\/pre>\n<p>ou Windows Powershell:<\/p>\n<pre><code class=\"language-js\">$env:NODE_ENV=\"development\"<\/code><\/pre>\n<p>No popular <a href=\"http:\/\/expressjs.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Express.js framework<\/a>, configurar NODE_ENV para desenvolvimento desabilita o cache de arquivos de modelo e emite mensagens de erro verboso, o que pode ser \u00fatil na depura\u00e7\u00e3o. Outros m\u00f3dulos podem oferecer caracter\u00edsticas similares e voc\u00ea pode adicionar uma condi\u00e7\u00e3o NODE_ENV aos aplicativos, por exemplo<\/p>\n<pre><code class=\"language-js\">\/\/ running in development mode?\nconst devMode = (process.env.NODE_ENV !== 'production');\n\nif (devMode) {\n  console.log('application is running in development mode');\n}\n<\/code><\/pre>\n<p>Voc\u00ea tamb\u00e9m pode usar o m\u00e9todo Node&#8217;s <a href=\"https:\/\/nodejs.org\/api\/util.html#utildebuglogsection-callback\" target=\"_blank\" rel=\"noopener noreferrer\">util.debuglog<\/a> para emitir condicionalmente mensagens de erro, por exemplo<\/p>\n<pre><code class=\"language-js\">import { debuglog } from 'util';\nconst myappDebug = debuglog('myapp');\nmyappDebug('log something');\n<\/code><\/pre>\n<p>Este aplicativo s\u00f3 emitir\u00e1 a mensagem de log quando NODE_DEBUG estiver configurado para myapp ou um wildcard como * ou my*.<\/p>\n<h2>Use as op\u00e7\u00f5es de linha de comando do Node.js<\/h2>\n<p>Os scripts de n\u00f3 s\u00e3o normalmente lan\u00e7ados com o n\u00f3 seguido pelo nome do script de entrada:<\/p>\n<pre><code class=\"language-js\">node app.js<\/code><\/pre>\n<p>Voc\u00ea tamb\u00e9m pode definir <a href=\"https:\/\/nodejs.org\/api\/cli.html\" target=\"_blank\" rel=\"noopener noreferrer\">op\u00e7\u00f5es de linha de comando<\/a> para controlar v\u00e1rios aspectos do tempo de execu\u00e7\u00e3o. As bandeiras \u00fateis para depura\u00e7\u00e3o incluem:<\/p>\n<ul>\n<li><code>--check<\/code><br \/>\nsintaxe verifique o script sem executar<\/li>\n<li><code>--trace-warnings<\/code><br \/>\nproduzir um rastreamento de pilha quando as promessas JavaScript n\u00e3o resolvem ou rejeitam<\/li>\n<li><code>--enable-source-maps<\/code><br \/>\nmostrar mapas de origem ao usar um transpiler como o TypeScript<\/li>\n<li><code>--throw-deprecation<\/code><br \/>\navisar quando as caracter\u00edsticas do Node.js depreciado s\u00e3o usadas<\/li>\n<li><code>--redirect-warnings=file<\/code><br \/>\nemitir avisos para um arquivo em vez de stderr<\/li>\n<li><code>--trace-exit<\/code><br \/>\nemitem um rastreamento de pilha quando <code>process.exit()<\/code> \u00e9 chamado.<\/li>\n<\/ul>\n<h2>Mensagens de sa\u00edda para o console<\/h2>\n<p>A sa\u00edda de uma mensagem de console \u00e9 uma das maneiras mais simples de depurar um aplicativo Node.js:<\/p>\n<pre><code class=\"language-js\">console.log(`someVariable: ${ someVariable }`);<\/code><\/pre>\n<p>Poucos desenvolvedores percebem que existem muitos outros m\u00e9todos de console:<\/p>\n<div class=\"responsive-table\">\n<table>\n<thead>\n<tr>\n<th>M\u00e9todo Console<\/th>\n<th>Descri\u00e7\u00e3o<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>.log(msg)<\/code><\/td>\n<td>mensagem de console padr\u00e3o<\/td>\n<\/tr>\n<tr>\n<td><code>.log('%j', obj)<\/code><\/td>\n<td>objeto de sa\u00edda como uma string JSON compacta<\/td>\n<\/tr>\n<tr>\n<td><code>.dir(obj, opt)<\/code><\/td>\n<td>propriedades dos objetos de impress\u00e3o bonita<\/td>\n<\/tr>\n<tr>\n<td><code>.table(obj)<\/code><\/td>\n<td>matrizes de sa\u00edda e objetos em formato tabular<\/td>\n<\/tr>\n<tr>\n<td><code>.error(msg)<\/code><\/td>\n<td>uma mensagem de erro<\/td>\n<\/tr>\n<tr>\n<td><code>.count(label)<\/code><\/td>\n<td>incrementar um contador nomeado e a sa\u00edda<\/td>\n<\/tr>\n<tr>\n<td><code>.countReset(label)<\/code><\/td>\n<td>zerar um contador nomeado<\/td>\n<\/tr>\n<tr>\n<td><code>.group(label)<\/code><\/td>\n<td>indentar um grupo de mensagens<\/td>\n<\/tr>\n<tr>\n<td><code>.groupEnd(label)<\/code><\/td>\n<td>terminar um grupo<\/td>\n<\/tr>\n<tr>\n<td><code>.time(label)<\/code><\/td>\n<td>inicia um temporizador chamado<\/td>\n<\/tr>\n<tr>\n<td><code>.timeLog(label)<\/code><\/td>\n<td>relata o tempo transcorrido<\/td>\n<\/tr>\n<tr>\n<td><code>.timeEnd(label)<\/code><\/td>\n<td>p\u00e1ra um temporizador nomeado<\/td>\n<\/tr>\n<tr>\n<td><code>.trace()<\/code><\/td>\n<td>emitir um rastreamento de pilha (uma lista de todas as chamadas de fun\u00e7\u00e3o feitas)<\/td>\n<\/tr>\n<tr>\n<td><code>.clear()<\/code><\/td>\n<td>desobstruir o console<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><code>console.log()<\/code> tamb\u00e9m aceita uma lista de valores separados por v\u00edrgula:<\/p>\n<pre><code class=\"language-js\">let x = 123;\nconsole.log('x:', x);\n\/\/ x: 123\n<\/code><\/pre>\n<p>&#8230;embora a desestrutura\u00e7\u00e3o do ES6 ofere\u00e7a resultados similares com menos esfor\u00e7o:<\/p>\n<pre><code class=\"language-js\">console.log({ x });\n\/\/ { x: 123 }\n<\/code><\/pre>\n<p>O <strong>console.dir()<\/strong> comanda as propriedades do objeto pretty-prints da mesma forma que o <a href=\"https:\/\/nodejs.org\/api\/util.html#utilinspectobject-options\" target=\"_blank\" rel=\"noopener noreferrer\">util.inspect()<\/a>:<\/p>\n<pre><code class=\"language-js\">console.dir(myObject, { depth: null, color: true });<\/code><\/pre>\n<h3>Controv\u00e9rsia do Console<\/h3>\n<p>Alguns desenvolvedores afirmam que voc\u00ea <i>nunca<\/i> deve usar <code>console.log()<\/code> porque:<\/p>\n<ul>\n<li>Voc\u00ea est\u00e1 mudando de c\u00f3digo e pode alterar algo ou esquecer de remov\u00ea-lo, e<\/li>\n<li>N\u00e3o h\u00e1 necessidade quando h\u00e1 melhores op\u00e7\u00f5es de depura\u00e7\u00e3o.<\/li>\n<\/ul>\n<p>N\u00e3o acredite em ningu\u00e9m que afirma nunca usar <code>console.log()<\/code>! O logging \u00e9 r\u00e1pido e sujo, mas todos o usam em algum momento. Use qualquer ferramenta ou t\u00e9cnica que voc\u00ea preferir. Consertar um bug \u00e9 mais importante do que o m\u00e9todo que voc\u00ea adota para encontr\u00e1-lo.<\/p>\n<h2>Use um Sistema de Registro de Terceiros<\/h2>\n<p>Sistemas de registro de terceiros fornecem recursos mais sofisticados como n\u00edveis de mensagens, verbosidade, classifica\u00e7\u00e3o, sa\u00edda de arquivos, cria\u00e7\u00e3o de perfis, relat\u00f3rios e muito mais. Solu\u00e7\u00f5es populares incluem <a href=\"https:\/\/www.npmjs.com\/package\/cabin\" target=\"_blank\" rel=\"noopener noreferrer\">cabine<\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/loglevel\" target=\"_blank\" rel=\"noopener noreferrer\">n\u00edvel de log<\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/morgan\" target=\"_blank\" rel=\"noopener noreferrer\">morgan<\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/pino\" target=\"_blank\" rel=\"noopener noreferrer\">pino<\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/signale\" target=\"_blank\" rel=\"noopener noreferrer\">signale<\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/storyboard\" target=\"_blank\" rel=\"noopener noreferrer\">storyboard<\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/tracer\" target=\"_blank\" rel=\"noopener noreferrer\">tra\u00e7ador<\/a> e <a href=\"https:\/\/www.npmjs.com\/package\/winston\" target=\"_blank\" rel=\"noopener noreferrer\">winston<\/a>.<\/p>\n<h2>Use o Inspetor V8<\/h2>\n<p>O motor JavaScript V8 fornece um <a href=\"https:\/\/nodejs.org\/api\/debugger.html\" target=\"_blank\" rel=\"noopener noreferrer\">cliente de depura\u00e7\u00e3o<\/a> que voc\u00ea pode usar no Node.js. Comece um aplicativo usando a inspe\u00e7\u00e3o do Node, por exemplo<\/p>\n<pre><code class=\"language-js\">node inspect app.js<\/code><\/pre>\n<p>O depurador para na primeira linha e exibe um prompt de debug&gt; debug:<\/p>\n<pre><code class=\"language-js\">$ node inspect .\\mycode.js\n&lt; Debugger listening on ws:\/\/127.0.0.1:9229\/143e23fb\n&lt; For help, see: https:\/\/nodejs.org\/en\/docs\/inspector\n&lt;\n ok\n&lt; Debugger attached.\n&lt;\nBreak on start in mycode.js:1\n&gt; 1 const count = 10;\n  2\n  3 for (i = 0; i &lt; counter; i++) {\ndebug&gt;\n<\/code><\/pre>\n<p>Entre na ajuda para ver uma lista de comandos. Voc\u00ea pode passar atrav\u00e9s da aplicativo entrando:<\/p>\n<ul>\n<li><strong>cont<\/strong> ou <strong>c<\/strong>: continuar a execu\u00e7\u00e3o<\/li>\n<li><strong>next<\/strong>\u00a0ou <strong>n<\/strong>: execute o pr\u00f3ximo comando<\/li>\n<li><strong>step<\/strong>\u00a0ou <strong>s<\/strong>: entrar em uma fun\u00e7\u00e3o que est\u00e1 sendo chamada<\/li>\n<li><strong>out<\/strong>\u00a0ou <strong>o<\/strong>: sair de uma fun\u00e7\u00e3o e retornar \u00e0 declara\u00e7\u00e3o de chamada<\/li>\n<li><strong>pause<\/strong>: pausa do c\u00f3digo de execu\u00e7\u00e3o<\/li>\n<li><strong>watch(&#8216;myvar&#8217;)<\/strong>: veja uma vari\u00e1vel<\/li>\n<li><strong>setBreakPoint()<\/strong> ou <strong>sb()<\/strong>: definir um ponto de quebra<\/li>\n<li><strong>restart<\/strong>: reinicie o script<\/li>\n<li><strong>.exit<\/strong> ou <strong>Ctrl | Cmd + D<\/strong>: sair do depurador<\/li>\n<\/ul>\n<p>\u00c9 verdade que esta op\u00e7\u00e3o de depura\u00e7\u00e3o \u00e9 demorada e complicada. Use-a apenas quando n\u00e3o houver outra op\u00e7\u00e3o, como quando voc\u00ea estiver executando c\u00f3digo em um servidor remoto e n\u00e3o puder se conectar de outro lugar ou instalar software adicional.<\/p>\n<h2>Use o navegador Chrome para depurar o c\u00f3digo no Node.js<\/h2>\n<p>A op\u00e7\u00e3o de inspe\u00e7\u00e3o Node.js usada acima inicia um servidor Web Socket que escuta na porta 9229 do localhost. Ele tamb\u00e9m inicia um cliente de depura\u00e7\u00e3o baseado em texto, mas \u00e9 poss\u00edvel usar clientes gr\u00e1ficos &#8211; como o <a href=\"https:\/\/kinsta.com\/pt\/blog\/ferramenta-inspecionar\/\">integrado no Google Chrome e navegadores baseados no Chrome<\/a> como Chromium, Edge, Opera, Vivaldi e <a href=\"https:\/\/kinsta.com\/pt\/blog\/revisao-brave-browser\/\">Brave<\/a>.<\/p>\n<p>Para depurar um aplicativo web t\u00edpico, inicie-a com a op\u00e7\u00e3o &#8211;inspect para habilitar o servidor Web Socket do depurador V8:<\/p>\n<pre><code class=\"language-js\">node --inspect index.js<\/code><\/pre>\n<p>Nota:<\/p>\n<ul>\n<li>index.js \u00e9 presumido ser o script de entrada da aplicativo.<\/li>\n<li>Certifique-se de usar <code>--inspect<\/code> com tra\u00e7os duplos para garantir que voc\u00ea n\u00e3o inicie o cliente de depura\u00e7\u00e3o baseado em texto.<\/li>\n<li>Voc\u00ea pode usar <a href=\"https:\/\/nodemon.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">nodemon<\/a> ao inv\u00e9s de node se voc\u00ea quiser reiniciar automaticamente a aplicativo quando um arquivo for alterado.<\/li>\n<\/ul>\n<p>Por padr\u00e3o, o depurador s\u00f3 aceitar\u00e1 conex\u00f5es de entrada da m\u00e1quina local. Se voc\u00ea estiver executando o aplicativo em outro dispositivo, m\u00e1quina virtual, ou container Docker, use:<\/p>\n<pre><code class=\"language-js\">node --inspect=0.0.0.0:9229 index.js<\/code><\/pre>\n<figure id=\"attachment_115105\" aria-describedby=\"caption-attachment-115105\" style=\"width: 907px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-115105\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/node-inspect.png\" alt=\"op\u00e7\u00e3o de node inspect\" width=\"907\" height=\"339\"><figcaption id=\"caption-attachment-115105\" class=\"wp-caption-text\">op\u00e7\u00e3o de node inspect.<\/figcaption><\/figure>\n<p>Voc\u00ea tamb\u00e9m pode usar <code>--inspect-brk<\/code> ao inv\u00e9s de <code>--inspect<\/code> para interromper o processamento (definir um ponto de parada) na primeira linha para que voc\u00ea possa passar pelo c\u00f3digo desde o in\u00edcio.<\/p>\n<p>Abra um navegador baseado no Chrome e entre <code>chrome:\/\/inspect<\/code> na barra de endere\u00e7os para visualizar dispositivos locais e em rede:<\/p>\n<figure id=\"attachment_115106\" aria-describedby=\"caption-attachment-115106\" style=\"width: 911px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-115106 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/chrome-inspect.png\" alt=\"Ferramenta de inspe\u00e7\u00e3o do Chrome\" width=\"911\" height=\"409\"><figcaption id=\"caption-attachment-115106\" class=\"wp-caption-text\">Ferramenta de inspe\u00e7\u00e3o do Chrome<\/figcaption><\/figure>\n<p>Se o seu plicativo Node.js tamb\u00e9m n\u00e3o aparecer como um <strong>alvo remoto<\/strong>:<\/p>\n<ul>\n<li>Clique em Open dedicated DevTools for Node e escolha o endere\u00e7o e a porta, ou<\/li>\n<li>Verifique <strong>Discover network targets<\/strong>, clique em <strong>Configure<\/strong>, depois adicione o endere\u00e7o IP e a porta do dispositivo onde ele est\u00e1 rodando.<\/li>\n<\/ul>\n<p>Clique no link de <strong>inspect<\/strong>\u00a0do Target para abrir o cliente DevTools debugger. Isto deve ser familiar a qualquer um que tenha usado DevTools para depura\u00e7\u00e3o de c\u00f3digo do lado do cliente:<\/p>\n<figure id=\"attachment_115107\" aria-describedby=\"caption-attachment-115107\" style=\"width: 920px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-115107\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/chrome-devtools.png\" alt=\"Chrome DevTools\" width=\"920\" height=\"550\"><figcaption id=\"caption-attachment-115107\" class=\"wp-caption-text\">Chrome DevTools.<\/figcaption><\/figure>\n<p>Mude para o painel <strong>Sources<\/strong>. Voc\u00ea pode abrir qualquer arquivo pressionando Cmd | Ctrl + P e digitando seu nome de arquivo (como index.js).<\/p>\n<p>Entretanto, \u00e9 mais f\u00e1cil adicionar a pasta do seu projeto ao espa\u00e7o de trabalho. Isso permite carregar, editar e salvar arquivos diretamente do DevTools (se voc\u00ea acha que isso \u00e9 uma boa id\u00e9ia \u00e9 outra quest\u00e3o!)<\/p>\n<ol>\n<li>Clique em <strong>+ Add folder to workspace<\/strong><\/li>\n<li>Selecione a localiza\u00e7\u00e3o do seu projeto Node.js<\/li>\n<li>Pressione <strong>Agree<\/strong><strong>\u00a0<\/strong>para permitir mudan\u00e7as no arquivo<\/li>\n<\/ol>\n<p>Agora voc\u00ea pode carregar arquivos a partir da \u00e1rvore de diret\u00f3rios \u00e0 esquerda:<\/p>\n<figure id=\"attachment_115113\" aria-describedby=\"caption-attachment-115113\" style=\"width: 1167px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-115113\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/chrome-sources-2.png\" alt=\"Chrome DevTools Sources panel\" width=\"1167\" height=\"843\"><figcaption id=\"caption-attachment-115113\" class=\"wp-caption-text\">Chrome DevTools Sources Panel<\/figcaption><\/figure>\n<p>Clique em qualquer n\u00famero de linha para definir um ponto de parada assinalado por um marcador azul.<\/p>\n<p>A depura\u00e7\u00e3o \u00e9 baseada em breakpoints. Estes especificam onde o depurador deve interromper a execu\u00e7\u00e3o do programa e mostrar o estado atual do programa (vari\u00e1veis, Call Stack, etc.)<\/p>\n<p>Voc\u00ea pode definir qualquer n\u00famero de breakpoints na interface do usu\u00e1rio. Outra op\u00e7\u00e3o \u00e9 colocar um depurador; declara\u00e7\u00e3o em seu c\u00f3digo, que quando um depurador \u00e9 anexado.<\/p>\n<p>Carregue e use o seu aplicativo web para abrir a declara\u00e7\u00e3o onde um ponto de parada \u00e9 definido. No exemplo aqui, <a href=\"http:\/\/localhost:3000\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/localhost:3000\/<\/a> \u00e9 aberto em qualquer navegador, e o DevTools ir\u00e1 interromper a execu\u00e7\u00e3o na linha 44:<\/p>\n<figure id=\"attachment_115114\" aria-describedby=\"caption-attachment-115114\" style=\"width: 1167px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-115114 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/chrome-breakpoint.png\" alt=\"Chrome breakpoint\" width=\"1167\" height=\"843\"><figcaption id=\"caption-attachment-115114\" class=\"wp-caption-text\">Chrome breakpoint<\/figcaption><\/figure>\n<p>O painel do lado direito mostra:<\/p>\n<ul>\n<li>Uma linha de \u00edcones de a\u00e7\u00e3o (veja abaixo).<\/li>\n<li>Um painel de <strong>Watch<\/strong>\u00a0permite que voc\u00ea monitore as vari\u00e1veis clicando no \u00edcone <strong>+<\/strong> e digitando seus nomes.<\/li>\n<li>Um painel de <strong>Breakpoints<\/strong> mostra uma lista de todos os breakpoints e permite que eles sejam habilitados ou desabilitados.<\/li>\n<li>Um painel de <strong>Scope<\/strong> mostra o estado de todas as vari\u00e1veis locais, modulares e globais. Voc\u00ea inspecionar\u00e1 este painel com mais frequ\u00eancia.<\/li>\n<li>Um painel de <strong>Call Stack<\/strong> mostra a hierarquia de fun\u00e7\u00f5es chamadas para chegar a este ponto.<\/li>\n<\/ul>\n<p>Uma linha de \u00edcones de a\u00e7\u00e3o \u00e9 mostrada acima <strong>Paused on breakpoint<\/strong>:<\/p>\n<figure id=\"attachment_115115\" aria-describedby=\"caption-attachment-115115\" style=\"width: 625px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-115115 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/chrome-breakpoint-icons.png\" alt=\"\u00cdcones do Chrome breakpoint\" width=\"625\" height=\"222\"><figcaption id=\"caption-attachment-115115\" class=\"wp-caption-text\">\u00cdcones do Chrome breakpoint<\/figcaption><\/figure>\n<p>Da esquerda para a direita, estes executam as seguintes a\u00e7\u00f5es:<\/p>\n<ul>\n<li><strong>resume execution<\/strong>: Continuar o processamento at\u00e9 o pr\u00f3ximo ponto de parada<\/li>\n<li><strong>step over<\/strong>: Execute o pr\u00f3ximo comando, mas fique dentro do bloco de c\u00f3digo atual &#8211; n\u00e3o pule para nenhuma fun\u00e7\u00e3o que ele chama<\/li>\n<li><strong>step into<\/strong>: Executar o pr\u00f3ximo comando e pular para qualquer fun\u00e7\u00e3o conforme necess\u00e1rio<\/li>\n<li><strong>step into<\/strong>: Continuar o processamento at\u00e9 o final da fun\u00e7\u00e3o e retornar ao comando de chamada<\/li>\n<li><strong>step<\/strong>: Semelhante ao <strong>step into<\/strong>, exceto que n\u00e3o pular\u00e1 para fun\u00e7\u00f5es ass\u00edncronas<\/li>\n<li><strong>deactivate<\/strong> todos os breakpoints<\/li>\n<li><strong>pause on exceptions<\/strong>: Interrompa o processamento quando ocorrer um erro.<\/li>\n<\/ul>\n<h2>Condicional breakpoints<\/h2>\n<p>\u00c0s vezes \u00e9 necess\u00e1rio exercer um pouco mais de controle sobre os breakpoints. Imagine que voc\u00ea tem um loop que completou 1.000 itera\u00e7\u00f5es, mas voc\u00ea s\u00f3 est\u00e1 interessado no estado da \u00faltima:<\/p>\n<pre><code class=\"language-js\">\nfor (let i = 0; i &lt; 1000; i++) {\n  \/\/ set breakpoint here\n}\n<\/code><\/pre>\n<p>Ao inv\u00e9s de clicar 999 vezes em <strong>resume execution<\/strong>, voc\u00ea pode clicar com o bot\u00e3o direito do mouse na linha, escolher <strong>Add conditional breakpoint<\/strong>, e insera uma condi\u00e7\u00e3o como <code>i = 999<\/code>:<\/p>\n<figure id=\"attachment_115116\" aria-describedby=\"caption-attachment-115116\" style=\"width: 979px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-115116 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/chrome-breakpoint-conditional.png\" alt=\"Condicional breakpoint do Chrome\" width=\"979\" height=\"113\"><figcaption id=\"caption-attachment-115116\" class=\"wp-caption-text\">Condicional breakpoint do Chrome<\/figcaption><\/figure>\n<p>O Chrome mostra breakpoints condicionados em amarelo ao inv\u00e9s de azul. Neste caso, o ponto de parada s\u00f3 \u00e9 acionado na \u00faltima itera\u00e7\u00e3o do la\u00e7o.<\/p>\n<h2>Pontos de Log<\/h2>\n<p>Os pontos de log implementam efetivamente o console.log() sem nenhum c\u00f3digo! Uma express\u00e3o pode ser gerada quando o c\u00f3digo executa qualquer linha, mas n\u00e3o para o processamento, ao contr\u00e1rio de um ponto de parada.<\/p>\n<p>Para adicionar um log point, clique com o bot\u00e3o direito do mouse em qualquer linha, escolha <strong>Add log point<\/strong>, e digite uma express\u00e3o, por exemplo <code>'loop counter i', i<\/code>:<\/p>\n<figure id=\"attachment_115117\" aria-describedby=\"caption-attachment-115117\" style=\"width: 977px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-115117\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/chrome-logpoint.png\" alt=\"Ponto de registro Chrome\" width=\"977\" height=\"111\"><figcaption id=\"caption-attachment-115117\" class=\"wp-caption-text\">Ponto de registro Chrome<\/figcaption><\/figure>\n<p>O console DevTools sai <code>loop counter i: 0<\/code> para <code>loop counter i: 999<\/code> no exemplo acima.<\/p>\n<h2>Use o VS Code para depurar aplicativos do Node.js<\/h2>\n<p><a href=\"https:\/\/code.visualstudio.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">VS Code<\/a>, ou Visual Studio Code, \u00e9 um <a href=\"https:\/\/kinsta.com\/pt\/blog\/melhores-editores-texto\/\">editor de c\u00f3digo<\/a> gratuito da Microsoft que se tornou popular entre os <a href=\"https:\/\/kinsta.com\/pt\/blog\/como-se-tornar-um-desenvolvedor-web\/\">desenvolvedores web<\/a>. O aplicativo est\u00e1 dispon\u00edvel para Windows, macOS e Linux e \u00e9 desenvolvido usando tecnologias web no <a href=\"https:\/\/www.electronjs.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">framework Electron<\/a>.<\/p>\n<p>O VS Code suporta Node.js e tem um cliente de depura\u00e7\u00e3o embutido. A maioria dos aplicativos pode ser depurada sem nenhuma configura\u00e7\u00e3o; o editor iniciar\u00e1 automaticamente o servidor e o cliente de depura\u00e7\u00e3o.<\/p>\n<p>Abra o arquivo inicial (como index.js), ative o painel <strong>Run e Debug<\/strong>, clique no bot\u00e3o <strong>Run e Debug<\/strong>, e escolha o ambiente <strong>Node.js<\/strong>. Clique em qualquer linha para ativar um ponto de parada mostrado como um \u00edcone de c\u00edrculo vermelho. Ent\u00e3o, abra o aplicativo em um navegador como antes &#8211; o c\u00f3digo VS interrompe a execu\u00e7\u00e3o quando o ponto de parada \u00e9 atingido:<\/p>\n<figure id=\"attachment_115119\" aria-describedby=\"caption-attachment-115119\" style=\"width: 1245px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-115119\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/vscode-breakpoint.png\" alt=\"VS Code breakpoint\" width=\"1245\" height=\"881\"><figcaption id=\"caption-attachment-115119\" class=\"wp-caption-text\">VS Code breakpoint<\/figcaption><\/figure>\n<p>As <strong>Variables<\/strong>,\u00a0<strong>Watch<\/strong>,\u00a0<strong>Call Stack<\/strong>, e <strong>Breakpoints<\/strong><strong>\u00a0<\/strong>s\u00e3o similares \u00e0s mostradas nas <a href=\"https:\/\/kinsta.com\/pt\/blog\/ferramenta-inspecionar\/\" target=\"_blank\" rel=\"noopener noreferrer\">ferramentas do Chrome DevTools<\/a>. O painel <strong>Loaded Scripts<\/strong>\u00a0mostra quais scripts foram carregados, embora muitos sejam internos ao Node.js.<\/p>\n<p>A barra de ferramentas de \u00edcones de a\u00e7\u00e3o permite que voc\u00ea o fa\u00e7a:<\/p>\n<ul>\n<li><strong>resume execution<\/strong>: Continuar o processamento at\u00e9 o pr\u00f3ximo ponto de parada<\/li>\n<li><strong>step over<\/strong>: Execute o pr\u00f3ximo comando, mas fique dentro da fun\u00e7\u00e3o atual &#8211; n\u00e3o pule para nenhuma fun\u00e7\u00e3o que ele chama<\/li>\n<li><strong>step into<\/strong>: Executar o pr\u00f3ximo comando e pular para qualquer fun\u00e7\u00e3o que ele chame<\/li>\n<li><strong>step out<\/strong>: Continuar o processamento at\u00e9 o final da fun\u00e7\u00e3o e retornar ao comando de chamada<\/li>\n<li><strong>restart: <\/strong>Reinicie o aplicativo e o depurador<\/li>\n<li><strong>stop<\/strong>: Parar o aplicativo e o depurador<\/li>\n<\/ul>\n<p>Como o Chrome DevTools, voc\u00ea pode clicar com o bot\u00e3o direito do mouse em qualquer linha para adicionar <strong>Conditional breakpoint<\/strong><strong>s<\/strong> e <strong>Log points<\/strong>.<\/p>\n<p>Para mais informa\u00e7\u00f5es, consulte <a href=\"https:\/\/code.visualstudio.com\/docs\/introvideos\/debugging\" target=\"_blank\" rel=\"noopener noreferrer\">Depura\u00e7\u00e3o em Visual Studio Code<\/a>.<\/p>\n<h2>Configura\u00e7\u00e3o avan\u00e7ada de depura\u00e7\u00e3o do VS Code<\/h2>\n<p>Outra configura\u00e7\u00e3o de c\u00f3digo VS pode ser necess\u00e1ria se voc\u00ea quiser depurar o c\u00f3digo em outro dispositivo, uma m\u00e1quina virtual, ou precisar usar op\u00e7\u00f5es alternativas de lan\u00e7amento, como nodemon.<\/p>\n<p>O VS Code armazena configura\u00e7\u00f5es de depura\u00e7\u00e3o em um arquivo launch.json dentro de um diret\u00f3rio <code>.vscode<\/code> em seu projeto. Abra o painel <strong>Run e Debug<\/strong>, clique em <strong>arquivo create a launch.json<\/strong>\u00a0e escolha o ambiente <strong>Node.js<\/strong> para gerar este arquivo. Um exemplo de configura\u00e7\u00e3o \u00e9 fornecido:<\/p>\n<figure id=\"attachment_115120\" aria-describedby=\"caption-attachment-115120\" style=\"width: 1245px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-115120 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/vscode-launchjson.png\" alt=\"Configura\u00e7\u00e3o do depurador do VS Code.\" width=\"1245\" height=\"881\"><figcaption id=\"caption-attachment-115120\" class=\"wp-caption-text\">Configura\u00e7\u00e3o do depurador do VS Code.<\/figcaption><\/figure>\n<p>Qualquer n\u00famero de configura\u00e7\u00f5es pode ser definido como objetos na matriz <code>\"configurations\"<\/code>. Clique em <strong>Add Configuration<\/strong>&#8230; e selecione uma op\u00e7\u00e3o apropriada.<\/p>\n<p>Uma configura\u00e7\u00e3o individual do Node.js pode ser qualquer uma das duas:<\/p>\n<ol>\n<li>Iniciar um processo em si, ou<\/li>\n<li>Anexar a um servidor de depura\u00e7\u00e3o Web Socket, talvez rodando em uma m\u00e1quina remota ou em um cont\u00eainer Docker.<\/li>\n<\/ol>\n<p>Por exemplo, para definir uma configura\u00e7\u00e3o nodemon, selecione <strong>Node.js: Nodemon Setup<\/strong> e mude o script de entrada &#8220;program&#8221; se necess\u00e1rio:<\/p>\n<pre><code class=\"language-js\">{\n  \/\/ custom configuration\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"console\": \"integratedTerminal\",\n      \"internalConsoleOptions\": \"neverOpen\",\n      \"name\": \"nodemon\",\n      \"program\": \"${workspaceFolder}\/index.js\",\n      \"request\": \"launch\",\n      \"restart\": true,\n      \"runtimeExecutable\": \"nodemon\",\n      \"skipFiles\": [\n        \"&lt;node_internals&gt;\/**\"\n      ],\n      \"type\": \"pwa-node\"\n    }\n  ]\n}\n<\/code><\/pre>\n<p>Salve o arquivo <code>launch.json<\/code> e o <strong>nodemon <\/strong>(o &#8220;nome&#8221; da configura\u00e7\u00e3o) aparece na lista suspensa na parte superior do painel <strong>Run and Debug<\/strong>. Clique no \u00edcone verde de execu\u00e7\u00e3o para come\u00e7ar a usar essa configura\u00e7\u00e3o e execute o aplicativo usando nodemon:<\/p>\n<figure id=\"attachment_115121\" aria-describedby=\"caption-attachment-115121\" style=\"width: 1245px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-115121 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/02\/vscode-nodemon.png\" alt=\"Depura\u00e7\u00e3o do VS Code com nodemon\" width=\"1245\" height=\"876\"><figcaption id=\"caption-attachment-115121\" class=\"wp-caption-text\">Depura\u00e7\u00e3o do VS Code com nodemon<\/figcaption><\/figure>\n<p>Como antes, voc\u00ea pode adicionar breakpoints, condicional breakpoints e pontos de registro. A principal diferen\u00e7a \u00e9 que o nodemon ir\u00e1 automaticamente reiniciar seu servidor quando um arquivo for modificado.<\/p>\n<p>Para maiores informa\u00e7\u00f5es, consulte as <a href=\"https:\/\/code.visualstudio.com\/docs\/editor\/debugging#_launch-configurations\" target=\"_blank\" rel=\"noopener noreferrer\">configura\u00e7\u00f5es de lan\u00e7amento do c\u00f3digo VS<\/a>.<\/p>\n<p>As seguintes extens\u00f5es do VS Code tamb\u00e9m podem ajud\u00e1-lo a depurar o c\u00f3digo hospedado em ambientes de servidores remotos ou isolados:<\/p>\n<ul>\n<li><a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=ms-vscode-remote.remote-containers\" target=\"_blank\" rel=\"noopener noreferrer\">Remoto &#8211; Cont\u00eaineres<\/a>: Conectar a aplicativos rodando em cont\u00eaineres Docker<\/li>\n<li><a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=ms-vscode-remote.remote-ssh\" target=\"_blank\" rel=\"noopener noreferrer\">Remoto &#8211; SSH<\/a>: Conectar a aplicativos rodando em um servidor remoto<\/li>\n<li><a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=ms-vscode-remote.remote-wsl\" target=\"_blank\" rel=\"noopener noreferrer\">Remoto &#8211; WSL<\/a>: Conecte a aplicativos rodando no Subsistema Windows para Linux (WSL).<\/li>\n<\/ul>\n<h2>Outras op\u00e7\u00f5es de depura\u00e7\u00e3o do Node.js<\/h2>\n<p>O <a href=\"https:\/\/nodejs.org\/en\/docs\/guides\/debugging-getting-started\/\" target=\"_blank\" rel=\"noopener noreferrer\">Node.js Debugging Guide<\/a> fornece conselhos para uma gama de editores de texto e IDEs, incluindo Visual Studio, JetBrains WebStorm, Gitpod e Eclipse. Atom oferece uma <a href=\"https:\/\/atom.io\/packages\/node-debug\" target=\"_blank\" rel=\"noopener noreferrer\">extens\u00e3o node-debug<\/a>, que integra o depurador do Chrome DevTools no editor.<\/p>\n<p>Uma vez que o seu aplicativo esteja ativo, voc\u00ea pode considerar o uso de servi\u00e7os de depura\u00e7\u00e3o comercial como <a href=\"https:\/\/logrocket.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">LogRocket<\/a> e <a href=\"https:\/\/sentry.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Sentry.io<\/a>, que podem gravar e reproduzir erros do cliente e servidor encontrados por usu\u00e1rios reais.<\/p>\n\n<h2>Resumo<\/h2>\n<p>Historicamente, a <a href=\"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/\">depura\u00e7\u00e3o JavaScript<\/a> tem sido dif\u00edcil, mas tem havido enormes melhorias na \u00faltima d\u00e9cada. A escolha \u00e9 t\u00e3o boa &#8211; se n\u00e3o <i>melhor<\/i> &#8211; quanto as fornecidas para outras linguagens.<\/p>\n<p>Use qualquer ferramenta que seja pr\u00e1tica para localizar um problema. N\u00e3o h\u00e1 nada de errado com console.log() para uma r\u00e1pida busca de bugs, mas o Chrome DevTools ou VS Code pode ser prefer\u00edvel para problemas mais complexos. As ferramentas podem ajud\u00e1-lo a criar um c\u00f3digo mais robusto e voc\u00ea gastar\u00e1 menos tempo corrigindo bugs.<\/p>\n<p><em>Com que pr\u00e1tica de depura\u00e7\u00e3o do Node.js voc\u00ea usa? Compartilhe na se\u00e7\u00e3o de coment\u00e1rios abaixo!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Node.js \u00e9 um JavaScript runtime baseado no mesmo motor V8 usado no navegador Chrome do Google. Ele \u00e9 frequentemente usado para construir aplicativos de servidor e &#8230;<\/p>\n","protected":false},"author":188,"featured_media":47709,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[432,44],"topic":[977,992],"class_list":["post-47708","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-debugging","tag-webdev","topic-frameworks-javascript","topic-node-js"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Como Depurar o C\u00f3digo no Node.js Usando M\u00faltiplas Ferramentas<\/title>\n<meta name=\"description\" content=\"Este tutorial demonstra v\u00e1rias ferramentas para depurar os aplicativos Node e encontrar suas causas principais. Conhe\u00e7a e aprenda de perto.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Como Depurar o C\u00f3digo no Node.js Usando M\u00faltiplas Ferramentas\" \/>\n<meta property=\"og:description\" content=\"Este tutorial demonstra v\u00e1rias ferramentas para depurar os aplicativos Node e encontrar suas causas principais. Conhe\u00e7a e aprenda de perto.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-03-17T08:58:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-22T07:39:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/03\/node-debug.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Craig Buckler\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Este tutorial demonstra v\u00e1rias ferramentas para depurar os aplicativos Node e encontrar suas causas principais. Conhe\u00e7a e aprenda de perto.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/03\/node-debug.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@craigbuckler\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Craig Buckler\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/\"},\"author\":{\"name\":\"Craig Buckler\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/715d986404b06691ab3014e06596908e\"},\"headline\":\"Como Depurar o C\u00f3digo no Node.js Usando M\u00faltiplas Ferramentas\",\"datePublished\":\"2022-03-17T08:58:45+00:00\",\"dateModified\":\"2023-08-22T07:39:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/\"},\"wordCount\":3583,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/03\/node-debug.jpg\",\"keywords\":[\"debugging\",\"webdev\"],\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/\",\"name\":\"Como Depurar o C\u00f3digo no Node.js Usando M\u00faltiplas Ferramentas\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/03\/node-debug.jpg\",\"datePublished\":\"2022-03-17T08:58:45+00:00\",\"dateModified\":\"2023-08-22T07:39:41+00:00\",\"description\":\"Este tutorial demonstra v\u00e1rias ferramentas para depurar os aplicativos Node e encontrar suas causas principais. Conhe\u00e7a e aprenda de perto.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/03\/node-debug.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/03\/node-debug.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Frameworks JavaScript\",\"item\":\"https:\/\/kinsta.com\/pt\/topicos\/frameworks-javascript\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Como Depurar o C\u00f3digo no Node.js Usando M\u00faltiplas Ferramentas\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/pt\/#website\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/715d986404b06691ab3014e06596908e\",\"name\":\"Craig Buckler\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g\",\"caption\":\"Craig Buckler\"},\"description\":\"Freelance UK web developer, writer, and speaker. Has been around a long time and rants about standards and performance.\",\"sameAs\":[\"https:\/\/craigbuckler.com\/\",\"https:\/\/www.linkedin.com\/in\/craigbuckler\",\"https:\/\/x.com\/craigbuckler\",\"https:\/\/www.youtube.com\/channel\/UCQwdl5oBTWGhifS6bRGADMQ\"],\"url\":\"https:\/\/kinsta.com\/pt\/blog\/author\/craigbuckler\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Como Depurar o C\u00f3digo no Node.js Usando M\u00faltiplas Ferramentas","description":"Este tutorial demonstra v\u00e1rias ferramentas para depurar os aplicativos Node e encontrar suas causas principais. Conhe\u00e7a e aprenda de perto.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/","og_locale":"pt_PT","og_type":"article","og_title":"Como Depurar o C\u00f3digo no Node.js Usando M\u00faltiplas Ferramentas","og_description":"Este tutorial demonstra v\u00e1rias ferramentas para depurar os aplicativos Node e encontrar suas causas principais. Conhe\u00e7a e aprenda de perto.","og_url":"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2022-03-17T08:58:45+00:00","article_modified_time":"2023-08-22T07:39:41+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/03\/node-debug.jpg","type":"image\/jpeg"}],"author":"Craig Buckler","twitter_card":"summary_large_image","twitter_description":"Este tutorial demonstra v\u00e1rias ferramentas para depurar os aplicativos Node e encontrar suas causas principais. Conhe\u00e7a e aprenda de perto.","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/03\/node-debug.jpg","twitter_creator":"@craigbuckler","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Craig Buckler","Tempo estimado de leitura":"18 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/"},"author":{"name":"Craig Buckler","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/715d986404b06691ab3014e06596908e"},"headline":"Como Depurar o C\u00f3digo no Node.js Usando M\u00faltiplas Ferramentas","datePublished":"2022-03-17T08:58:45+00:00","dateModified":"2023-08-22T07:39:41+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/"},"wordCount":3583,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/03\/node-debug.jpg","keywords":["debugging","webdev"],"inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/","url":"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/","name":"Como Depurar o C\u00f3digo no Node.js Usando M\u00faltiplas Ferramentas","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/03\/node-debug.jpg","datePublished":"2022-03-17T08:58:45+00:00","dateModified":"2023-08-22T07:39:41+00:00","description":"Este tutorial demonstra v\u00e1rias ferramentas para depurar os aplicativos Node e encontrar suas causas principais. Conhe\u00e7a e aprenda de perto.","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/03\/node-debug.jpg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/03\/node-debug.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/como-depurar-codigo-no-node-js\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Frameworks JavaScript","item":"https:\/\/kinsta.com\/pt\/topicos\/frameworks-javascript\/"},{"@type":"ListItem","position":3,"name":"Como Depurar o C\u00f3digo no Node.js Usando M\u00faltiplas Ferramentas"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/pt\/#website","url":"https:\/\/kinsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/715d986404b06691ab3014e06596908e","name":"Craig Buckler","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g","caption":"Craig Buckler"},"description":"Freelance UK web developer, writer, and speaker. Has been around a long time and rants about standards and performance.","sameAs":["https:\/\/craigbuckler.com\/","https:\/\/www.linkedin.com\/in\/craigbuckler","https:\/\/x.com\/craigbuckler","https:\/\/www.youtube.com\/channel\/UCQwdl5oBTWGhifS6bRGADMQ"],"url":"https:\/\/kinsta.com\/pt\/blog\/author\/craigbuckler\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/47708","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/users\/188"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=47708"}],"version-history":[{"count":11,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/47708\/revisions"}],"predecessor-version":[{"id":53488,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/47708\/revisions\/53488"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/47708\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/47708\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/47708\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/47708\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/47708\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/47708\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/47708\/translations\/nl"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/47708\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/47709"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=47708"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=47708"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=47708"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}