Organizando Rotas

Usando o Router(), podemos dividir a aplicação em partes. Isso significa que podemos criar um basicRouter para o roteamento básico do nosso frontend. Podemos, também, ter um adminRouter para rotas de administração protegidas por uma autenticação.

Roteando nossa aplicação dessa maneira podemos separar cada parte. Isso nos da a flexibilidade que precisamos em aplicações e APIs mais complexas. Dessa maneira, mantemos a aplicação limpa e organizada, movendo cada definição de roteamento para seu respectivo arquivo e apenas o instanciando e passando para o app.use() dessa maneira:

app.use('/', basicRoutes)
app.use('/admin', adminRoutes)
app.use('/api', apiRoutes)

Rotas com Parâmetros: /users/:name

Para adicionar uma rota com parâmetros na aplicação, precisamos de uma rota tipo /admin/users/:name onde passamos um nome na URL e a aplicação imprime um "Faalaaa name!". Veja como essa rota seria:

// rota com parâmetros (http://localhost:8000/admin/users/:name)
adminRouter.get('/users/:name', (req, res) => {
  res.send('Faalaaa ' + req.params.name + '!')
})

Agora quando visitarmos http://localhost:8000/admin/users/dev veremos um "Faalaaa dev!", o req.params armazena todos os parâmetros passados na requisição.

[Express Router Parameters]

Mais na frente, vamos usar isso para retornar os dados do usuário informado e construir um painel de controle para o gerenciamento de usuários.

Agora, vamos dizer que precisemos validar esse nome de alguma forma. Talvez para ter certeza de que não é um nome impróprio. Então, faríamos isso em um middleware e vamos usar um especial pra isso...

Middleware para Parâmetros: .param()

Vamos usar o middleware .param() do Express. Isso cria um middleware que será executado para um parâmetro específico. Nesse caso, para o :name nessa rota. Novamente, precisamos ter certeza de coloca-lo antes da definição da rota e ficará dessa maneira:

// middleware de validação para 'name'
adminRouter.param('name', (req, res, next, name) => {
  // faça a validação do 'name' aqui
  // validação blah blah
  // logar alguma coisa pra sabermos se funciona
  console.log('validando o nome: ' + name)

  // quando a validação acabar, salve o novo nome na requisição
  req.name = name
  // vá para a próxima coisa a fazer
  next()
})

// roteamento com parâmetro (http://localhost:8000/admin/users/:name)
adminRouter.get('/users/:name', (req, res) => {
  res.send('Faalaaa ' + req.name + '!')
})

Agora, quando a rota /users/:name for acessada, o middleware será executado. Dessa forma, podemos executar quaisquer validações e então passar a nova variável a rota .get armazenando-a no req (request). Então, podemos acessá-la trocando o req.params.name pelo req.name já que pegamos ela do req.params.name e colocamos no req.name dentro do middleware.

Quando visitarmos http://localhost:8000/admin/users/lucas no browser veremos a requisição logada no console.

[Express Router Parameter Middleware]

O middleware para parâmentros é usado para validar os dados enviados para a aplicação. Se precisarmos criar uma API RESTful, precisamos então validar um token e garantir que o usuário tem acesso a informação. Até agora, tudo que estamos fazendo em Node nos levará a construção da API RESTful que vai ser o backend/server-side que falamos no início do curso quando falamos sobre o modelo client-server.

A última feature do Express que vamos ver é como usar o app.route() para definir multiplas rotas.

Rotas de Autenticação: app.route()

Podemos definir as rotas diretamente no app. Isso é parecido com o uso do app.get, mas vamos usar o app.route. Ele é básicamente um atalho para o Express Router. Em vez de chamar express.Router(), usamos o app.route e começamos a definir as rotas.

Usando o app.route podemos definir multiplas ações para a mesma rota. E nesse caso, vamos precisar definir uma rota GET para mostrar o formuláruio de login e uma POST para processar a autenticação. Isso fica assim:

app.route('/login')
  // exibe o form (GET http://localhost:8000/login)
  .get((req, res) => {
    res.send('this is the login form')
  })
  // processa o form (POST http://localhost:8000/login)
  .post((req, res) => {
    console.log('processing')
    res.send('processing the login form!')
  })

Isso define duas ações diferentes para a rota /login de maneira simples e clara. Isso foi aplicado diretamente em nosso objeto app no server.js, mas poderia ser definido no objeto adminRouter que vimos antes.

Essa é uma boa maneira de configurar rotas, já que mantém o código claro e facilida a identificação de onde as rotas são aplicadas. Em breve, vamos desenvolver uma API RESTful e uma das principais coisas que vamos fazer é usar diferentes verbos HTTP para definir as ações na aplicação. Como o GET /login para prover uma view de autenticação enquanto um POST /login vai processar a autenticação.

results matching ""

    No results matching ""