/node-ex-ts-startup-example

Startup de projeto node express backend com typescript

Primary LanguageTypeScript

node-ex-ts-startup-example

Como iniciar um projeto nodejs backend com express, mongodb e typescript configurado, bem resumido. Você pode seguir o passo a passo abaixo ou clonar este projeto.

My Skills

  1. Inicie o projeto
npm init -y
  1. Insira o conteúdo a seguir no package.json
{
  "name": "exemplo",
  "private": true,
  "version": "1.0.0",
  "description": "exemplo",
  "main": "src/index.ts",
  "scripts": {
    "build": "rimraf ./build && tsc",
    "start": "node build/index.js",
    "dev": "ts-node-dev src/index.ts"
  },
  "dependencies": {
    "cors": "^2.8.5",
    "express": "^4.19.2",
    "mongodb": "^6.10.0"
  },
  "devDependencies": {
    "@types/cors": "^2.8.17",
    "@types/express": "^4.17.21",
    "@types/node": "^22.9.0",
    "dotenv": "^16.4.5",
    "ts-node-dev": "^2.0.0",
    "typescript": "^5.6.3"
  }
}
  1. Inicie a configuração do typescript
npx tsc --init
  1. Insira o conteúdo abaixo no tsconfig.json
{
  "compilerOptions": {
    "target": "es2016",
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "module": "commonjs",
    "moduleResolution": "node10",
    "allowJs": true,
    "outDir": "./build",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true
  },
  "include": [
    "src"
  ]
}
  1. Instale as dependências
npm i
  1. Crie um arquivo com nome ".env" na raíz do projeto e preencha-o com suas variáveis de ambiente:
BACKENDPORT=5001
MONGODB_CONNSTRING=
MONGODB_DB_NAME=teste_db
  1. Crie a pasta ./src na raíz do projeto

  2. Crie o arquivo index.ts dentro de src, use o conteúdo abaixo como base:

import { MongoClient, Db } from "mongodb";
import express from 'express';
import cors from "cors";
import { configDotenv } from 'dotenv';
import { createRoutes } from './routes';

configDotenv();

const client = new MongoClient(process.env.MONGODB_CONNSTRING!);
let db: Db;

async function connectMongo() {
  try {
    await client.connect();
    db = client.db(process.env.MONGODB_DB_NAME);
    console.log("Conectado ao MongoDB");

    const server = express();
    server.use(cors());
    server.use(express.json());
    server.use(createRoutes(db));

    server.listen(process.env.BACKENDPORT, () => {
      console.log(`Backend rodando em: http://127.0.0.1:${process.env.BACKENDPORT}/`);
    });
  } catch (error) {
    console.error("Erro ao conectar ao MongoDB:", error);
  }
}

connectMongo();
  1. Crie o arquivo routes.ts dentro de src, use o conteúdo abaixo como base:
import { Router } from "express";
import { Db } from "mongodb";
import { SeuService } from "./services/SeuService";
import { SeuController } from "./controllers/SeuController";

export function createRoutes(db: Db) {
  const router = Router();

  const seuService = new SeuService(db);
  const seuController = new SeuController(seuService);
  router.get('/', seuController.healthcheck);

  return router;
}
  1. Crie o arquivo .gitignore na raíz do seu projeto, use o conteúdo abaixo como base:
node_modules/
.env
build/
  1. Crie os diretórios ./services/ e ./controllers/ dentro de src

  2. Crie SeuService.ts em ./services/ com o conteúdo abaixo como base:

import { Db } from "mongodb";

export class SeuService { // crie a interface ISeuService e implemente-a
  constructor(private db: Db) { }

  healthcheck(): string {
    return "hello world"
  }
}
  1. Crie SeuController em ./controllers/ com o conteúdo abaixo como base:
import { Request, Response } from 'express';
import { SeuService } from '../services/SeuService';

export class SeuController {
  constructor(private seuService: SeuService) { } // dependa da sua interface, não da implementação

  healthcheck = (req: Request, res: Response) => {
    const result = this.seuService.healthcheck();
    return res.status(200).json({ message: result });
  };
}

Acho que é isso

  • Rodar a api
npm run dev
  • Buildar a api
npm run build
  • Rodar a versão buildada da api
npm run start

@samubarreto