Usando Sequelize ORM com Node e Express \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 16 Horas 

 34 Min 

 06 Seg 

   Tempo restante da oferta: 16 34 06 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Usando Sequelize ORM com Node e Express  [ Javascript ](https://www.treinaweb.com.br/blog/categoria/javascript) [ Node ](https://www.treinaweb.com.br/blog/categoria/node-js) 

# Usando Sequelize ORM com Node e Express

 Vamos aprender a configurar uma aplicação com banco de dados MySQL usando Sequelize ORM com Node.js e Express.

 [ Wesley Gado ](https://www.treinaweb.com.br/blog/autor/wesley-gado) 5 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/06/NODE-SQUELIZE-MYSQL.png)  

Nós utilizamos um ORM devido a diferença de paradigmas de um banco de dados relacional e da orientação a objetos. Neste caso o Framework ou biblioteca utilizados faz a conciliação e o mapeamento dos dois modelos quase que eliminando a necessidade de ter que utilizar alguma query com código SQL.

Você pode acessar nosso artigo [“O que é ORM?](https://www.treinaweb.com.br/blog/o-que-e-orm)” aqui da TreinaWeb para se aprofundar no assunto.

Agora vamos aprender a utilizar Sequelize ORM, um dos mais conhecidos se tratando de Node.js, criando uma aplicação para realizar a comunicação com o banco de dados e também manipular os registros. Você pode acessar os arquivos [neste repositório do GitHub](https://github.com/wesleygado/artigo_sequelize "neste repositório do GitHub").

 [ ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/10/E-BOOK-GRATUITO-COMECANDO-JS.png) ](https://www.treinaweb.com.br/ebook/guia-javascript)

## Configurando ambiente Node.js e Express

Caso você não tenha conhecimento com Node.js e Express, aconselho seguir os artigos abaixo para instalar o Node.js e configurar o ambiente que vamos utilizar neste artigo:

- [Instalação do Node.js - Windows, Mac e Linux](https://www.treinaweb.com.br/blog/instalacao-do-node-js-windows-mac-e-linux "Instalação do Node.js - Windows, Mac e Linux");
- [Instalando e criando um servidor com Express](https://www.treinaweb.com.br/blog/criando-um-servidor-http-com-express/ "Instalando e criando um servidor com Express");
- [Criando rotas com Express](https://www.treinaweb.com.br/blog/criando-rotas-com-express-js "Criando rotas com Express").

Estes artigos possuem a base do que precisamos para seguir em frente, portanto, vamos efetivamente instalar o Sequelize ORM e entender o seu funcionamento.

Importante lembrar que vamos utilizar EcmaScript2015, portanto é necessário adicionar a configuração `"type": "module"` no arquivo `package.json`.

## Instalando o MySQL e criando o Banco de Dados

[  ![MySQL - Desenvolvedor](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/mysql.svg)   Curso MySQL - Desenvolvedor Conhecer o curso ](https://www.treinaweb.com.br/curso/mysql-desenvolvedor)

Neste artigo vamos utilizar o MySQL, para acessar o MySQL normalmente utilizamos clientes gráficos, portanto, eu particularmente indico o download o MySQL Workbench community, que você pode [efetuar o download gratuitamente](https://dev.mysql.com/downloads/windows/installer/8.0.html "efetuar o download gratuitamente").

Após o download, basta abrir o executável. Logo no início irá surgir a tela de termos uso, aceite e continue a instalação, até aparecer a seguinte informação:

![Opções de instalação MySql](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/07/mysql.jpg)

Neste momento temos algumas opções de instalação. A opção custom, onde você escolhe item a item das aplicações que serão instaladas, e conforme a imagem acima em destaque temos a opção de desenvolvedor, onde será instalado o MySQL server e o cliente MySQL Workbench, vamos selecionar esta opção e seguir com a instalação.

Agora basta seguir avançando a instalação, configurar o usuário e senha quando for solicitado (lembrando que neste artigo estamos instalando o MySQL em nossa máquina para desenvolvimento, onde não será necessário configurações especificas). No final, você verá a aplicação do MySQL Workbench instalada com sucesso, será exibido algo similar ao print abaixo:

![MySQL Workbench](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/06/sql-1024x772.png)

Neste momento precisamos criar o banco de dados. Para isto, clique em “LocalInstance MySQL”, logo em seguida no ícone acima “create a new schema”, dê um nome ao banco de dados e clique em apply, conforme imagem abaixo:

![Criando novo banco de dados](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/07/novo-bd.png)

Feito isso o banco de dados estará criado.

## Criando aplicação e instalando o Sequelize

Vamos iniciar uma aplicação com o comando `npm init`, criar os arquivos server.js e routes.js, efetuar a instalação do Express com o comando `npm install express`, desta forma teremos a seguinte estrutura de arquivos:

![Estrutura aplicação](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/06/estruturas.png)

Onde o arquivo routes.js será o arquivo responsável pelas rotas do nosso projeto:

```jsx
import express from "express";

const routes = express.Router();

routes.get("/", (req, res) => {
  return res.json({ name: "Ciclano Fulano" });
});

export { routes as default };

```

E o arquivo server.js responsável pelo servidor criado pelo Express:

```jsx
import express from "express";
import routes from "./routes.js";

const app = express();

app.use(express.json());
app.use(routes);

app.listen(3000, () => console.log("Servidor iniciado na porta 3000"));

```

Agora precisamos instalar o Sequelize e o driver do MySQL, o banco que vamos utilizar nesse artigo, para isto, basta executar o seguinte comando: `npm install sequelize mysql2`.

Obs.: instalamos a dependência mysql2, pois ela possui melhor performance e suporte a recursos mais atuais do JavaScript como promises.

[  ![Npm - Gerenciador de pacotes para JavaScript](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/npm.svg)   Curso Npm - Gerenciador de pacotes para JavaScript Conhecer o curso ](https://www.treinaweb.com.br/curso/npm-gerenciador-de-pacotes-para-javascript)

## Configurando variáveis de ambiente

Em seguida precisamos criar o arquivo de configuração do banco de dados, para isso vamos criar um arquivo .env, onde ficarão as variáveis de ambiente da aplicação, como as de acesso ao banco de dados que serão diferentes em produção. Para isto vamos instalar o pacote dotenv, com o comando `npm install dotenv`. Logo em seguida criaremos o arquivo .env na raiz da nossa aplicação com os dados do nosso banco de dados:

```jsx
DB_NAME=sequelizenode
DB_USER=root
DB_PASSWORD=00000000
DB_HOST=localhost

```

## Configurar a conexão do Sequelize com o Banco de Dados

Após setar as informações de nosso banco de dados, vamos criar o arquivo db.js dentro de uma pasta `src`, e nela precisamos passar para o sequelize os dados já configurados no arquivo .env da seguinte forma:

```jsx
import { Sequelize } from "sequelize"; // importar o sequelize
import dotenv from "dotenv/config.js"; // importar o dotenv para localizar as variáveis de ambiente

const dbName = process.env.DB_NAME; // passar os dados do .env para as constantes
const dbUser = process.env.DB_USER;
const dbHost = process.env.DB_HOST;
const dbPassword = process.env.DB_PASSWORD;

const sequelize = new Sequelize(dbName, dbUser, dbPassword, {
  //passar os dados para o sequelize
  dialect: "mysql", //informar o tipo de banco que vamos utilizar
  host: dbHost, //o host, neste caso estamos com um banco local
});

export default sequelize; //exportar

```

Perfeito, nossa conexão com o banco de dados está configurada, agora precisamos passar para o nosso server.js conectar ao banco no momento de subir o servidor, da seguinte forma:

```jsx
import express from "express";
import routes from "./routes.js";
import db from "./src/db.js";

const app = express();

app.use(express.json());
app.use(routes);

db.sync(() => console.log(`Banco de dados conectado: ${process.env.DB_NAME}`));

app.listen(3000, () => console.log("Servidor iniciado na porta 3000"));

```

Importamos as configurações do db.js, em seguida executamos a função `db.sync()`.

Ao executar o comando `node server.js` teremos nosso servidor e a conexão com o banco efetuados com sucesso:

![Aplicação rodando com sucesso](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/06/retorno-ok.png)

[  ![Node.js - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/node-js.svg)   Curso Node.js - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/nodejs-fundamentos)

## Configurando Model de uma tabela de acordo com o Sequelize

Perfeito, agora precisamos configurar o Model da nossa primeira tabela do banco, para isso vamos criar a pasta `models` dentro da pasta `src`, e criar o arquivo clientsModel.js logo em seguida:

```jsx
import { Sequelize } from "sequelize";
import db from "../db.js";

export default db.define("client", {
  id: {
    type: Sequelize.INTEGER.UNSIGNED,
    primaryKey: true,
    autoIncrement: true,
    allowNull: false,
  },
  nome: {
    type: Sequelize.STRING,
    allowNull: false,
  },
  email: {
    type: Sequelize.STRING,
    allowNull: false,
    unique: true,
  },
});

```

Neste exemplo vamos criar uma tabela simples de clientes, com id, nome e email. Precisamos importar o sequelize, repare que importamos a classe Sequelize (maiúsculo) dentro de { }, e também a conexão do banco que configuramos em nosso arquivo db.js.

Agora vamos definir a tabela “client”, vale ressaltar que neste momento colocamos a tabela no singular, o próprio Sequelize irá pluralizar ao criar a tabela no banco. Aqui, ao invés de utilizarmos uma query o ORM nos permite passar os atributos das tabelas de uma forma simples e intuitiva. Como podemos ver, ao criar o campo ID por exemplo, passamos um “type”, dizendo que ele é inteiro e positivo, setamos como chave primária, que o valor é autoincremental e, para finalizar, que não pode ser vazio. Desta forma podemos usar uma série de características para os campos de nossa tabela, você pode verificar as possibilidades na [documentação do Sequelize](https://sequelize.org/master/manual/model-basics.html).

## Configurando Controllers

Feito isso precisamos criar o nosso Controller. Para isto, vamos criar uma pasta `controllers` dentro de `src` e o arquivo clients.js dentro da pasta `controller`, neste arquivo vamos configurar as funções que serão invocadas em cada requisição referente às interações com o banco, neste primeiro momento podemos criar uma função para exibir todos os clientes em nosso banco, desta forma:

```jsx
import ClientRepository from "../models/clientsModel.js";

async function findAll(req, res) {
  const clients = await ClientRepository.findAll();
  res.json(clients);
}

export default { findAll };

```

Vamos importar o Model como ClientRepository, logo em seguida, criar a função findAll. Criar a constante clients, que será cada cliente de nosso banco, utilizando a função findAll do ClientRepository (uma das funções do Sequelize), e por fim, responder o json referente aos clientes cadastrados.

Agora precisamos passar essa função em nosso arquivo routes.js. para isso vamos importar o controller clients.js e criar a rota `/clients`, da seguinte maneira:

```jsx
import express from "express";
import clients from "./src/controllers/clients.js";

const routes = express.Router();

routes.get("/clients", clients.findAll);

export { routes as default };

```

Veja que passamos a função `clients.findAll`, como parâmetro para nossa rota. Agora podemos executar nossa aplicação e subir nosso servidor.

![Conexão com banco da dados](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/06/conexaobd.png)

Perceba que, caso a tabela clients não exista, ele irá criar uma nova, logo em seguida, exibir a mensagem de conexão com o banco e que o servidor foi iniciado na porta 3000. Ao entrar na rota `/clients`, teremos o seguinte resultado:

`[]`

## Criando “CRUD” e testando rotas

Obtivemos `[]` como retorno pois nossa tabela está vazia. Portanto vamos criar um pequeno CRUD (Create, Read, Update, Delete), para popular nossa tabela e manipular os dados quando necessário. Para isso vamos criar uma função para cada operação em nosso Controller, conforme abaixo:

```jsx
import ClientRepository from "../models/clientsModel.js";

function findAll(req, res) {
  ClientRepository.findAll().then((result) => res.json(result));
}

function findClient(req, res) {
  ClientRepository.findByPk(req.params.id).then((result) => res.json(result));
}

function addClient(req, res) {
  ClientRepository.create({
    nome: req.body.nome,
    email: req.body.email,
  }).then((result) => res.json(result));
}

async function updateClient(req, res) {
  await ClientRepository.update(
    {
      nome: req.body.nome,
      email: req.body.email,
    },
    {
      where: {
        id: req.params.id,
      },
    }
  );

  ClientRepository.findByPk(req.params.id).then((result) => res.json(result));
}

async function deleteClient(req, res) {
  await ClientRepository.destroy({
    where: {
      id: req.params.id,
    },
  });

  ClientRepository.findAll().then((result) => res.json(result));
}

export default { findAll, addClient, findClient, updateClient, deleteClient };

```

Lembrando que usamos o Sequelize para criar as operações do banco com o `.findByPk()` (busca por chave primária), `.create()` (criar novo cliente), `.update()` (atualizar cliente), `destroy()` (excluir cliente).

Vale pontuar que utilizamos, tanto no `update` quanto no `create`, uma função assíncrona para efetuar a manipulação dos dados no banco. E, logo em seguida, retornar o registro atualizado para ficar mais didático a visualização das alterações feitas.

Feito isso precisamos criar uma rota para cada operação configurada, vamos atualizar o arquivo routes.js:

```jsx
import express from "express";
import clients from "./src/controllers/clients.js";

const routes = express.Router();

routes.get("/clients", clients.findAll);
routes.post("/clients", clients.addClient);
routes.get("/clients/:id", clients.findClient);
routes.put("/clients/:id", clients.updateClient);
routes.delete("/clients/:id", clients.deleteClient);

export { routes as default };

```

## Testando rotas e operações no Banco de Dados

Agora podemos testar nossa aplicação, para isto vamos usar o [Postman](https://www.postman.com/) para efetuar as requisições, primeiro cadastrando um cliente, realizando uma requisição HTTP com o verbo POST para a rota `/clients`:

![Teste criação de registro](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/06/postman.png)

*Obs.: O Postman é uma ferramenta que podemos utilizar para testar requisições HTTP. Você pode acessar o site da ferramenta para saber mais sobre ela e efetuar o download (também existe a versão no navegador caso seja sua preferência).*

Perceba que passamos o nome e email via json, ele efetuou o cadastro em nosso banco de dados e já retornou também os campos id, updateAt e createdAt preenchidos. Esses dois últimos o Sequelize cria como padrão, é interessante pois sabemos quando aquele registro foi criado e atualizado.

Ao enviar um novo registro, perceba que nosso id também foi incrementado:

![teste buscar todos os registros](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/06/postman-buscar-registros.png)

Ótimo, agora podemos testar as outras rotas, como buscar por id:

![teste busca por id](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/06/busca-por-id.png)

Atualizar o email do registro de id 2 por exemplo:

![Teste atualizar registro](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/06/teste-update-registro.png)

Buscar todos os registros:

![teste buscar todos os registros](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/06/teste-buscar-todos-registros.png)

Excluir um registro:

![teste de excluir registro](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/06/teste-excluir-registro.png)

## Conclusão

Neste artigo aprendemos a utilizar um ORM, no caso o Sequelize, para trabalharmos com o Node.js e o banco de dados MySQL, executando as operações básicas relacionadas a manipulação de registros do banco de dados. Com isso obtemos algumas vantagens, como: produtividade, código mais elegante, facilidade de manutenção, legibilidade de código, entre outras.

[  ![Express - Desenvolvendo aplicações web](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/express.svg)   Curso Express - Desenvolvendo aplicações web Conhecer o curso ](https://www.treinaweb.com.br/curso/express-desenvolvendo-aplicacoes-web)

Por fim, caso queira aprender mais sobre Express saiba que aqui na [TreinaWeb](https://treinaweb.com.br/) temos o curso [Express - Desenvolvendo aplicações web](https://www.treinaweb.com.br/curso/express-desenvolvendo-aplicacoes-web) que possui **03h09 de vídeos** e um total de **18 exercícios**. Conheça também nossos outros cursos de [Node.js](https://www.treinaweb.com.br/cursos?q=node).

Veja quais são os tópicos abordados durante o curso de Express - Desenvolvendo aplicações web:

- Conhecendo a estrutura;
- Entendendo os objetos Request e Response;
- Servindo arquivos estáticos;
- Roteamento;
- Conexão com banco de dados;
- Template Engine;
- Express Generator.

- [ #JavaScript ](https://www.treinaweb.com.br/blog/tag/javascript)
- [ #Back-end ](https://www.treinaweb.com.br/blog/tag/back-end)
- [ #ORM ](https://www.treinaweb.com.br/blog/tag/orm)
- [ #Node.js ](https://www.treinaweb.com.br/blog/tag/node-js)
- [ #Sequelize ](https://www.treinaweb.com.br/blog/tag/sequelize)

Autor

 ![Wesley Gado](//secure.gravatar.com/avatar/1b770ca482a7232b1885881430a592bb?d=mm)

## Wesley Gado

 Formado em Análise e Desenvolvimento de Sistemas pelo Instituto Federal de São Paulo, atuou em projetos como desenvolvedor Front-End. Nas horas vagas grava Podcast e arrisca uns três acordes no violão. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/wesley-gado)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/08/NEST-JS-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     5 anos atrás

    ##  [ O que é NestJS? ](https://www.treinaweb.com.br/blog/o-que-e-nestjs) 

     Vamos ver neste artigo uma breve descrição sobre o que é o NestJS e como criar uma aplicação base em minutos.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/03/03163146/usando-escopos-do-eloquent-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     9 anos atrás

    ##  [ Usando escopos do Eloquent para construir consultas mais limpas no Laravel ](https://www.treinaweb.com.br/blog/usando-escopos-do-eloquent-para-construir-consultas-mais-limpas-no-laravel) 

     Veja como é possível, a partir dos escopos, reutilizar pequenos trechos de código no Eloquent e deixar as consultas mais limpas e legíveis.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2017/07/usando-o-async-await-do-javascript-400x280.png)  [ Javascript ](https://www.treinaweb.com.br/blog/categoria/javascript) 

     10 anos atrás

    ##  [ Usando o Async / Await do JavaScript ](https://www.treinaweb.com.br/blog/usando-o-async-await-do-javascript) 

     Conheça a funcionalidade async / await do JavaScript que nos ajuda a trabalhar com códigos assíncronos como se estivéssemos escrevendo de forma síncrona.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/01/28160855/websockts-php-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ Aplicações em tempo real com PHP usando WebSockets ](https://www.treinaweb.com.br/blog/aplicacoes-em-tempo-real-com-php-usando-websockets) 

     Neste artigo veremos uma introdução a WebSockets com a criação de um servidor em PHP e usando o navegador do usuário como cliente.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/01/06185133/corrotina-codigo-php-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ Corrotinas e código assíncrono em PHP usando Generators ](https://www.treinaweb.com.br/blog/corrotinas-e-codigo-assincrono-em-php-usando-generators) 

     Veja como generators podem ser utilizados para criar um simples scheduler e trabalhar com corrotinas no PHP.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/10/15163425/github-actions-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ Integração contínua para aplicações PHP usando Github Actions ](https://www.treinaweb.com.br/blog/integracao-continua-para-aplicacoes-php-usando-github-actions) 

     Veja como usar Github Actions para criar um workflow de análise e teste do seu projeto desenvolvido em PHP

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/08/06121421/html-pdf-php-lambda-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ Função para converter HTML para PDF usando PHP e wkhtmltopdf no AWS Lambda ](https://www.treinaweb.com.br/blog/funcao-para-converter-html-para-pdf-usando-php-e-wkhtmltopdf-no-aws-lambda) 

     Veja nesse artigo como subir uma função para o AWS Lambda para converter HTML para PDF usando wkhtmltopdf e o PHP como linguagem base.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/02/13190452/php-cloud-400x280.jpg)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ Aplicação Serverless desenvolvida em PHP usando AWS Lambda ](https://www.treinaweb.com.br/blog/aplicacao-serverless-desenvolvida-em-php-usando-aws-lambda) 

     Veja como fazer o deploy de uma aplicação PHP Serverless no AWS Lambda usando o Bref.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/05/01125223/react-php-imagem-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     8 anos atrás

    ##  [ Introdução à programação assíncrona em PHP usando o ReactPHP ](https://www.treinaweb.com.br/blog/introducao-a-programacao-assincrona-em-php-usando-o-reactphp) 

     Uma introdução à programação assíncrona com PHP e uso básico dos componentes do ReactPHP.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/09/01113921/1-400x280.png)  [ CSS ](https://www.treinaweb.com.br/blog/categoria/css) 

     8 anos atrás

    ##  [ Truques de como selecionar o n-ésimo item com CSS usando a pseudo-classe :nth-child ](https://www.treinaweb.com.br/blog/truques-de-como-selecionar-o-n-esimo-item-com-css-usando-a-pseudo-classe-nth-child) 

     Veja como selecionar um ou mais elementos em um grupo de elementos usando a pseudo-classe :nth-child.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/09/01114033/11-400x280.png)  [ Javascript ](https://www.treinaweb.com.br/blog/categoria/javascript) 

     8 anos atrás

    ##  [ Gerando sons com a Web Audio API do JavaScript ](https://www.treinaweb.com.br/blog/gerando-sons-com-a-web-audio-api-do-javascript) 

     Veja como podemos gerar sons com JavaScript usando a Web Audio API.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/laravel-1920x1080-1-400x280.jpg)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     10 anos atrás

    ##  [ Configurando um ambiente PHP com o Laravel Homestead ](https://www.treinaweb.com.br/blog/configurando-um-ambiente-php-com-o-laravel-homestead) 

     Aprenda a configurar um completo ambiente PHP usando o Laravel Homestead.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **16h 34min 06s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
