const http = require('http'),
fs = require('fs');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
fs.createReadStream(process.argv[3]).pipe(res);
})
server.listen(process.argv[2]);
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}/`)
})
text/plain
text/html
image/png
video/webm
application/json
$ npm search mime
mime
, com a descrição “A comprehensive
library for mime-type mapping” 🤔
mime
. No diretório
do nosso arquivo js:
$ npm install mime
node_modules
foi criada e ela contém uma
subpasta chamada mime
mime
via require('mime')
lookup
que, dado um nome de arquivo, retorna o
MIME typemime
:
import http from 'http'
import fs from 'fs'
import url from 'url'
// incluído e atribuido à variável "mime"
import mime from 'mime'
/* ... */
/* ... */
streamArquivo.on('open', () => {
res.writeHead(200, {
'Content-Type': mime.lookup(caminhoSolicitado)
})
stream.pipe(res)
console.log(`Serviu o arquivo: ${caminhoSolicitado}`)
})
/* ... */
304 not modified
em vez de 200 OK
$ npm install express --save
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}`);
});
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')
})
GET
, POST
etc.) e uma URL// GET / (página inicial)
app.get('/', (request, response) => {
response.render('index') // desenha a view 'index'
})
// POST /contato
app.post('/contato', (request, response) => {
// envia um email usando os dados enviados
})
// HEAD /user/122 (verificar se usuário id=122 existe)
app.head('/user/:ident', (request, response) => {
// request.params contém os parâmetros da rota
const usuario = tabelaDeUsuarios[request.params.ident]
if (usuario !== null) {
response.status(200).end()
} else {
response.status(404).end()
}
})
ejs
(.ejs
, era o formato original do Express)handlebars
(.hbs
, site oficial)pug
(.pug
, site oficial)ejs
(ou qualquer outro templating engine) em 3 passos:
ejs
ejs
:
app.set('view engine', 'ejs')
.ejs
em vez de .html
. Trecho de um
arquivo, e.g., equipe.ejs
:
<ul>
<% for (let i = 0; i < users.length; i++) { %>
<li><img src="<%= users[i].foto %>"><%= users[i].nome %></li>
<% } %>
</ul>
./views
):
app.set('views', 'arquivos_ejs'); // pasta arquivos_ejs
response.render
e passamos o nome do arquivo da view que deve ser usado (sem a extensão):
app.get('/equipe', function(request, response) {
response.render('equipe', contexto); // vai pegar arquivos_ejs/equipe.ejs
});
response.render
:
response.render('equipe', {
users: [
{ nome: 'TJ Holowaychuk', foto: 'tj.jpg' },
{ nome: 'Douglas Wilson', foto: 'dcw.jpg' }
]
});
app.set('view engine', 'hbs');
.hbs
:
<ul>
<li><img src=""></li>
</ul>
app.set('view engine', 'pug');
.pug
:
ul
each user in users
li: img(src=user.foto) #{user.nome}