cefet_web

Server-side parte 3

Criando um servidor web com Express


Roteiro

  1. Continuando nosso servidor web DIY
  2. O framework Express.js
  3. Geração dinâmica de HTML

Construindo um servidor web DIY

Continuando nosso servidor web


Um servidor web não muito útil


Um servidor web útil (baseado na URL)

import http from 'http'           // módulo http (nativo)
import fs from 'fs'               // módulo fs (nativo)
import url from 'url'             // módulo url (nativo)

const PORTA = 8000
const __dirname = new URL('.', import.meta.url).pathname
const caminhoServidor = __dirname.substr(0, __dirname.length - 1)


const server = http.createServer((req, res) => {
  const urlCompleta = url.parse(caminhoServidor + req.url)
  const caminhoSolicitado = urlCompleta.pathname

  // por exemplo, para localhost:8080/estilos.css, caminhoSolicitado é o
  // endereço desse arquivo no file system
  const streamArquivo = fs.createReadStream(caminhoSolicitado)

  streamArquivo.on('error', () => {
    res.writeHead(404)
    res.end('Not Found')
  })

  streamArquivo.on('open', () => {
    res.writeHead(200, {
      'Content-Type': 'text/plain'
    })
    streamArquivo.pipe(res)
  })
})

server.listen(PORTA, () => {
  console.log(`Escutando em http://localhost:${PORTA}/`)
})

Problema: MIME types


Servindo os arquivos, com MIME types


Usando o pacote mime


Usando o pacote mime (cont.)


Usando o pacote mime (cont.)


O que ainda está faltando


Express

Um framework web para Node.js


Logo do Express


Servidor “hello world” com Express

import express from 'express'
const app = express()

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

const server = app.listen(3000, () => {
  const host = server.address().address;
  const port = server.address().port;

  console.log(`Listening at http://${host}:${port}`);
});

Servidor de arquivos estáticos com Express

import express from 'express'
const app = express()

// suponhamos que "/public" é uma pasta com
// nossos arquivos estáticos
app.use(express.static(`${__dirname}/public`))

app.listen(3000, () => {
  console.log('Escutando em: http://localhost:3000')
})

Especificando rotas


Especificando rotas (cont.)


Gerando HTML dinamicamente


Gerando HTML dinamicamente com ejs


Gerando HTML dinamicamente com ejs (cont.)


Gerando HTML dinamicamente com ejs (cont.)


Gerando HTML dinamicamente com ejs (cont.)


Gerando HTML dinamicamente com handlebars


Gerando HTML dinamicamente com pug


Referências

  1. Capítulo 8 do livro “Node.js in Action”
  2. Site do expressjs