-
Notifications
You must be signed in to change notification settings - Fork 1
Sumários
Miguel Gamboa edited this page Jan 15, 2021
·
51 revisions
Aulas
- 06-10-2020 - Lesson 01 - Apresentação
- 08-10-2020 - Lesson 02 - Scopes, Tipos
- 09-10-2020 - Lesson 03 - Funções, Objectos e Prototype
- 13-10-2020 - Lesson 04 - Constructor, Prototype e Class
- 15-10-2020 - Lesson 05 - Lab 1 - Functional Javascript Workshop
- 15-10-2020 - Lesson 06 - Lab 2 - Functional Javascript Workshop
- 16-10-2020 - Lesson 07 - Lab 3 - Functional Javascript Workshop
- 20-10-2020 - Lesson 08 - calling convention
- 22-10-2020 - Lesson 09 - Node.js
- 22-10-2020 - Lesson 10 - Sync versus Async
- 23-10-2020 - Lesson 11 - Lab 4 - Functional Javascript Workshop
- 27-10-2020 - Lesson 12 - Developing asynchronous API
- 30-10-2020 - Lesson 13 - Web App and Enterprise Applications
- 30-10-2020 - Lesson 14 - Service
- 31-10-2020 - Lesson 15 - Lab 5 - TPC06
- 03-11-2020 - Lesson 16 - Lab 6 - TPC06 e workshop Learn you Node
- 05-11-2020 - Lesson 17 - Unit tests, coverage and mocks
- 05-11-2020 - Lesson 18 - App Web and routing
- 06-11-2020 - Lesson 19 - Lab 7 - TPC07 adição de testes unitários JEST
- 10-11-2020 - Lesson 20 - App Web and routing
- 12-11-2020 - Lesson 21 - App Web and Integration Tests
- 12-11-2020 - Lesson 22 - Express (Chap 7- Advantages of Express and Serving APIs)
- 13-11-2020 - Lesson 23 - Lab 8 - Implementing Vinyl web app and integration tests
- 17-11-2020 - Lesson 24 - Lab 9 - Implementing Vinyl web app and integration tests
- 19-11-2020 - Lesson 25 - Lab 10 - Assignment Part 1
- 19-11-2020 - Lesson 26 - Lab 11 - Assignment Part 1
- 20-11-2020 - Lesson 27 - Lab 12 - Assignment Part 1
- 24-11-2020 - Lesson 28 - Lab 13 - Assignment Part 1
- 26-11-2020 - Lesson 29 - HTTP and ElasticSearch (Chap 6 -- Commanding Databases)
- 26-11-2020 - Lesson 30 - Manipulating Documents RESTfully (Chap 7)
- 27-11-2020 - Lesson 31 - Lab 14 - Assignment Part 1
- 10-12-2020 - Lesson 32 - Sequential vs Concurrent
- 10-12-2020 - Lesson 33 - Simplifying Code Flows with Promises (Chapter 7)
- 11-12-2020 - Lesson 34 - Lab 15 - Assignment Part 2
- 15-12-2020 - Lesson 35 - Promises (Chapter 7)
- 17-12-2020 - Lesson 36 - Web app and Template Engine
- 17-12-2020 - Lesson 37 - Lab 16 - Assignment Part 2
- 18-12-2020 - Lesson 38 - Lab 17 - Assignment Part 2 and 3
- 05-01-2021 - Lesson 39 - Forms
- 07-01-2021 - Lesson 40 - Cookies and Session
- 07-01-2021 - Lesson 41 - Authentication and `passport
- 08-01-2021 - Lesson 42 - Lab 18 - Assignment Part 3
- 12-01-2021 - Lesson 43 - Frontend Js, DOM and fetch()
- 14-01-2021 - Lesson 44 - Frontend Js, DOM and fetch()
- 14-01-2021 - Lesson 45 - Lab 18 - Assignment Part 3
- 15-01-2021 - Lesson 46 - Lab 18 - Assignment Part 3
Livro de Referência:
06-10-2020
- Apresentação da disciplina de Programação na Internet -- PI
- Regras de avaliação
- Bibliografia
- Documentação suplementar: nodeschool.io
- Evolução histórica do Javascript desde o seu aparecimento em 1995 com o objectivo inicial de uma linguagem de scripting para o browser até à sua execução no ambiente Node.js
- Papel da linguagem Javascript como: alto nível (e.g. Java, C, etc) e intermédia (e.g. bytecodes, IL).
- SLIDES: pi-52d-aula01.pdf
08-10-2020
- Análise das características da linguagem de programação Javascript como: dinâmica, untyped, e interpretada.
- Duck Typing
- Dinâmica -- Adicionar e remover propriedades em Tempo de Execução:
-
obj.nova_prop
-- adicionar uma propriedade que não existe -
delete obj.prop
-- remover uma propriedades existente
-
- Ambiente de desenvolvimento:
- Modo
use strict
- ESLint -- Javascript linter
- Editor e.g. Visual Code, Notepad, InteliJ, etc.
- Modo
- Scopes:
-
let
econst
– variáveis que NÃO podem ser usadas fora do bloco em que foram declaradas. Temporal Dead Zone -
var
- scope da função onde é declarada. Recomendação de NÃO usar.
-
- Sistema de tipos EcmaScript edição 6:
Object
e Primitivos (todos os outros que não sãoObject
) - Tipos Primitivos:
Undefined
,Null
,Boolean
,Number
,String
. - operador
typeof
einstanceof
-
Objecto Literal:
{ prop1: valor1, prop: valor2, …}
- propriedades são membros de um objecto que armazenam valores.
- SLIDES: pi-52d-aula02.pdf
09-10-2020
-
Node.js:
- =
AVE
+ gestão de dependencias (bibliotecas) - =
V8
+NPM
package manager
- =
- V8 JavaScript Engine projecto open-source de uma máquina virtual da Google, parte integrante do Browser Chrome, lançado em 2008.
- V8 como um Ambiente Virtual de Execução com as mesmas características de outros ambientes como JVM, ou CLR.
- Os componentes são distribuídos em código fonte JavaScript, podendo o JavaScript ter também uma perspectiva de linguagem intermédia como target de compiladores de linguagens como o TypeScript, Python, entre outras.
- Uma propriedade que armazena uma função é um método
-
Função Construtora --- tem uma propriedade explícita
prototype
. - Objecto –––
constructor
–––> função Construtora (código) –––prototype
–––> objecto Protótipo. - O protótipo tem a semântica do padrão de desenho Prototype
- O protótipo serve de “modelo” à criação de novos objectos
- Exemplos de actualização do
prototype
e reflexo nos objectos com esseprototype
-
Properties Lookup (o objecto tem precedência sobre o protótipo)
- Primeiro procura no objecto uma propriedade com o nome igual
- Caso não encontre, então procura no
prototype
uma propriedade com esse nome
-
Funções são first-class objects -- as funções têm todas funcionalidades que tem qualquer outro objecto JavaScript:
- Podem ser atribuídas a variáveis
- Podem ser passadas por parâmetro
- Podem ter propriedades definidas pelo programador (campos ou métodos)
- Funções têm uma capacidade adicional sobre os objectos que é poderem ser invocadas.,
- Introspecção sobre objectos em Javascript (comparação com Reflexão via .Net ou Java):
- Enumeração sobre nomes das propriedades de um objecto –
for(let key in objRef)
- Aceder a uma propriedade com nome dado por uma expressão:
obj[exp]
- Chamar um método com nome dado por uma expressão:
obj[exp]()
- Enumeração sobre nomes das propriedades de um objecto –
- SLIDES: pi-52d-aula03.pdf
- TPC2
13-10-2020
- Função Construtora
- Chamada realizada com o operador prefixo
new
- O construtor retorna implicitamente o novo objecto (
this
) a não ser que haja retorno explícito - Associação de método de instância por via do Prototype
- e.g.
Point.prototype.module = function() {return Math.sqrt(this.x*this.x + this.y*this.y)}
- e.g.
- Definição equivalente com
class
em ECMAScript 6 - Os métodos correspondem a proprieades not enumerable
<=>
:
Object.defineProperty(Point.prototype, 'module', {
value: function() {
return Math.sqrt(this.x*this.x + this.y*this.y)
}
})
- Enumerar propriedades visíveis:
for(let propName in obj)
- Enumerar todas as propriedades:
for(let propName of Object.getOwnPropertyNames(obj))
- As funções são declaradas como literais que criam um valor função. 3 formas:
- função com nome e.g.
function foo() {}
- função sem nome e.g.
function () {}
(função anónima) -
arrow function e.g.
() => {}
(função anónima)
- função com nome e.g.
- Uma função tem uma propriedade
name
que guarda o nome declarado na função. -
Funções anónimas têm a propriedade name igual
""
string vazia. - O nome da variável que refere uma função
!=
da propriedadename
dessa função
- Todas as funções recebem dois parâmetros implícitos:
this
earguments
-
arguments
é uma colecção com o mesmo comportamento de array mas sem os seus métodos. - O número de argumentos, não tem que coincidir com o número de parâmetros
- 4 formas de chamar uma função:
- Como uma função (sem target) =>
this
igual aundefined
- Como um método de instância --
this
igual aotarget
e.g.target.methodName()
- Como construtor --
this
igual ao objecto criado e.g.new funcName()
- com
apply()
oucall()
- Como uma função (sem target) =>
- Função Construtora
- Chamada realizada com o operador prefixo
new
- O operador
new
altera o significado dothis
que refere o objecto criado; - O construtor retorna implicitamente o novo objecto (
this
) a não ser que haja retorno explícito;
Closure:
- Por cada chamada a uma função é criado um novo conjunto de variáveis com o contexto dessa função;
- As funções internas têm acesso às variáveis locais (parâmetros, ou não);
- NESTE caso, o ciclo de vida das variáveis externas é prolongado (apenas se for usada a função interna).
package.json
npm init
-
npm install <pkg> --save
-- download módulo<pkg>
e actualizapackage.json
- repositório local
node_modules
-- Adicionar ao.gitignore
-
npm install
-- download das bibliotecas especificadas empackage.json
- CommonJS -- definição do formato dos módulos.
-
require(‘nome’)
-- incorpora um módulo Node na forma de um objecto. module.exports
-
fs = require('fs')
-- módulo file system - Exemplos de utilização da API síncrona de
sync-request
:req('GET', 'http://example.com').getBody().toString()
- Node.js: Google's V8 JavaScript engine + event loop + low-level I/O API;
- Event Loop para executar operações (na forma de callbacks) quando um evento ocorre.
- Felix Geisendörfer: “everything runs in parallel except your code.”
- Vários callbacks podem responder a um mesmo evento, mas só um é executado em cada instante – sequencialmente.
- Os callbacks NÃO são interrompidos por outros callbacks, nem correm em paralelo com outros callbacks.
- Do ponto de vista da linguagem JavaScript o Node.js oferece um ambiente single-threaded.
- Todas as operações de IO do Node.js podem ser executadas emsimultaneo e.g. ler ficheiros; peidos HTTP,….
- As operações de IO usam técnicas non-blocking.
github.com/maxogden/art-of-node
- Distinção entre modelo de chamada síncrono versus assíncrono. Exemplos.
- Exemplificação em Node Js de uma sequência de pedidos Http de forma Síncrona versus Assíncrona através dos módulos
sync-request
vsrequest
. -
Idiomatic Node.js callback convention --
(err, data) => void
- Características do modelo de callback do node.js:
(err, data) => void
- O callback é o último parâmetro passado a um método assíncrono.
- Idioma:
if(err) return cb(err)
- Em caso de sucesso:
cb(null, data)
github.com/maxogden/art-of-node
- SLIDES: pi-52d-aula09-node-intro.pdf
- Revisão do modelo Assíncrono baseado em Callback
- Menção a outras formas de utilização de um modelo de chamada assíncrono (tratado na UC de Programação Concorrente):
- Promises
-
async
/await
- Características do modelo de callback do node.js:
(err, data) => void
- O callback é o último parâmetro passado a um método assíncrono.
- Idioma:
if(err) return cb(err)
- Em caso de sucesso:
cb(null, data)
- Implementação de uma API assíncrona baseada em callback
- Retornar o tamanho do ficheiro e outra função que calcula o somatório dos ficheiros.
- TPC5
- SLIDES: pi-52d-aula12-dev-async-API
- Martin Fowler “Enterprise applications are about the display, manipulation, and storage of large amounts of often complex data and the support or automation of business processes with that data” [Fowler, 2003].
- Simplistic view: 📂
-->
Data Layer
-->
Domain
-->
UI
-->
👤 - 3 Layers or Tiers
- Exemplo: BD SQL
-->
JDBC-->
Model + Services-->
HTML + CSS + Css-->
🌐 - vinyl -- Desenho de uma aplicação Web para gestão de listas de bandas favoritas por utilizador.
- vinyl:
Last.fm API ---> urllib ---> lastfm \
---> vinyl ---> UI
users.json File ---> fs ---> users /
-
lastfm
- Análise da fontes de dados Last.fm API -
users
- Desenho do formato de dados para armazenar utilizadores e suas bandas favoritas
- TPC6
- SLIDES: pi-52d-aula13-services
- vinyl -- obter o top das músicas das bandas favoritas de um utilizador.
- Implementação dos módulos da aplicação vinyl: 1.
lastfm
, 2.users
e 3.vinyl
:-
lastfm
--getTopTracks(artist, cb)
-
users
--function getUser(username, cb)
-
vinyl
--function getTopTracks(username, limit, cb)
-
- Documentação da API com JSDoc
- JavaScript Testing Frameworks: nodeunit, mocha, jest, etc
- Using jest:
npm install --save-dev jest
-
npm install --save-dev @types/jest
-- To provide full typing and e.g. intellisense in VS Code -
jest --init
-- Generate a basic configuration file -
npm run test
callsjest
to run tests -
jest --coverage
to check code coverage
- Code Coverage
- Testing Asynchronous Code
- Mock - simulated objects that mimic the behavior of real objects.
- Implementing a mock for
urllib
jest.mock('urllib')
urllib.request.mockImplementationOnce(function ....)
- URIs, Resources and Representation
-
Schemes, e.g. scheme
http://
-- protocolo http - App WEB: HTTP Server; Routing; Representation (e.g. HTML, Json, CSV, other; aka Views)
-
Request Methods:
GET
,POST
,PUT
,DELETE
. - Idempotent property defined by RFC 7231.
-
PUT
<versus>
POST
- Designing routes for vinyl web application:
GET /vinyl/users/<username> => getUser()
GET /vinyl/users => getUsers()
DELETE /vinyl/users/<username> => removeUser()
PUT /vinyl/users/<username> => addUser() // unique usernames
POST /vinyl/users/<username>/artists => addArtist() // allows repetitions
-
const server = http.createServer((req, res) => ...)
- instance of HTTP server. -
server.listen(8000)
- run and listen on port. res.writeHead(statusCode[, statusMessage][, headers])
-
res.write(chunk)
- sends a chunk of the response body. -
res.end([data])
- signals that response headers and body have been sent
- Some headers: Host; content-type; content-length;
-
Internet Media Types e.g.
text/xhtml
,image/png
,application/json
, etc (RFC2046) - HTTP status codes
- Inconsistent responses:
- Uncomplete HTTP response
- Absence of
content-type
- Vinyl web app
- Implement
routes-vinyl
- Handling errors and distinguishing between errors on server or client side
- Parsing route parameters and query string
- Modules
url
andquerystring
- Solving the TPC8
- Highlight the difference between changing the Resource versus its Representation
- Distinguish between Unit and Integration tests.
- Mention different alternatives and approaches for integration tests of a web API.
- E.g. Postman, frisby js
- Validate responses status codes and JSON content.
expect(handler, [...args])
-
handler
:status
,header
andjson
- Ensure that Web API server is running before starting tests.
beforeAll(() => server = fork('./index', ... )
-
Routing :
app.METHOD(PATH, HANDLER)
-
app
is an instance of express. -
METHOD
is an HTTP request method, in lowercase. -
PATH
is a path on the server. -
HANDLER
is the function executed when the route is matched.
-
-
HANDLER
- handling middleware function -function(req, resp, next)
-
app.use(PATH, HANDLER)
- for any method. -
app.use(HANDLER)
- for any method and any path. -
route parameters -
/path/:param1/
-
req.params
- route parameters specified in path -
req.query
- query string parameters -
resp.send()
-- includes call toend()
andcontent-type
as HTML -
resp.json()
-- serializes (JSON.stringify
) to JSON andcontent-type
as JSON. - Error Handler -- added at the end of the pipeline by default.
- Error Handler custom -
function(err, req, resp, next)
- Composing pipelines through express.Router:
- A router object is an isolated instance of middleware and routes. You can think of it as a “mini-application,” capable only of performing middleware and routing functions. Every Express application has a built-in app router.
Node.js 8 the right way:
- Chapter 7 - Advantages of Express
- Chapter 7 - Serving APIs with Express
- POST passing parameters in HTTP body rather than in query-string
- Using express
body-parser
middleware -
app.use(bodyParser.json())
for application/json -
app.use(bodyParser.multipart({ extended: false }))
for application/x-www-form-urlencoded
- Download: https://www.elastic.co/downloads/elasticsearch
- ElasticSearch - Resources are JSON documents
- ElasticSearch - schema-free + RESTful + NoSQL
- ElasticSearch - Stores and indexes JSON documents via HTTP:
-
run:
> elasticsearch
- RESTFull API: HTTP based + Resources by URI
- HTTP GET - returns a resource
- HTTP PUT - updates a resource identified by given URI
- HTTP POST - inserts a new resources and generates a new URI
- HTTP DELETE - removes a resource
- URI =
<elastic host>:<port>/index/type/<_id>
- URI e.g.
localhost:9200/tasks/_doc_/t01
- Use cases:
-
curl http://localhost:9200/_cat
-- info about the cluster -
curl http://localhost:9200/_cat/indices
-- listing indexes -
curl http://localhost:9200/_cat/indices?v
-- v stands for verbose -
curl http://localhost:9200/_all
-- details about all indexes -
curl http://localhost:9200/tasks
-- details about a particular index, e.g.tasks
-
curl http://localhost:9200/tasks/_search
-- listing documents of an index, e.g.tasks
-
curl http://localhost:9200/tasks/_doc_/t01
-- details of a document with_id
=t01
andtype
=_doc
-
- Manipulate:
-
curl -X PUT http://localhost:9200/tasks
-- Creates an index e.g.tasks
-
curl -X DELETE http://localhost:9200/tasks/_doc_/t01
-- Removes the document with_id
=t01
-
curl -X POST
versusPUT
to create or update a document, e.g.task1.json
:
-
> curl -X PUT --data "@task1.json" -H "Content-Type: application/json" http://localhost:9200/tasks/_doc/t01
> curl -X POST --data "@task2.json" -H "Content-Type: application/json" http://localhost:9200/tasks/_doc
- Node.js 8 the right way (2nd Edition) - Chapter 6 -- Commanding Databases
- SLIDES: pi-52d-aula29-Commanding-Databases-via Rest.pdf
- Project Gutenberg -- Project Gutenberg is a library of over 60,000 free eBooks.
-
databases/rdf-to-bulk.js
-- JavaScript app that migrates RDF filed in XML-->
JSON (i.e.bulk_pg.js
) - Insert JSON documents into ElasticSearch in bulk with content from
bulk_pg.json
:
curl -X POST
-H "Content-Type: application/json"
--data-binary "@bulk_pg.ldj"
http://localhost:9200/books/_bulk
- Sample of a bundle:
{
"name": "light reading",
"books": [{
"id": "pg132",
"title": "The Art of War"
},{
"id": "pg2680",
"title": "Meditations",
},{
"id": "pg6456",
"title": "Public Opinion"
}]
}
- module
Bundle
service:create(name, cb)
delete(id, cb)
get(id, cb)
-
addBook(id, pgId, cb)
=>
includes 3 HTTP requests:- GET
/localhost:9200/bundles/bundle/<pgid>
- GET
/localhost:9200/books/book/<pgid>
- PUT
/localhost:9200/bundles/bundle/<pgid>
novobundle
- GET
- ALERT for the sequential execution of 1. and 2. that could be performed concurrently instead.
- Implement a function
parallel(tasks, callback)
that:- Run the
tasks
array of functions in parallel. If any of the functions pass an error to its callback, the maincallback
is immediately called with the value of the error. Once thetasks
have completed, the results are passed to the finalcallback
as an array.
- Run the
- Highlight the sequential execution of tasks: 1. get bundle and 2. get book.
- Compare the two possible approaches to perform those tasks: sequential vs concurrent
- Modify
addBook(id, pgid, cb)
ofbundles
to run 1. get bundle and 2. get book concurrently. - Modify
addArtist(id, pgid, cb)
ofvinyl
to run 1. get user and 2. search artist concurrently. - Extract to a distinct module the logic of running tasks concurrently and aggregating their results.
- Implement in module
asyncutils
a functionparallel(tasks, callback)
that:- "Run the tasks array of functions concurrently. If any of the functions pass an error to its callback, the main callback is immediately called with the value of the error. Once the tasks have completed, the results are passed to the final callback as an array."
- !!!ALERT!!! to the order of the results in aggregation array.
- Implement a unit test to validate
parallel(...)
ofasyncutils
- Update
bundles
andvinyl
to take advantage ofparallel(...)
, e.g.:
const task1 = cb => users.getUser(username, cb)
const task2 = cb => lastfm.searchArtist(artist, cb)
asyncutils.parallel([task1, task2], (err, res) => {
if(err) return cb(err)
const [user, arr] = res
if(arr.length == 0) return cb(Error('There is no artist with name ' + artist))
users.addArtist(user.username, arr[0].name, cb)
})
- https://en.wikipedia.org/wiki/Futures_and_promises
- Promise - Container for an asynchronous result: successful or failure.
- Asynchronous alternatives examples:
-
callback
(err, data) => {...}
--err
anddata
are 2 possible results. -
EventEmitters
.on('error’, callback)
e.on('data’, callback)
. -
Promise - e.g. Java
CompletableFuture
, .NetTask
, JsPromise
, etc -
async
/await
-- in most environments e.g. Dotnet, Python, Js, etc. except Java. - suspend functions, e.g. Kotlin
-
callback
- Js
Promise
:- 3 possible states: Pending, Fulfilled (success) or Rejected (error)
- chaining a callback:
….then(callback)
or….catch(callback)
-
then()
andcatch()
return newPromise
objects
- Implement
delay(timeout, success)
that returns aPromise
- Chaining
Promises
throughthen()
that behaves likeflatMap()
Node.js 8 the right way:
- Chapter 7 - Simplifying Code Flows with Promises
- SLIDES: pi-52d-aula32-sequential-vs-concurrent.pdf
- Refactoring
vinyl
app to usePromises
rather than callbacks -
async
/await
-- "allows you to write pseudo-synchronous code to describe asynchronous computation.":- Forgetting
try/catch
may lead to Unresolved Promises Warning! - Chaining consecutive
await
calls may lead to a sequential execution!
- Forgetting
- Module
require('fs').promises
- Module
fetch-node
- Jest with promises
-
Jest mocking
fetch-node
- Chaining continuations:
function getTopTracks(username, limit) {
return users
.getUser(username) // P<User>
.then(user => user.artists) // P<Array<Artist>>
.then(artists => artists.map(artist => lastfm.getTopTracks(artist))) // P<Array<P<Array<String>>>>
.then(arr => Promise.all(arr)) // P<Array<Array<String>>>
.then(tracks => tracks.map(arr => arr.slice(0, limit))) // P<Array<Array<String>>>
.then(tracks => tracks.flat()) // P<Array<String>>>
}
Node.js 8 the right way:
- Chapter 7 - Emulating Synchronous Style with async and await
- SLIDES: pi-52d-aula35-promises.pdf
- HTML: structure and content semantics
- E.g. semantic elements:
<caption>
,<thead>
,<nav>
, etc - Elements, Tags and Attributes
- Text nodes
- HTML basics:
<!DOCTYPE html>
-
<html>
,<body>
<head>
<meta charset="utf-8">
-
self-closing elements:
<img>
,<br>
,<hr>
, etc
- CSS: styling language to define HTML content presentation.
- CSS: Selector, Properties e Values
- Syntax:
selector{propriedade:valor; ...}
- inline, internal e external styles.
- GetBootstrap
<link href="bootstrap.min.css" rel="stylesheet">
- Responsive, mobile-first front-end web development
- View -- Template for HTML presentations
- handlebars semantic templates
-
data
-- context object -- referência na view através de{{.}}
- Layouts and
{{{body}}}
- Express with handlebars:
npm install --save hbs
-
app.set('view engine', 'hbs')
andapp.set('views', './lib/views')
resp.render(<view name>, <object>)
-
view handlebars :
{{#each property-array}} … {{/each}}
{{#if }} ...{{else }}
- SLIDES: pi-52d-aula36-web-app.pdf
- HTML, Handlebars and CSS
- CSS frameworks e.g. Bootstrap
- CSS use of classes e.g.
container
,table
,table-striped
, etc - External CSS
- Serving static resources. E.g.
express.static()
- Forms
- Submiting data through POST
-
enctype
application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
- Body parameters on
req.body
- Post/Redirect/Get (PRG) idiom that lets the page shown after a form submission be reloaded, shared, or bookmarked without ill effects.
- SLIDES: pi-52d-aula36-web-app.pdf
-
Authentications includes:
- 1x Credentials
--->
User--->
User Id (on session state) - Further requests: User ID
---->
User (on Web App)
- 1x Credentials
- Cookies keep stateful information across different HTTP requests.
- Request header
Cookie
and response headerSet-Cookie
-
Cookies attributes:
expires
,domain
epath
. - Module
cookie-parser
. - Use cases:
- Read:
req.cookies
- Write:
resp.cookie(key, value)
- Read:
- Setup Middleware for session state:
app.use(expressSession({...}))
-
req.session
- read write properties kept in session state
Node.js 8 the right way:
- Chapter 9 - Managing User Sessions in Express
-
Authentications includes:
- 1x Credentials
--->
User--->
User Id (on session state) - Further requests: User ID
---->
User (on Web App)
- 1x Credentials
-
passport
includes:-
passport.session()
- middleware to keep User Id in session state. -
passport.initialize()
- middleware that setupreq
with methods:-
req.login(user, cb)
--->
updatesreq.user
and stores User Id in session. -
req.logout()
--->
deletesreq.user
and User Id from session. -
req.isAuthenticated()
--->
true
orfalse
as a result ofreq.login()
orreq.logout()
.
-
-
-
req.login(user, callback)
:- Error if it fails to create a new session for the user.
- Uses
passport.serialize
to get the User Id that is stored in session.
-
passport.session()
usespassport.deserialize
to build the User instance from the User Id.
- front-end -- Resources in HTML, CSS and JavaScript to produce a GUI
<script type='text/javascript' src='/js/vinyl.js'></script>
-
JavaScript DOM API:
- Data representation of the objects that comprise the structure and content of a document on the web.
- API that enables the connection between web pages to scripts/programming languages.
-
fetch()
- Browser API to perform HTTTP request in Javascript.-
node-fetch
shares the same API offetch()
-
- Use cases of Javascript DOM:
-
window
- reference to aWindow
object that contains adocument
-
document
– reference to rootElement
-
document.location
– information about the URL of the document -
document.getElementById(<String>)
- return anElement
by its id <Element>.addEventListener(type: String, listener: Function)
-
<Node>.querySelector(<selector>)
– first occurrence -
<Node>.querySelectorAll(<selector>)
– returns a list ofNode
objects with all occurrences -
<Node>.insertAdjacentHTML(position, String)
- whereposition
may be:'afterbegin'
,'beforeend'
, etc -
<Node>.innerHTML
- gets or sets the HTML or XML markup contained within the element. -
<Node>.remove()
- removes the node from the document it belongs to.
-
-
Event
– EventHandler and EventListener
interface EventTarget : Node{
void addEventListener(String type, EventListener listener, bool Capture/Buble);
}
- e.g.
buttonElement.addEventListener('click', function (event) {...})
- Alternative:
node.["on" + type] = handler()
: AVOID it in HTML documents.- Event handler property as a placeholder, to which a single event handler can be assigned.
Vinyl Web App:
- Implement server routes to handle delete on
/api/vinyl/users/:username/artists/:artist
- Implement service for
removeArtist()
on moduleusers
and unit tests. - Using
fetch('api/...', {method: 'DELETE', ...})
to former route. -
NOTICE the browser does not refresh (nor redirect) on response status 300 for a request via
fetch()
. - HTML data attributes for extensibility and data that should be associated with elements.
- Alternatives:
- Hidden input
-
User programmer own attributesAvoid it - HTML data attributes.