Alan Ferreira dos Santos
alanfsantos
Objetivo Geral
Objetivos Específicos
Avaliação
Nota Semestral
Exame
Quiz
https://qrgo.page.link/rE72B
Padrões Arquiteturais
MVC
REST
HTTP
GET
POST
PUT
DELETE
Respostas
RESTful
API
API
Node.js
História
Características
Flexibilidade
Leveza
Alta produtividade
Desvantagens
Aplicações
NPM
Yarn
npm install -g yarn
yarn
Instalando o Yarn
cd project/folder
yarn init
Inicializando o projeto
Visual Code Studio
{
"name": "nodeapi",
"version": "1.0.0",
"main": "app.js",
"license": "MIT",
"scripts": {
"start": "node app.js"
},
"dependencies": {
},
"devDependencies": {
}
}
Entendendo o package.json
echo "console.log('Minha aplicação Node.js')" > app.js
Criando o arquivo app.js
Rodando a aplicação
yarn start
Express
yarn add express
Adicionado o Express
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello World!');
})
app.listen(port, () => {
console.log(`Aplicação rodando em http://localhost:${port}`);
})
Criando sua primeira rota
Roteamento
var express = require('express');
var app = express();
app.METHOD(PATH, HANDLER)
Roteamento
var express = require('express');
var app = express();
app.get('/', function(req, res) {
res.send('Bem vindo!');
});
Roteamento
app.get('/', function(req, res) {
if (req.params.id) { // ... }
if (req.body.login) { // ... }
res.send('Bem vindo!');
});
Objetos req e res
Métodos de Respostas
express.Router
const express = require('express');
const router = express.Router();
router.get('/', function(req, res) {
res.json([]);
});
module.exports = router;
module.exports
const express = require('express');
const usuario = require('./routes/usuario');
const app = express();
app.use('/usuario', usuario);
body-parser
const express = require('express');
const bodyParser = require('body-parser');
const usuario = require('./routes/usuario');
const app = express();
app.use(bodyParser.json());
app.use('/usuario', usuario);
yarn add body-parser
body-parser
router.post('/', function(req, res) {
console.log(req.body);
res.json({});
});
nodemon
{
"name": "nodeapi",
...
"scripts": {
"start": "nodemon app.js"
}
}
yarn add nodemon
Insominia
Desafio
Criar uma aplicação Node.js, no formato de API, aplicando os padrões REST que possua rotas de forma estruturada para os seguintes recursos:
Usuário;
Nota;
Checklist;
Tag.
ECMAScript
ECMAScript
ECMAScript
const express = require('express');
const router = express.Router();
Desestruturação
const { Router } = require('express');
const router = Router();
const array = [1, 2, 3];
const firstElement = array[0];
console.log(firstElement); // 1
Desestruturação
const [elemento1, elemento2, elemento3] = [1, 2, 3];
console.log(elemento1, elemento2, elemento3); // 1, 2, 3
const body = {
nome: "Alan",
sobreNome: "Santos"
};
const nome = body.name;
const sobreNome = body.sobreNome;
console.log(nome, sobreNome); // Alan Santos
Desestruturação
const body = {
name: "Alan",
sobreNome: "Santos"
};
const { nome, sobreNome } = body;
console.log(nome, sobreNome); // Alan Santos
const getName = function (param1, param2) {
});
Arrow Functions
const getName = (param1, param2) => {
});
router.get('/', function(req, res) {
});
Arrow Functions
router.get('/', (req, res) => {
});
Promisses
Promisses
fetch(`http://swapi.co/api/people/${id}`)
.then(function(response) {
return response.json()
})
.then(function(person) {
console.log(person.name)
})
.catch(function(error) {
console.log(error)
});
Aninhamento
Async/Await
try {
const response = await fetch(`http://swapi.co/api/people/${id}`);
const person = await response.json();
console.log(person.name);
} catch (error) {
console.log(error);
}
Async/Await
fetch(`http://swapi.co/api/people/${id}`)
.then(response => response.json())
.then(person => {
console.log(person);
console.log(person.name);
})
.catch(error => console.log(error));
const { Router } = require('express');
const router = Router();
router.get('/', async (req, res) => {
try {
const response = await fetch(`http://swapi.co/api/people/${id}`);
const person = await response.json();
console.log(person.name);
res.send(person);
} catch (error) {
console.log(error);
res.send(error);
}
});
Async/Await
const getPerson = async () => {
try {
const response = await fetch(`http://swapi.co/api/people/${id}`);
const person = await response.json();
console.log(person.name);
return person;
} catch (error) {
console.log(error);
}
});
Async/Await
Aplicando os recursos do ECMA
Capacidade de Conexão
npm install pg pg-hstore
// ou
yarn add pg pg-hstore
Instalação do Driver
ORM
Sequelize
npm install sequelize
// ou
yarn add sequelize
Instalação
const { Sequelize } = require('sequelize');
const database = {};
const options = {
username: 'postgres',
password: 'postgres',
database: 'notas',
host: 'localhost',
dialect: 'postgres',
};
const sequelize = new Sequelize(options);
sequelize
.authenticate()
.then(() => console.log(`Conectado com sucesso ao banco ${options.database}`))
.catch((err) => console.log(`Falha ao conectar ao banco ${options.database}: ${err}`));
database.sequelize = sequelize;
database.Sequelize = Sequelize;
module.exports = database;
Conexão
Desafio
Desafio
Modelos
Modelo
module.exports = function(sequelize, DataTypes) {
const Usuario = sequelize.define(
'usuario',
{
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true
},
nome: {
type: DataTypes.STRING,
allowNull: false
},
email: {
type: DataTypes.STRING,
allowNull: false
},
senha: {
type: DataTypes.STRING,
allowNull: false
},
avatar: {
type: DataTypes.STRING,
allowNull: true
}
},
{
tableName: 'usuario',
timestamps: false
}
);
return Usuario;
};
Associações
[
{
"id": 1,
"titulo": "Teste",
"descricao": null,
"usuarioId": 1,
"usuario": {
"id": 1,
"nome": "Alan",
"email": "alansantos@grupointegrado.br"
}
}
]
Dado Associado
[
{
"id": 1,
"nome": "Alan",
"email": "alansantos@grupointegrado.br",
"notas": [
{
"id": 1
},
{
"id": 2
}
]
}
]
Dado Associado
HasMany
module.exports = function(sequelize, DataTypes) {
const Usuario = sequelize.define(
'usuario',
{
// ...
},
{
tableName: 'usuario',
timestamps: false
}
);
Usuario.associate = function(models) {
this.hasMany(models.Nota, { foreignKey: 'usuarioId' });
}
return Usuario;
};
BelongsTo
module.exports = function(sequelize, DataTypes) {
const Nota = sequelize.define(
'nota',
{
// ...
},
{
tableName: 'nota',
timestamps: false
}
);
Nota.associate = function(models) {
this.belongsTo(models.Usuario, {
foreignKey: 'usuarioId'
});
}
return Nota;
};
Carregando os Modelos
const { Sequelize, DataTypes } = require('sequelize');
const _Usuario = require('./usuario');
const _Nota = require('./nota');
const database = {};
// ...
let Usuario = _Usuario(sequelize, DataTypes);
let Nota = _Nota(sequelize, DataTypes);
database['Usuario'] = Usuario;
database['Nota'] = Nota;
for (const key in database) {
if (database[key].associate) database[key].associate(database);
}
// ...
module.exports = database;
await Usuario.create({
nome: "Alan",
email: "alansantos@grupointegrado.br"
});
let user = await Usuario.findOrCreate({
defaults: {
nome: "Alan",
email: "alansantos@grupointegrado.br"
},
where: {
email: "alansantos@grupointegrado.br"
}
});
console.log(user.isNewRecord);
Create
await Usuario.update({
nome: "Alan",
email: "alansantos@grupointegrado.br"
}, {
where: {
id
}
});
Update
await Usuario.destroy({
where: {
id
}
});
Destroy
await Usuario.findAll();
await Usuario.findAll({
where: {
id
}
});
await Usuario.findAll({
attributes: ['id', 'nome', 'email', 'avatar'],
where: {
id
}
});
Consultas
await Nota.findAll({
where: {
id
},
include: [
{
model: Usuario
}
]
});
Consultas Associativas
const { Nota, Checklist, sequelize } = require('../models');
const transaction = await sequelize.transaction();
try {
await Nota.create(nota, {
transaction
});
await Checklist.create(checklist, {
transaction
});
await transaction.commit();
} catch (error) {
await transaction.rollback();
}
Transações
Desafio