Texto de: Marlliton Souza
Introdução
O processo de debugging é essencial para o desenvolvimento de software, pois permite identificar e corrigir erros no código. Muitas vezes, usamos o console.log
que cumpre seu propósito, porém, em projetos maiores, essa abordagem pode ser muito ineficiente.
Utilizar um debugger para analisar fluxos e encontrar erros ou valores inesperados é muito mais produtivo e neste artigo, veremos como configurar o VS Code para debugar código TypeScript no contexto do Node.js.
Criando um projeto
Para este exemplo, criaremos um projeto bem simples, já que o foco aqui não é o código e sim a configuração do debug para podermos analisar fluxos e encontrar problemas. Você pode seguir as instruções abaixo para confiugrar o projeto:
- Crie uma pasta debug para o projeto e abra-a no VSCode.
- Inicie o projeto com os seguintes comandos:
npm init -y
npm install --save-dev typescript
npx tsc --init
- Crie uma pasta src para colocar o código. No final, sua estrutura deve ser semelhante a esta:
![](https://blog.formacao.dev/content/images/2024/07/1.jpg)
Executando código
Crie um arquivo dentro da pasta src chamado index.ts e em seguida adicione o seguinte código nele:
type User = {
name: string;
age: number;
isAdmin: boolean;
};
function greet(user: User): string {
if (user.isAdmin) {
return `Hello, Admin ${user.name}`;
} else {
return `Hello, ${user.name}`;
}
}
const user: User = {
name: 'Alice',
age: 30,
isAdmin: false
};
const msg = greet(user)
Nós podemos tentar executar esse código com o nodejs via terminal (node ./src/index.ts), o que não dará certo, pois o node não entende a sintaxe do TypeScript.
![](https://blog.formacao.dev/content/images/2024/07/2.jpg)
Então, para facilitar a execução do código, podemos usar uma biblioteca ao invés de usar o node. Para isso, execute o seguinte comando no terminal:
npx tsx src/index.ts
O problema
Imagine que você espera que o usuário receba a mensagem Hello, Admin ${user.name}
, mas por algum motivo ele está recebendo Hello, ${user.name}
.
Neste exemplo, nós já sabemos onde está o problema só de olhar o código, mas em projetos maiores, não é isso que acontece. Pensando que o problema não seja tão óbvio, podemos pensar em colocar um console.log na função greet
para vermos se o que está sendo recebido por ela é realmente o que a gente espera.
type User = {
name: string;
age: number;
isAdmin: boolean;
};
function greet(user: User): string {
if (user.isAdmin) {
console.log("É admin")
return `Hello, Admin ${user.name}`;
} else {
console.log("Não é admin")
return `Hello, ${user.name}`;
}
}
const user: User = {
name: 'Alice',
age: 30,
isAdmin: false
};
const msg = greet(user)
console.log("Mensagem::", msg)
Neste exemplo, já conseguimos identificar o problema, mas caso isso não acontecesse, iriamos para um nível superior no código colocar mais um console.log, e depois para o nível superior de novo e de novo até encontramos o problema. Isso é chato e repetitivo, além de nada produtivo, apesar de funcional.
Configurando o debugger
A configuração do debugger no VSCode é simples. Abra o menu lateral de debugging pressionando Ctrl + Shift + D
ou clicando no ícone de inseto na barra lateral esquerda e depois em create a launch.json file.
![](https://blog.formacao.dev/content/images/2024/07/4.jpg)
Em seguida selecione Node.js:
![](https://blog.formacao.dev/content/images/2024/07/5.jpg)
Nesse momento, um arquivo será criado automaticamente pelo Visual Studio Code em seu projeto e será armazenado em .vscode/launch.json
.
Dentro dele, terá uma configuração inicial bem simples:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}/src/index.ts",
"outFiles": [
"${workspaceFolder}/**/*.js"
]
}
]
}
Vamos adicionar algumas opções para ser possível executar o debugger corretamente:
![](https://blog.formacao.dev/content/images/2024/07/6.jpg)
Rodando o código com o debug
Agora, podemos adicionar um ou mais break points no nosso código clicando ao lado dos números das linhas. Esses break points são pontos onde o nosso código será "pausado" para podermos analisar melhor o que está acontecendo.
![](https://blog.formacao.dev/content/images/2024/07/7.jpg)
Após definir os break points, podemos executar o código utilizando o debugger. Para isso, pressione F5 no seu teclado, ou clique em run > start debugging:
![](https://blog.formacao.dev/content/images/2024/07/8.jpg)
O código será executado com o debugger e parará nos pontos predeterminados. Com isso, você pode verificar os valores das variáveis, retornos de funções, parâmetros, etc.
![](https://blog.formacao.dev/content/images/2024/07/9.jpg)
Perceba que o código parou a execução na linha 3 e já me mostra todos os valores do objeto "user". Nós também podemos verificar o retorno da função, basta clicar na segunda opção (step over) do menu que aparece no canto superior direito do print. No seu VS Code provavelmente esse menu estará centralizado.
![](https://blog.formacao.dev/content/images/2024/07/10.jpg)
Outra possibilidade é ficar observando valores de variáveis, como, por exemplo, a variável msg. Nese caso podemos adicionar essa variável na seção WATCH do menu debug e veremos que o retorno é “Hello, Alice”:
![](https://blog.formacao.dev/content/images/2024/07/11.jpg)
Conclusão
Com essa técnica de debugging, você é capaz de debugar um fluxo inteiro, ganhando muito mais agilidade e precisão na hora de debugar seu código. Também é possível debugar o código no navegador. Hoje, nosso propósito foi debugar aplicativos no contexto do Node.js, mas você pode conferir aqui se tiver interesse.