- 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-errorsImporte 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.tseapp.tsdentro 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 obuildda 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-errorse@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: