Como Criar um Servidor Web com Express.js e Node.js

Como Criar um Servidor Web com Express.js e Node.js

Criar um servidor web é uma habilidade fundamental para qualquer desenvolvedor web. Express.js, um framework minimalista para Node.js, é uma das ferramentas mais populares para esse propósito. Express simplifica a construção de servidores web e APIs, permitindo que você crie rapidamente aplicações robustas e escaláveis. Neste artigo, vamos explorar passo a passo como criar um servidor web com Express.js e Node.js, cobrindo desde a configuração inicial até a implementação de funcionalidades avançadas.

Pré-requisitos

Antes de começar, certifique-se de ter:

  • Node.js instalado em sua máquina.
  • Um editor de texto, como VSCode.
  • Conhecimento básico de JavaScript e Node.js.

Configuração do Ambiente

1. Instalando Node.js

Se ainda não tiver o Node.js instalado, acesse o site oficial Node.js e baixe a versão apropriada para o seu sistema operacional. Siga as instruções de instalação fornecidas no site.

2. Inicializando o Projeto

Crie um novo diretório para o seu projeto e inicialize um projeto Node.js:

mkdir express-server
cd express-server
npm init -y

3. Instalando o Express.js

Instale o Express.js usando o npm:

npm install express

Criando o Servidor Básico

1. Estrutura do Projeto

Crie a seguinte estrutura de diretórios e arquivos:

express-server/
├── src/
│   └── index.js
├── package.json
└── .gitignore

2. Criando o Servidor

No arquivo src/index.js, adicione o seguinte código para criar um servidor básico com Express.js:

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello, World!');
});

app.listen(port, () => {
  console.log(`Server running at http://localhost:${port}/`);
});

Este código cria um servidor que escuta na porta 3000 e responde com “Hello, World!” quando a rota raiz (/) é acessada.

3. Executando o Servidor

Para executar o servidor, use o comando:

node src/index.js

Abra o navegador e acesse http://localhost:3000 para ver a mensagem “Hello, World!”.

Rotas e Controladores

1. Definindo Rotas

Rotas são URLs que sua aplicação pode responder. No Express, você pode definir rotas usando métodos como app.get(), app.post(), app.put(), app.delete(), etc. Vamos expandir nosso servidor para incluir mais rotas.

app.get('/about', (req, res) => {
  res.send('About Us');
});

app.get('/contact', (req, res) => {
  res.send('Contact Us');
});

2. Usando Controladores

Para manter o código organizado, vamos mover a lógica das rotas para controladores separados. Crie um diretório controllers dentro de src e adicione um arquivo mainController.js:

express-server/
├── src/
│   ├── controllers/
│   │   └── mainController.js
│   └── index.js
├── package.json
└── .gitignore

No arquivo mainController.js, adicione:

exports.home = (req, res) => {
  res.send('Hello, World!');
};

exports.about = (req, res) => {
  res.send('About Us');
};

exports.contact = (req, res) => {
  res.send('Contact Us');
};

No index.js, modifique o código para usar os controladores:

const express = require('express');
const mainController = require('./controllers/mainController');
const app = express();
const port = 3000;

app.get('/', mainController.home);
app.get('/about', mainController.about);
app.get('/contact', mainController.contact);

app.listen(port, () => {
  console.log(`Server running at http://localhost:${port}/`);
});

Middleware

Middleware são funções que têm acesso ao objeto de solicitação (req), ao objeto de resposta (res) e à próxima função de middleware no ciclo de solicitação/resposta da aplicação. Vamos adicionar alguns middlewares úteis.

1. Middleware de Registro de Solicitações

Adicione um middleware para registrar todas as solicitações:

app.use((req, res, next) => {
  console.log(`${req.method} ${req.url}`);
  next();
});

2. Middleware para Servir Arquivos Estáticos

Para servir arquivos estáticos como imagens, CSS e JavaScript, use o middleware express.static:

app.use(express.static('public'));

Crie um diretório public e adicione alguns arquivos estáticos para teste:

express-server/
├── public/
│   ├── css/
│   │   └── style.css
│   ├── images/
│   │   └── logo.png
│   └── js/
│       └── script.js
├── src/
│   ├── controllers/
│   │   └── mainController.js
│   └── index.js
├── package.json
└── .gitignore

Trabalhando com Dados

1. Recebendo Dados do Cliente

Para receber dados enviados pelo cliente, como em formulários, use o middleware express.json() e express.urlencoded():

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

2. Rota POST para Formulários

Vamos criar uma rota POST para lidar com dados de um formulário:

app.post('/submit', (req, res) => {
  const { name, email } = req.body;
  res.send(`Received submission: Name - ${name}, Email - ${email}`);
});

Crie um arquivo form.html no diretório public para testar a rota POST:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Form Submission</title>
</head>
<body>
  <form action="/submit" method="POST">
    <label for="name">Name:</label>
    <input type="text" id="name" name="name">
    <label for="email">Email:</label>
    <input type="email" id="email" name="email">
    <button type="submit">Submit</button>
  </form>
