3
respostas

[Bug] Erro no petRouter/Aplicação não roda

Segui o passo a passo do curso, mas no momento em que fui realizar o POST no arquivo petRouter.ts ele me informou este erro Insira aqui a descrição dessa imagem para ajudar na acessibilidadeMinha classe PetController.ts

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Após ler outras dúvidas no forum, encontrei que este problema pode ser resolvido alterando o codigo do petRouter.ts e deixando ele desta forma

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Mas após realizar esta alteração fui tentar rodar a aplicação, e com isso me retornou este erro no terminal Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Alguém sabe como resolver?

3 respostas

Olá Davi. Tudo bem?

Parece que o problema está relacionado à forma como o método criaPet está sendo passado para o router.post. O erro indica que a função não está sendo reconhecida corretamente como um middleware do Express.

Aqui está uma sugestão para corrigir o problema:

  1. Corrija o nome da classe: Na sua classe PetController, o nome está escrito como PetContAroller. Corrija para PetController.

  2. Bind no método: Ao passar o método criaPet diretamente, ele pode perder o contexto da classe. Você pode corrigir isso usando uma função de seta ou o método bind.

No arquivo petRouter.ts, altere a linha:

```
router.post("/", (req, res) => petController.criaPet(req, res));
```

Ou, se preferir, faça o bind no construtor da classe PetController:

```
export default class PetController {
  constructor() {
    this.criaPet = this.criaPet.bind(this);
  }

  criaPet(req: Request, res: Response) {
    const novoPet = req.body;
    listaDePets.push(novoPet);
    return res.status(201).json(novoPet);
  }
}
```

Essas alterações devem ajudar a garantir que o método criaPet mantenha o contexto correto da instância da classe PetController.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Realizei a alteração da classe PetControler que estava com o nome errado, e ja inseri o construtor como você falou, ficou asim: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

E também alterei a classe petRouter, da forma como foi mostrada no video: Persiste o erro Insira aqui a descrição dessa imagem para ajudar na acessibilidadeDa forma como estava antes: Insira aqui a descrição dessa imagem para ajudar na acessibilidadeDe outra forma fechando a arrow function Insira aqui a descrição dessa imagem para ajudar na acessibilidadeO erro ainda persiste

Olá, Davi.

O erro ERR_UNSUPPORTED_DIR_IMPORT indica que o Node.js não está conseguindo resolver os módulos corretamente. Isso geralmente acontece por causa de incompatibilidades de configuração no uso de ES Modules ou caminhos inválidos.

Aqui está como corrigir o problema:

1. Verifique se o type no package.json está configurado como module: Verifique o arquivo package.json e adicione ou ajuste a propriedade type para module. Isso permite que o Node trate os arquivos como módulos ES.


{
  "type": "module",
  "scripts": {
    "start": "node ./build/src/app.js"
  }
}

2. Ajuste as extensões nos imports: Com ES Modules, as extensões precisam ser explícitas. Então, no arquivo petRouter.ts, ajuste os imports para:


import express from "express";
import PetController from "../controller/PetController.js";

Note o uso de .js no caminho do import. Isso é necessário mesmo se o código-fonte estiver em TypeScript, porque é o arquivo gerado no build que o Node irá usar.

3. Garanta que o tsconfig.json está corretamente configurado: O TypeScript precisa estar gerando arquivos compatíveis com ES Modules:


{
  "compilerOptions": {
    "module": "ESNext",
    "moduleResolution": "node",
    "target": "ES2020",
    "outDir": "./build",
    "esModuleInterop": true,
    "strict": true
  }
}

Depois de fazer isso, apague a pasta build, recompile o código com tsc e tente rodar novamente.

4. Use caminhos relativos consistentes: No arquivo petRouter.ts, o trecho do código ficará assim:


import express from "express";
import PetController from "../controller/PetController.js";

const router = express.Router();

const petController = new PetController();

router.post("/", (req, res) => {
  petController.criaPet(req, res);
});

export default router;

5. Execute novamente sua aplicação: Após realizar todas as alterações, rode o TypeScript com:


tsc

E depois:


node ./build/src/app.js

Fico à disposição. Abraços e bons estudos!