Curso Rocketseat
Estou anotando, versionando e compartilhando aqui no Github a fim de aprender mais explicando ele. Estarei atualizando até finalizar.
Criar Pasta do projeto
cria um package, o -y criar as informações com o que tem, default.
yarn init -ymicro framework e mais utilizados
yarn add expresscriar pasta src
criar dentro da pasta src/ o arquivo server.ts
com -D a dependencia vai ficar apenas em desenvolvimento.
yarn add @types/express -Dadd no arquivo
server.ts: app.Listen(porta, () => mensagem)para o node identificar o arquivo server.ts ao rodar o servidor criado.
yarn add typescript -Dinicializa o typescript na aplicação
yarn tsc --initalterar arquivo tsconfig.json,
strict = false.converte o arquivo em tempo de execução.
yarn add ts-node-dev -Dpackage.json - criar linha:
scripts {
"dev": "ts-node-dev src/server.ts"
}package.json - adicionar no scripts
dev: "--trasnspile-only --ignore-watch node_modules"server.ts {
// app.get("/users", (request, response) => {
// return response.send("Hello world - NLW#04")
// }); Antigo
app.get("/", (request, response) => {
return response.json({ message: "Hello world - NLW#04"});
}); Novo
app.post("/", (request, response) => {
return response.json({message: "Os dados foram salvos com sucesso!"});
});
}Install Insomnia: Site Insomnia
Configurando com TypeORM
Adicionar ao projeto TypeORM e a dependencia reflect-metadata
yarn add typeorm reflect-metadataAdicionar o sqlite como DB por ser fácil de utilizar sem grandes configurações.
yarn add sqlite3criar arquivo ormconfig.json
{
"type": "sqlite",
"database": "./src/database/database.sqlite"
}criar dentro de src um diretório database com o arquivo index.ts
add no arquivo index.ts
{
import { createConnection } from "typeorm";
createConnection();
}add no arquivo server.ts
import "reflect-metadata"
import "./database"obs.: reflect-metadata torna-se o primeiro import do arquivo.
add no arquivo package.json em scripts
"typeorm": "ts-node-dev node_modules/typeorm/cli.js"criar diretório .src/database/migrateions/
add no arquivo ormconfig.json
"cli": {
"migrationsDir": "./src/database/migrations"
}o caminha para direcionar as migrations criadas.
Criando a primeira migration Users
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createTable (
new Table({
name: "users",
columns: [
{
name: "id",
type: "uuid",
isPrimary: true
},
...
],
})
);
}add em ormconfig.json o caminho para salvar os arquivos criados pela migration:rum
{
"migrations": ["./src/database/migrations/**.ts"],
}Criar os dados no DB Sqlite
yarn typeorm migration:runDesfazendo a última migration
yarn typeorm migration:revertCriar diretório ./src/controllers com o arquivo UserController.ts
add no arquivo UserController.ts
import {Request, Response} from "express";
class UserController {
async create(request: Request, response: Response) {
const body = request.body;
console.log(body);
return response.send();
}
}
export { UserController }Criar o arquivo ./src/routes.ts
add no arquivo routes.ts
import { Router } from "express";
import { UserController } from "./controllers/UserController";
const router = Router();
const userController = new UserController();
router.post("/users", userController.create);
export { router };Deletar no arquivos server.ts o post e get
Incluir no arquivo server.ts chamadas as rotas para o controller e a opção de receber Json
app.use(express.json());
app.use(router);Criar o arquivo ./src/models e o arquivo models/User.ts
add no arquivo User.ts
import { Entity } from "typeorm";
@Entity("users")
class User{
}
export { User }No arquivo tsconfig.json, habilite a opção Experimental Options e stricPropertyInitialization, para o stric deixe ele com false
Alterar o arquivo User.ts incluindo os atributos na classe
@Entity("users")
class User{
@PrimaryColumn()
id: string;
@Column()
name: string;
@Column()
email: string;
@CreateDateColumn()
created_at: Date;
}Adicionar a biblioteca uuid e sua dependência
yarn add uuidyarn add @types/uuid -DImportar para o arquivo User.ts a biblioteca uuid
import { v4 as uuid } from "uuid";Adicionar no arquivo User.ts readonly para o id do user
@PrimaryColumn()
readonly id: string;Criar no arquivo User.ts um construtor para tornar o id único usnado a biblioteca uuid
constructor() {
if(!this.id) {
this.id = uuid();
}
}Incluir no arquivo ormconfig.json o entities informando a rota do models
"entities": ["./src/models/**.ts"],Altualizando o arquivo UserController.ts com create user
const user = userRepository.create({
name,
email,
});Altualizando o arquivo UserController.ts com save user
await userRepository.save(user);Altualizando o arquivo UserController.ts com autenticação
//SELECT * FROM USERS WHERE EMAIL = "EMAIL"
const userAlreadyExists = await userRepository.findOne({
email,
});
if (userAlreadyExists) {
return response.status(400).json({
error: "User already exists!",
});
}Adicionando para o ambiente de desenvolvimento no arquivo ormconfig.json a opção logging
"logging": true,