</body>
</html>

Acesse http://localhost:3000/form.html no navegador para testar o formulário.

Integração com Banco de Dados

1. Instalando o Mongoose

Vamos usar o MongoDB como nosso banco de dados e o Mongoose como a biblioteca de modelagem de dados.

npm install mongoose

2. Configurando o Mongoose

Adicione a configuração do Mongoose no index.js:

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/expressdb', {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

const db = mongoose.connection;
db.on('error', console.error.bind(console, 'Erro de conexão:'));
db.once('open', () => {
  console.log('Conectado ao MongoDB');
});

3. Criando um Modelo

Crie um modelo de usuário no diretório models:

express-server/
├── public/
│   ├── css/
│   │   └── style.css
│   ├── images/
│   │   └── logo.png
│   └── js/
│       └── script.js
├── src/
│   ├── controllers/
│   │   └── mainController.js
│   ├── models/
│   │   └── user.js
│   └── index.js
├── package.json
└── .gitignore

No arquivo user.js, adicione o seguinte código:

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  name: String,
  email: String
});

const User = mongoose.model('User', userSchema);

module.exports = User;

4. Salvando Dados no Banco de Dados

Modifique o controlador para salvar dados no banco de dados:

const User = require('../models/user');

exports.submitForm = async (req, res) => {
  const { name, email } = req.body;
  const user = new User({ name, email });
  try {
    await user.save();
    res.send(`User ${name} saved successfully.`);
  } catch (err) {
    res.status(500).send('Error saving user.');
  }
};

E modifique o index.js para usar a nova rota POST:

const express = require('express');
const mainController = require('./controllers/mainController');
const mongoose = require('mongoose');
const app = express();
const port = 3000;

mongoose.connect('mongodb://localhost:27017/expressdb', {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

const db = mongoose.connection;
db.on('error', console.error.bind(console

, 'Erro de conexão:'));
db.once('open', () => {
  console.log('Conectado ao MongoDB');
});

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(express.static('public'));

app.get('/', mainController.home);
app.get('/about', mainController.about);
app.get('/contact', mainController.contact);
app.post('/submit', mainController.submitForm);

app.listen(port, () => {
  console.log(`Server running at http://localhost:${port}/`);
});

Implementando Autenticação

1. Instalando Bibliotecas de Autenticação

Vamos usar o bcrypt para hashing de senhas e jsonwebtoken para tokens JWT.

npm install bcrypt jsonwebtoken

2. Registrando Usuários

Crie um novo controlador para registro de usuários:

const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const User = require('../models/user');

exports.register = async (req, res) => {
  const { name, email, password } = req.body;
  const hashedPassword = await bcrypt.hash(password, 10);
  const user = new User({ name, email, password: hashedPassword });
  try {
    await user.save();
    res.send(`User ${name} registered successfully.`);
  } catch (err) {
    res.status(500).send('Error registering user.');
  }
};

Atualize o user.js para incluir o campo de senha:

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  name: String,
  email: String,
  password: String
});

const User = mongoose.model('User', userSchema);

module.exports = User;

Adicione a nova rota de registro no index.js:

app.post('/register', mainController.register);

3. Autenticando Usuários

Adicione um controlador para autenticação:

exports.login = async (req, res) => {
  const { email, password } = req.body;
  const user = await User.findOne({ email });
  if (!user) {
    return res.status(400).send('Invalid email or password.');
  }

  const validPassword = await bcrypt.compare(password, user.password);
  if (!validPassword) {
    return res.status(400).send('Invalid email or password.');
  }

  const token = jwt.sign({ _id: user._id }, 'secretKey');
  res.header('auth-token', token).send(token);
};

Adicione a nova rota de login no index.js:

app.post('/login', mainController.login);

4. Protegendo Rotas

Crie um middleware para verificar o token JWT:

const jwt = require('jsonwebtoken');

function auth(req, res, next) {
  const token = req.header('auth-token');
  if (!token) return res.status(401).send('Access denied.');

  try {
    const verified = jwt.verify(token, 'secretKey');
    req.user = verified;
    next();
  } catch (err) {
    res.status(400).send('Invalid token.');
  }
}

module.exports = auth;

Use o middleware em rotas protegidas:

const auth = require('./middleware/auth');

app.get('/private', auth, (req, res) => {
  res.send('This is a private route.');
});

Conclusão

Criar um servidor web com Express.js e Node.js é um processo que envolve várias etapas, desde a configuração inicial até a implementação de funcionalidades avançadas como autenticação e integração com banco de dados. Com este guia, você aprendeu a criar um servidor básico, definir rotas e controladores, usar middleware, trabalhar com dados e implementar autenticação. Agora você está pronto para construir aplicações web robustas e escaláveis com Express.js e Node.js.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *