- Criar um diretório
mkdir <nome-do-diretório> && cd <nome-do-diretório>
- Iniciar a aplicação
npm init -y
- Instalar o TypeScipt
npm install -D typescript
- Instalar o
@types/node
npm install -D @types/node
- Instalar o
ts-node-dev
npm install -D ts-node-dev
- Atalho
npm install -D typescript @types/node ts-node-dev
- Criar o
.tsconfig
npx tsc --init
- Garantir as seguintes configurações
{
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"rootDir": "./src",
"outDir": "./dist",
"esModuleInterop": true,
"strict": true
}
}
- Instalar o express
npm install express
- Instalar o
@types/express
npm install -D @types/express
- Instale a biblioteca
express-async-errors
Essa biblioteca ajuda com tratamento de erros sem precisar usar try/catch
npm install express-async-errors
Importe a biblioteca logo após a importação do express;
- Instalar a biblioteca
http-status-codes
❗️ Opcional ❗️
npm install http-status-codes
- Crie os arquivos
index.ts
eapp.ts
dentro do diretóriosrc
touch src/index.ts src/app.ts
- Você pode usar os templates abaixo nos seus arquivos ❗️ Opcional ❗️
// src/index.ts
import app from './app';
const PORT = 8000;
app.listen(PORT, () => {
console.log(`Server is running at http://localhost:${PORT}`);
});
// src/app.ts
import express from 'express';
import 'express-async-errors';
import { StatusCodes } from 'http-status-codes';
const app = express();
app.use(express.json());
app.get('/', (req, res) => {
res.status(StatusCodes.OK).send('Express + TypeScript')
});
export default app;
- Crie scripts no arquivo
package.json
...
"scripts": {
"start": "npm run build && node ./dist/index.js",
"dev": "tsnd index.ts",
"build": "tsc"
},
...
start
: executa obuild
da aplicação e depois roda o arquivo compilado dentro da pastadist
;dev
: executa a aplicação em modo de desenvolvimento utilizando ots-node-dev
;build
: executa a compilação do projeto utilizando oTSC
.
- Execute a aplicação
npm start
- Incluindo tipos no app.ts
// src/app.ts
import express, { Request, Response } from 'express';
import 'express-async-errors';
import { StatusCodes } from 'http-status-codes';
const app = express();
app.use(express.json());
app.get('/', (req: Request, res: Response) => {
res.status(StatusCodes.OK).send('Express + TypeScript')
});
export default app;
- Incluindo um middleware de erro
// src/app.ts
import express, { Request, Response, ErrorRequestHandler } from 'express';
// import 'express-async-errors';
// import { StatusCodes } from 'http-status-codes';
//
// const app = express();
//
// app.use(express.json());
//
// app.get('/', (req: Request, res: Response) => {
// res.status(StatusCodes.OK).send('Express + TypeScript')
// });
const erroMiddleware: ErrorRequestHandler = (err, req, res, next) => {
const { name, message, details } = err;
console.log(`name: ${name}`);
switch (name) {
case 'ValidationError':
res.status(400).json({ message: details[0].message });
break;
case 'NotFoundError':
res.status(404).json({ message });
break;
case 'ConflictError':
res.status(409).json({ message });
break;
default:
console.error(err);
res.sendStatus(500);
}
next();
};
app.use(erroMiddleware);
// export default app;
- Instale as bibliotecas
restify-errors
e@types/restify-errors
❗️ Opcional ❗️
Essas bibliotecas ajudam com disparos de erros específicos
npm install restify-errors @types/restify-errors
Melhoraria o error handling, não tipando pra any e já desestruturando, mas fazendo um narrowing garantindo o type safety do código: