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 -y
micro framework e mais utilizados
yarn add express
criar pasta src
criar dentro da pasta src/ o arquivo server.ts
com -D a dependencia vai ficar apenas em desenvolvimento.
yarn add @types/express -D
add no arquivo
server.ts: app.Listen(porta, () => mensagem)
para o node identificar o arquivo server.ts ao rodar o servidor criado.
yarn add typescript -D
inicializa o typescript na aplicação
yarn tsc --init
alterar arquivo tsconfig.json,
strict = false.
converte o arquivo em tempo de execução.
yarn add ts-node-dev -D
package.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-metadata
Adicionar o sqlite como DB por ser fácil de utilizar sem grandes configurações.
yarn add sqlite3
criar 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:run
Desfazendo a última migration
yarn typeorm migration:revert
Criar 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 uuid
yarn add @types/uuid -D
Importar 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,