Transcrições
1. Introdução do curso: Bem-vindo de volta ao módulo cinco
do curso ExpressJS
Advanced Express Esta aula é uma continuação
da série de cursos ExpressJS Meu nome é Shawn Ragunhi e estou animado para guiá-lo nesta próxima etapa na
masterização Tendo trabalhado em vários aplicativos de nível de
produção, sei a importância
de entender os
recursos avançados do Express e estou aqui para compartilhar
essa experiência com você. Neste módulo,
vamos nos
aprofundar nos
recursos avançados do Express JS. Aqui está o que você aprenderá sobre
a magia do Middleware, como usar opções integradas, integrar bibliotecas de terceiros e até mesmo criar seu
próprio Middleware personalizado Em seguida, você verá técnicas avançadas de
configuração para tornar seus aplicativos adaptáveis a diferentes
ambientes. Em seguida, você aprenderá como
solucionar problemas e depurar
aplicativos expressos como um Pro Depois disso, você
aprenderá a integrar bancos de dados com o Express para um gerenciamento de dados
contínuo E, finalmente,
as melhores práticas para estruturar e organizar seus aplicativos para escalabilidade e capacidade de
manutenção Este módulo é perfeito para desenvolvedores que
já estão
familiarizados com o básico do Express e estão prontos para levar suas
habilidades para o próximo nível Se você concluiu
o módulo anterior ou tem alguma experiência
com APIs RESTful,
está tudo pronto para se aprofundar Ao final deste módulo, você terá uma compreensão
completa recursos avançados
do Express JS, permitindo criar aplicativos de
rádio
sofisticados e de produção. Se você está criando um projeto pessoal ou trabalhando
em aplicativos de nível corporativo, essas habilidades o
diferenciarão como desenvolvedor de back-end Por fim, nosso projeto neste modio se
concentrará
em aprimorar
o pacote Fair Você aprimorará a estrutura
e a capacidade de manutenção do aplicativo Fair Wheels
refatorando Organizar seu código
é uma etapa fundamental na criação de aplicativos escaláveis e prontos para
produção E este projeto o
guiará pelo processo
de
modularização de suas rotas Estou entusiasmado em ajudá-lo a desbloquear todo o
potencial do Express Js Vamos mergulhar e começar. Nos vemos na primeira palestra.
2. Mergulhando em técnicas avançadas de Express: Na última seção,
você aprendeu a criar serviços RSL
usando o Express Nesta seção, continuaremos nossa jornada com o Express e examinaremos tópicos
mais avançados. Mais especificamente,
analisaremos os mecanismos de middleware,
configuração, depuração e modelagem. Então, agora vamos começar.
3. Magia do middleware no Express.js: Um dos principais conceitos
expressos que você precisa
aprender é o conceito de
middleware ou
função de middleware Uma função de middleware é
basicamente uma função que pega um objeto de solicitação
e retorna uma resposta ao cliente ou
passa o controle para outra função de
middleware Você já
viu dois exemplos
de funções de middleware Uma é essa função de
manipulador de rotas. Portanto, no Express, cada função de
manipulador de rotas que temos é tecnicamente uma função de
middleware porque usa
um objeto de solicitação
e, nesse caso, retorna
uma resposta ao cliente,
encerrando o ciclo encerrando Portanto, esse é um exemplo de
uma função de middleware. Temos outro exemplo
que está na linha cinco. Então, quando chamamos o Express
pelo método JCN, esse método retorna uma função,
uma função de middleware O trabalho dessa função de
middleware é ler a solicitação
e, se houver um objeto JCN
no corpo da solicitação,
ela passará o corpo da
solicitação para um objeto JCN
e, em seguida, dirá
solicitação na propriedade do corpo e, em seguida, dirá
solicitação na propriedade Essencialmente, isso é o que
acontece em tempo de execução. Quando recebemos
solicitações no servidor, essa solicitação
passa por esse pipeline. Chamamos esse pipeline de pipeline de processamento de
solicitações. Nesse pipeline, temos uma ou mais funções de middleware Cada função
de middleware encerra o ciclo de resposta da solicitação retornando um objeto
de resposta ou passará o controle para
outra Portanto, em nossa
implementação atual, o pipeline de processamento de solicitações tem duas funções de middleware A primeira é a função de
middleware que passa o
corpo solicitado para um objeto JCN Agora, nesse caso, ele não encerra o ciclo de resposta da
solicitação Então, ele passa o controle para a segunda função de
middleware, que é, neste caso,
nosso manipulador de rotas Em nosso manipulador de rotas, temos o objeto de solicitação com uma propriedade
body preenchida Então, aqui podemos realizar alguma
operação e, em seguida, encerrar o ciclo
de resposta da solicitação retornando uma resposta
ao cliente Portanto, o Express inclui algumas funções de middleware
integradas. Mas também podemos criar funções de middleware
personalizadas que podemos colocar na frente do
nosso pipeline de processamento de solicitações Portanto, cada solicitação que recebermos
no servidor passará por
nossa função de middleware Com essa função de
middleware personalizada, podemos realizar questões
transversais Por exemplo, podemos fazer registro, autenticação,
autorização e assim por diante. Portanto, o aplicativo Express
nada mais
é do que um monte de funções de
middleware Na próxima palestra,
mostrarei como
criar uma função de
middleware personalizada
4. Criando seu próprio middleware Express: I Então, agora,
deixe-me mostrar como criar uma função de middleware
personalizada Então, aqui na linha cinco, estamos adicionando JS e função de
middleware Depois disso, vamos
chamar o aplicativo que uso. Mais uma vez, chamamos
esse método para instalar uma função de middleware em nosso pipeline de processamento de
solicitações Então, aqui precisamos passar
uma função que recebe uma resposta de solicitação e next, que é uma referência à próxima função de
middleware
no pipeline Então, simplesmente passamos
uma função aqui. Agora, nesta função, vamos
fazer um registro simples do Consol. Vamos imaginar que essa função de
middleware
serve para registrar todas as solicitações Então, realizamos nosso registro
e, em seguida, chamamos Next
para passar o controle para a próxima
função middlewab no pipeline Se você não fizer
isso, porque
não estamos encerrando o ciclo de resposta da
solicitação, nossa solicitação acabará sendo interrompida. Deixe-me mostrar o que acontece. Então, vou
comentar esta linha, salve agora de volta no
Postman nesta guia, vou enviar uma
simples
STTPgtrQuest para salve agora de volta no
Postman nesta guia,
vou enviar uma
simples
STTPgtrQuest para o endpoint do nosso curso. Então, dê uma olhada,
não estamos recebendo uma resposta. Está carregando. Se você
olhar no console, poderá ver nossa mensagem de registro. Isso indica que nossa função de
middleware foi executada Mas como
não passamos o controle para outra função de middleware para
encerrar o ciclo de
resposta da solicitação, nossas solicitações
acabam Também podemos criar outra função de
middleware para realizar Então, vou selecionar
esse código, duplicá-lo
e, na segunda função de
middleware, vou alterar essa
mensagem para Agora, de volta ao Postman, vamos enviar outra solicitação Agora, no terminal, temos duas mensagens,
registrando e autenticando Então, o que eu quero que você preste
atenção aqui é que nossas funções de middleware
são chamadas em sequência Em primeiro lugar, a função de
middleware de registro é chamada e, em
seguida, a função de middleware
para autenticar o usuário E, finalmente, o fim da rota, que é outra função de
middleware Agora, em termos de codificação de tela, quando você deseja criar uma função de middleware
personalizada, você não quer escrever
todo o código dentro do arquivo JS do app dot Você deve colocar cada função de
middleware em um arquivo separado ou em
um módulo separado Então, aqui, vamos criar um novo arquivo chamado logar dot js Agora, de volta ao app dot js, vamos pegar essa função de
middleware aqui, obtê-la e voltar ao
Logger Nós colamos isso aqui. Damos essa função um nome
como lob e, finalmente, exportamos como este
módulo que exporta Definimos isso para essa função. Então esse módulo exporta uma
única função, ok? Agora, de volta ao app dot js, na parte superior, carregamos
nosso novo módulo. Então, corte o ponto final para indicar a
pasta e o registrador atuais Obtemos o resultado e o
armazenamos em um registrador de chamadas constante. E então podemos instalá-lo
chamando o aplicativo que usa e passa
essa função de registrador aqui Agora você entende exatamente
o que essa linha significa. Então, quando chamamos o Express JSN, ele retorna uma função, uma função de middleware que
tem três parâmetros, resposta de
solicitação Essa função de middleware
passa pelo corpo do ponto da solicitação. E se houver um objeto JSON, ele definirá a solicitação no corpo
e, em seguida, passará o controle para a próxima função de middleware Ok, então deixe-me
deletar esse comando. De volta ao App Js. Então é assim que
definimos uma função de
middleware personalizada em um módulo separado Importe-o aqui e
instale-o chamando o
app dot Hughes Poderíamos usar a mesma técnica para a segunda função de
middleware, mas vou deixar isso
para você como um exercício
5. Utilizando o Middleware Express: Na última palestra, você aprendeu como criar middleware
personalizado Mas, como eu disse antes, no Express, temos algumas
funções de middleware integradas Um deles é o middleware
JCN com o
qual você está familiarizado, onde ele passa o
corpo da solicitação E se houver um objeto JCN, ele preencherá a solicitação
na propriedade do corpo Temos outra função de
middleware semelhante chamada
de URL codificada Então, deixe-me duplicar essa linha. Aqui temos o URL de
ponto expresso codificado. Novamente, esse é um
método
que chamamos e o resultado é
uma função de middleware Essa função de middleware analisa a solicitação
recebida com Esse é um pedido
com um corpo como este. Portanto, temos uma chave definida como valor
e outra chave definida como valor. Agora, essa é uma abordagem mais
tradicional. Não é algo que
usamos com tanta frequência nos dias de hoje. Basicamente, se você tiver
um formulário HTML com campos de
entrada e postar
esse formulário no servidor, o corpo da sua solicitação
ficará assim. Está bem? Então é
aí que você tem uma carga útil
codificada por URL no
corpo da sua solicitação Agora, esse middleware
passa por esse corpo e
preenche o corpo do ponto de solicitação como um objeto
JCN Deixe-me mostrar como isso funciona. Então, de volta ao Postman, vamos enviar uma solicitação de postagem para a porta 3.000 APISORE do sistema operacional
local Ok, então anteriormente ele passava o
objeto JSON no corpo, então eu disse para você selecionar
um JSON aqui e depois No entanto, nesta demonstração, usaremos o URL do
formulário codificado aqui Portanto, agora podemos passar pares de
valores-chave no corpo da solicitação e eles serão concatenados quando essa solicitação for
enviada ao servidor Então, a chave que vou
definir é nome e o valor é Mc poros SN Agora você pode ver que
criamos com sucesso um novo curso
no servidor. Portanto, nossa
função de middleware foi capaz de ler nossa solicitação com carga útil
codificada em URL Agora, se você olhar no
terminal, verá esse aviso. O parceiro corporal
obsoleto, indefinido, estendido fornece uma opção estendida . Portanto, esse aviso está
nos dizendo que devemos passar um objeto aqui e
definir extended como true. Com isso, podemos passar matrizes em objetos
complexos usando o formato codificado de
URL. Está bem? Agora, finalmente, o último
middleware embutido que temos no
Express é estático e o usamos para
servir arquivos estáticos Então, deixe-me mostrar
como isso funciona. App U express dot static. Agora, aqui passamos um argumento, e esse é o nome da pasta. Nesse caso, vou
usar uma pasta chamada Public. Então, vamos colocar todos os
nossos ativos estáticos, como imagens
CSS e assim por diante,
dentro dessa pasta. Então, vamos criar
essa pasta aqui. Público por enquanto, vou apenas adicionar um arquivo de texto
simples aqui. Leia-me o texto com pontos. E este é um Read Me five. OK. Agora, com essa função de
middleware, podemos voltar ao
navegador e acessar a porta 3.000 SlashRdMDT tex do
Localhost Então, com esse middleware,
podemos servir conteúdo atérico. E observe que aqui não
temos público na URL, então nosso conteúdo
estérico é veiculado a partir da
raiz do site Na próxima palestra,
veremos o middleware de
terceiros
6. Aprimorando o Express com middleware de terceiros: Nesta palestra,
apresentarei alguns
middlewares de terceiros que temos Então acesse
exprejs.com na parte superior. Em recursos, você
pode encontrar Middleware. Mas esses são os middlewares de
terceiros que você pode usar em
seus aplicativos Mas isso não significa que você deva usar todas as funções de
middleware
aqui, pois cada função de
middleware afetará o desempenho
do seu aplicativo Se você não precisa da
funcionalidade que vem com uma
função de middleware, não a use Isso só vai retardar o processamento da
sua solicitação. Portanto, dedique algum tempo, uma olhada rápida
nesta documentação e veja o que está disponível
para você, caso precise. Agora, nesta lista, o
middleware
considerado a melhor
prática é considerado a melhor
prática é Portanto, ele ajuda você a proteger
seu aplicativo definindo vários erros de SCDP. Então, vamos dar uma olhada rápida aqui. Basicamente, tudo o
que precisamos fazer é carregar esse módulo de capacete usando a função
import ou require O que temos aqui é uma função. Então, chamamos isso e isso
retorna uma função de middleware, e então vamos usá-la.
Isso é tudo que temos que fazer. Se você quiser entender melhor o que o capacete faz sob o capô, você realmente precisa consultar
a documentação, pois isso está
além do escopo deste curso Então, de volta ao terminal,
vamos instalar o capacete. Agora, aqui em nosso
módulo de aplicativo na parte superior,
carregamos o capacete, obtemos o resultado e o armazenamos em
uma constante chamada capacete Essa é a função.
Então, vamos chamar isso e passá-lo para o método
app dot use. Então, capacete como esse. O outro
middleware de terceiros que você pode achar útil é Usamos Morgan para registrar o SDDPRquest. Deixe-me mostrar como isso funciona. Então, mais uma vez, o NPM
instala o Morgan. Agora, aqui na
parte superior do arquivo, carregamos o Morgan usando
a função necessária. Muito simples. E,
finalmente, use-o assim. Então Morgan é uma função, e aqui você pode especificar
vários formatos. Vou usar o
mais simples que é pequeno. Novamente, você precisa consultar
a documentação para ver as várias opções
que estão disponíveis para você. Agora, de volta ao terminal, vamos executar o aplicativo
com o Morgan instalado. Toda vez que enviamos uma solicitação
ao servidor, ela será bloqueada. Então, aqui, vou enviar uma simples solicitação de obtenção para o endpoint do
nosso curso Agora olhe no terminal,
Morgan bloqueou nossa solicitação STTP, e esse é um formato pequeno É muito, muito simples. Então, enviamos uma
solicitação GTP get para esse endpoint, o resultado foi um código de status de 200, o que significa sucesso E esse é o tempo necessário
para responder a essa solicitação. Se você quiser mais detalhes, defina um formato diferente
e, a propósito, por padrão, Morgan bloqueou a
solicitação no console. Mas você também pode configurá-lo, gravá-lo em um arquivo de log. Novamente, lembre-se de que, ao
ativar esse recurso, ele afetará seu pipeline
de processamento de solicitações. Então, talvez você não queira
fazer isso na produção, ou talvez queira habilitar isso somente em determinadas situações. Por exemplo, você pode ter um arquivo de configuração ao implantar esse aplicativo
na produção. Em determinadas situações,
você pode ativá-la por um curto período de tempo
e depois desativá-la. Na próxima palestra,
mostrarei como trabalhar com diferentes ambientes, como desenvolvimento, teste
e produção
7. Configurando o Express para diferentes ambientes: Em um aplicativo mais complexo ou
corporativo, você precisa saber em
qual ambiente seu código está sendo executado. Esse é um
ambiente de desenvolvimento ou um ambiente de produção. Talvez você
queira ativar ou desativar determinados recursos com base no
ambiente atual. Por exemplo, vamos
imaginar que temos que habilitar o registro da solicitação do GDP somente no
ambiente de desenvolvimento, em uma máquina de desenvolvimento,
mas não na produção. Então, deixe-me mostrar
como fazer isso. Anteriormente, você aprendeu sobre
esse objeto de processo. Esse é um objeto global no nó que nos dá acesso
ao processo atual. Esse objeto de processo tem
uma propriedade chamada N, que nos fornece as variáveis de
ambiente. Agora temos uma variável de
ambiente padrão chamada node underline N, e essa
variável de ambiente retorna o ambiente para
esse aplicativo de nó Se não estiver definido aqui, ficaremos indefinidos Como alternativa, podemos definir
isso do lado de fora. Podemos definir isso para
desenvolvimento, teste, preparação ou produção Então, para esta demonstração, vamos
registrar isso no console. Então, registro de pontos do console. Vou usar o caractere de
crase
para definir uma string de modelo Node underline N.
Sinal de dólar, collie braces, e aqui está nosso processo N, node underline N. Agora temos outra maneira de obter
o ambiente atual, que é por meio Portanto, esse objeto de aplicativo
tem um método chamado get que usamos para obter várias configurações sobre
esse aplicativo. Agora, uma das configurações é N. Esse método usa internamente a variável de ambiente para detectar o ambiente atual No entanto, se essa
variável de ambiente não for definida, isso retornará
o desenvolvimento por padrão. Deixe-me mostrar como isso funciona. Então, o log de pontos do console, B tack the label is app E aqui adicionamos o cifrão
com Colbass e, em seguida, aplicamos dot gat de N. Agora, volta ao terminal, olha, nossa variável de ambiente
não está definida, então isso é indefinido Mas o app dot gat está retornando
o desenvolvimento por padrão. Está bem? Isso é uma diferença. Agora, qual abordagem escolher é puramente sua preferência pessoal Agora, nesta demonstração,
queremos habilitar o registro do SDDPRquest somente em uma Então, podemos escrever um código como esse. Se o aplicativo não começar com o desenvolvimento, então vamos
habilitar o Morgan. E também para abraçar. Quero exibir
algo no console. Então Morgan habilitou, ok? Agora, vamos excluir
essas duas linhas. Não precisamos mais deles. De volta ao terminal porque esta é minha máquina de desenvolvimento, você pode ver que Morgan está habilitado. Vamos interromper esse processo, definir a
variável de ambiente para produção, executar o aplicativo novamente
e, em seguida, você verá que o
Morgan não será ativado. Portanto, pare esse processo com
Control e C. Definimos nossa variável de ambiente usando Exportar no Mac ou configuramos no Windows ao
usar o Prompt de Comando. E dólar ao
usar o Power Shell. Então, node underline,
configuramos isso para produção. Agora, vamos executar o
aplicativo mais uma vez. Então, nenhum aplicativo de modificação Ok, olha, só recebemos essa mensagem
ouvindo na porta 3.000 Não temos o Morgan Enable. Então, é assim que você pode saber se seu código está sendo
executado em uma máquina de desenvolvimento, teste, teste ou
produção
8. Técnicas de configuração avançadas: Então, na última palestra,
você aprende como detectar o ambiente no qual
seu aplicativo está sendo executado Um tópico que anda de mãos
dadas com os ambientes
é o tópico de armazenar as
configurações
do aplicativo e substituí-las
em cada ambiente Por exemplo, em seu ambiente de
desenvolvimento, você
usará um
banco de dados ou servidor de e-mail diferente . Nesta palestra, mostrarei
como armazenar as
configurações
do seu aplicativo e substituí-las em
cada ambiente Agora, existem vários pacotes de
nós disponíveis para gerenciar a
configuração. O mais popular é o RC. Agora, se você
pesquisar npmrcrnpms.com, pacote RC para que possamos
ver que esse pacote foi o
pacote RC para que possamos
ver que esse pacote foi baixado mais de 13 milhões de vezes por semana. É um pacote muito popular. Mas minha preferência pessoal é outro pacote que não
é tão popular, embora tenha um design muito
limpo e elegante e seja muito fácil de usar. Então, procure o NPM Config novamente,
aqui npmjs.com, aqui npmjs.com Portanto, esse pacote
foi baixado mais de 1 milhão de vezes por semana, mas tem uma comunidade muito
ativa. Então, de volta ao terminal, vamos instalar o módulo de configuração Linda. Agora,
de volta ao projeto aqui, vamos criar uma pasta
chamada Config Nessa pasta, podemos ter um arquivo de configuração
padrão. Então, vamos adicionar um novo arquivo
chamado AJCN padrão. Então, aqui podemos ter um objeto JCN para definir as
configurações padrão Por exemplo, vamos ter uma
configuração aqui chamada Nome. Esse é o nome do
nosso aplicativo. Agora, de volta à pasta
de configuração, vamos adicionar outro arquivo, o ponto de
desenvolvimento Gs. Nesse arquivo, podemos definir a configuração específica para o ambiente de
desenvolvimento. Como parte disso, podemos substituir as configurações que
definimos no GSN padrão Também podemos adicionar configurações
adicionais. Então, aqui eu posso mudar o nome. Posso substituí-lo dizendo que, desenvolvimento do
meu aplicativo Express também
podemos adicionar
propriedades adicionais aqui, e essas propriedades
também podem ser objetos complexos Por exemplo, podemos ter
uma propriedade chamada mail, onde armazenamos informações
sobre nosso servidor de e-mail. Então, aqui podemos ter um post, e vamos configurá-lo para ser
desenvolvido no servidor de e-mail. Da mesma forma, podemos criar outro
arquivo de configuração chamado production. Então, ponto de produção JSON agora vou voltar
ao desenvolvimento ou ao JSN, copiar tudo isso, colar
na produção
e alterar o nome
do aplicativo, e alterar o nome
do aplicativo bem
como o endereço do servidor
de e-mail Então, servidor de correio Rod. Portanto, com esse pacote de nós, você pode ver facilmente a configuração
padrão , bem
como a configuração
de cada ambiente. Isso lhe dá uma estrutura muito
limpa. Agora, de volta ao
ponto JS do nosso aplicativo na parte superior, carregamos o módulo de configuração E armazene-o em uma
constante chamada config. E com isso, podemos facilmente obter várias economias para
nosso aplicativo. Então, vamos dar uma olhada em alguns exemplos. Configuração. Vou fazer um nome de
aplicativo de log de pontos do console. Agora, aqui podemos usar
uma string de modelo. Isso realmente não importa. A maneira como usamos esse
objeto de configuração é assim. Portanto, ele tem um método
e, aqui, como argumento, especificamos o nome de uma propriedade de
configuração. Então, nome. Agora, vamos
duplicar isso A outra propriedade que eu quero
exibir é o servidor de e-mail. Para isso, precisamos
acessar a configuração aqui, host, que faz parte do e-mail. A forma como fazemos isso é usando a notação de pontos da mesma
forma que acessamos
as propriedades de um objeto Então você quer obter um host de e-mail. Está bem? Agora, de volta ao terminal, vou colocar essa máquina no ambiente de desenvolvimento. Então, o dólar e o
nó da coluna sublinham N. Nós
configuramos isso para desenvolvimento e
, em seguida, executamos nosso aplicativo Assim, você pode ver que o nome do
aplicativo está definido como My Express
app development. Essa configuração vem do
nosso ponto de desenvolvimento JCNFle. Da mesma forma, nosso
servidor de e-mail é o Dave Mail Sour. Está bem? Agora, se mudarmos o
ambiente para produção, veremos valores
diferentes. Então, dólar e coluna,
nó sublinhado N, configuramos isso para produção e executamos o aplicativo mais
uma vez Olha, desta vez nosso
servidor de e-mail é Prod mail Sur. Portanto, com esse pacote de notas, você pode armazenar facilmente as configurações do
seu aplicativo. No entanto, você não deve armazenar os segredos do aplicativo
nesses arquivos de configuração. Por exemplo, você não
deve armazenar a senha do seu banco de dados ou seu servidor de e-mail
porque quando você faz check-in
do código-fonte em um repositório, essa senha ou
segredo fica visível para qualquer pessoa que tenha acesso a esse repositório de controle de
origem Na verdade, uma
das empresas financeiras famosas dos EUA foi
invadida porque
alguém inseriu
uma senha no repositório de
controle de origem Então, a forma como lidamos
com esses segredos é armazenando-os em variáveis de
ambiente. Deixe-me mostrar como isso funciona. Então, de volta ao terminal,
vamos definir uma variável de ambiente para armazenar a senha
de um servidor de e-mail. Então, senha em dólar e coluna, nós a definimos como um,
dois, três, quatro. Agora, para evitar que essa variável
de
ambiente conflito com outra variável de
ambiente, é melhor
prefixá-la
com o nome do
nosso aplicativo Nesta demonstração, digamos que o nome do nosso
aplicativo seja app. Então, adicionamos o
sublinhado do aplicativo como prefixo. OK. Portanto, no
ambiente de desenvolvimento, definimos manualmente essa variável de
ambiente. E também no
ambiente de produção, provavelmente
teremos um painel de configuração para armazenar nossas variáveis de
ambiente. Então, armazenamos todas essas
senhas e segredos em nossas variáveis de ambiente e
as lemos usando
nosso módulo de configuração Agora, de volta ao projeto
na pasta de configuração, precisamos adicionar outro arquivo chamado variáveis de
ambiente personalizadas. Certifique-se de soletrar corretamente. O nome desse arquivo
é muito importante. Então,
variáveis de ambiente personalizadas, TSN. E nesse arquivo,
definimos o mapeamento das configurações
para as variáveis de ambiente. Então, vou entrar em nosso arquivo TSN de
desenvolvimento copiar tudo isso para
esse novo arquivo Agora, digamos que aqui para a propriedade
masculina dentro dela, teremos uma
propriedade chamada senha. OK. Agora, queremos mapear isso para a variável de ambiente
que criamos que era a
senha subjacente do aplicativo, ok? Agora não precisamos
hospedar porque
não vamos mapear isso para
uma variável de ambiente. O valor é definido em um
dos nossos arquivos de configuração
e, por esse mesmo motivo, não
precisamos de nome. Portanto, neste arquivo, variáveis de
ambiente personalizadas, temos apenas o mapeamento, o mapeamento de nossas
configurações para variáveis de ambiente. Agora, de volta ao app dot s, vamos duplicar essa linha e exibir a senha
do servidor de e-mail Então, envie a senha por e-mail, e nós a obtemos da propriedade de senha
masculina. Portanto, esse
objeto configurado examina várias fontes para encontrar um
valor para essa configuração. A fonte pode ser um
arquivo de configuração, um arquivo adjacente. Ela pode ser uma variável de
ambiente. Também pode ser um argumento de linha de
comando. Para isso, você mesmo precisa consultar
a documentação. Agora, de volta ao terminal,
vamos executar o aplicativo. Ok, olha, nossa
senha masculina é 1234. E isso foi lido de
uma variável de ambiente, não de um arquivo de configuração. Novamente, esse pacote de conflito tem muitos recursos úteis, e deixo que você leia
a documentação e aprenda
mais sobre esse pacote.
9. Solução de problemas e depuração de aplicativos Express: Anteriormente nesta seção, escrevemos esse código para ver se estamos no ambiente de
desenvolvimento. Se nós, Morgan, registrarmos o STDPRquest e
também registrarmos essa mensagem
no console Portanto, esse log de pontos do console é o amigo
mais antigo do programador de JavaScript Nós o usamos o
tempo todo para depuração. O problema com essa
abordagem, no entanto, é que, às vezes, quando
terminamos de usá-las, as
excluímos ou as
comentamos. Às vezes, mais tarde,
podemos precisar deles. Então, temos que escrever o código
novamente ou remover o comando. Essa abordagem é muito tediosa. A melhor maneira de registrar
mensagens para fins de
depuração é usar o pacote de depuração no nó com o Tbug Vamos substituir todas essas instruções
de log de
pontos do console uma chamada para uma função de depuração
e, em seguida, podemos
usar uma
variável de ambiente para ativar
ou desativar a depuração Dessa forma, não
precisamos voltar
ao nosso código e modificá-lo. Não precisamos
excluir essas instruções de
log ou de depuração do console log ou de depuração Não precisamos
elogiá-los. Podemos controlá-los
externamente usando uma variável de ambiente. Mas, o mais importante, também
podemos determinar o nível de
informações de depuração que queremos ver Talvez em algum momento estejamos trabalhando
em um problema de banco de dados. Talvez queiramos ver apenas essas informações de
depuração
relacionadas ao banco de dados Você não precisa
voltar ao código e modificar todas essas instruções
consoladas ou de log Então, deixe-me mostrar como
usar o pacote de depuração. De volta ao terminal,
vamos instalar o debug. Linda. Agora, voltando ao nosso módulo de
aplicativo na parte superior, vamos desacelerar o módulo de depuração Essa função necessária
aqui retorna a função. Então, chamamos essa função
e damos a ela um argumento. E esse argumento é um namespace arbitrário que
definimos para depuração Por exemplo, podemos definir um
namespace, como inicialização do aplicativo. Agora, quando chamamos essa
função com esse argumento, obtemos uma função para escrever mensagens de
depuração
nesse Então, vamos chamar essa
função de depurador de inicialização. Potencialmente, podemos
ter outro depurador
para depurar para depurar Então, mais uma vez, carregamos
esse módulo de depuração. Recebemos uma função.
Chamamos essa função, atribuímos a ela um namespace como app DB, e isso retornará
uma função de depuração Então, nós o pegamos e o
armazenamos no depurador de banco de dados. Está bem? Vamos substituir essa instrução de
log de pontos do console uma chamada para iniciar a função de
depuração Então, um depurador de inicialização como esse. Agora, potencialmente
em algum lugar do aplicativo, podemos fazer com que o banco de dados funcione
e, aí, talvez precisemos escrever algumas
informações de depuração para que possamos usar nossa outra Então, depurador de banco de dados, conectado ao banco de dados,
algo parecido Agora vamos voltar
ao terminal e usar uma variável de
ambiente para determinar que tipo de informação de depuração
queremos ver no console Então, aqui definimos uma
variável de ambiente chamada Ebub. Definimos isso para a inicialização do aplicativo. Isso significa que, com essa linha, veremos apenas
as mensagens de depuração que fazem parte desse namespace Inicialização do aplicativo. Agora, se você
executar o aplicativo, olha, temos a inicialização do aplicativo
e aqui está nossa mensagem. Agora, da próxima vez que eu executar
esse aplicativo, talvez eu não queira ver
nenhuma informação de depuração, que possamos redefinir essa
variável de ambiente Execute o aplicativo novamente. Olha, não vemos mais
essa mensagem de depuração, ou talvez queiramos ver mensagens de
depuração para depuração Assim, podemos definir nossa variável de
ambiente inicialização do
aplicativo, vírgula appNTV Com isso, veremos
as mensagens de depuração nesses dois Ou, se você quiser ver todas
as mensagens
de depuração espaço de nomes do nosso aplicativo, podemos usar Dessa forma, não precisamos
repetir cada um
deles individualmente. Agora, quando executamos o aplicativo, olhe, vemos as mensagens
em diferentes espaços de nomes. Então, inicialização do aplicativo e DV do aplicativo. E o melhor desse módulo
de depuração é que ele
codifica por cores o espaço de nomes, para que possamos distinguir facilmente
várias mensagens de depuração Não entendemos isso com o Console nem
com o Talk. E uma última coisa
nesta demonstração em particular, criei duas
funções de depuração, startup e DVTBugger Em cenários do mundo real, talvez
você não precise necessariamente várias funções de depuração
no mesmo arquivo ou
no Se for esse o caso, você
pode simplificar seu código
alterando o nome dessa função do
depurador para debug Por exemplo, neste arquivo, digamos que não temos
nenhum banco de dados funcionando. Então, vou deletar isso. Só queremos escrever mensagens de
depuração sobre a inicialização
do aplicativo Então, vamos excluir essa função
TB Tbugger. Agora podemos renomear essa função de depurador de inicialização para
depurar Então, olha, isso é
mais curto do que o registro de pontos do console de pilotagem e nos dá muito
mais poder e controle sobre a quantidade de
informações de depuração que queremos Portanto, prefira o módulo de depuração às instruções de log de pontos
do console.
10. Visualizações dinâmicas com motores de modelagem: Em todos os endpoints
que implementamos até agora, retornamos objetos GSN
na resposta Às vezes, no entanto, você precisa
retornar a marcação HTMR para o pino, e é aí que você usa
um mecanismo de modelagem Existem vários mecanismos de
modelagem disponíveis para
aplicações expressas. Os mais populares são o PAG, que costumava ser chamado de JD Você também tem Mustach e EGS. Cada mecanismo de modelagem tem
uma sintaxe diferente para gerar HTML dinâmico e
devolvê-lo ao cliente Jogue esta demonstração, vou
mostrar como usar o PAC que gera um HTML dinâmico e o retorna ao cliente Então, primeiro, vamos instalar o PAC. Linda. Agora,
de volta ao nosso módulo de aplicativo, precisamos definir o
mecanismo de visualização do aplicativo. Então, chamamos app dot set. O nome da
propriedade que precisamos
definir é view space engine, e o nome do nosso mecanismo de visualização
ou mecanismo de modelagem é PAC Então, quando definirmos isso, o Express carregará internamente esse módulo, então não precisamos exigi-lo Ok, agora,
há outra configuração que não é obrigatória É opcional, somente se você quiser substituir o caminho
para seus modelos Então, no aplicativo desse conjunto, o nome da
propriedade é views e o valor é a parte
em que armazenamos os modelos. Portanto, o valor padrão
é visualizações de período. Isso significa que você deve
colocar todas as suas visualizações ou todos os seus modelos dentro de
uma pasta chamada views, que deve estar na
raiz do aplicativo. Novamente, essa é uma configuração ideal. Esse é o valor padrão, então não precisamos definir isso. Agora, vamos adicionar uma nova
pasta aqui, visualizações. Dentro dessa pasta,
vamos adicionar um novo arquivo. Podemos chamar esse ponto de índice de Pug. Com o PAG, podemos definir nosso modelo usando
uma sintaxe como essa Então, podemos ter um elemento HTML. Então, dentro disso,
podemos ter head, e então podemos ter o elemento
title e
podemos definir um valor para isso
dinamicamente usando a sintaxe Então, adicionamos um sinal de igual e , em seguida, o nome de uma variável que
definiremos em tempo de execução. Eu vou te mostrar como
isso funciona mais tarde. Agora, paralelamente à cabeça, queremos ter outro
elemento chamado corpo. E dentro disso,
queremos ter um H. E queremos ver
o valor disso dinamicamente usando uma
variável chamada message Você vê o bug como uma
sintaxe mais limpa do que o STMO normal. Não temos esses elementos de abertura
e fechamento. Claro, algumas pessoas
adoram, outras odeiam. Mas, tirando isso,
vamos ver como podemos converter isso em um STMO normal e devolvê-lo ao cliente Então, de volta ao nosso módulo de aplicativo, definimos
anteriormente uma rota para a raiz do aplicativo. Então, aqui enviamos uma
mensagem simples para o cliente. Olá. No momento,
queremos substituí-la por uma marcação HTML e
devolvê-la ao cliente Então, em vez do
método send, usamos render. Então, o ponto de resposta é renderizado. Agora, como primeiro argumento, especificamos o nome da nossa visão. Nesse caso, indexe porque o nome do nosso
arquivo é index dot pug Como segundo argumento,
passamos um objeto, e esse objeto inclui
todos os valores dos parâmetros que
definimos em nosso modelo, como título e mensagem. Então, aqui vou
definir duas propriedades aplicativo
Title My Express
e a mensagem Hello. Isso é tudo o que temos
que fazer. Então, agora vamos iniciar o aplicativo
novamente e ir
para o host local por 3.000 Olha, nós temos a marcação de ML. Podemos verificar isso
examinando a fonte
desse discurso. O que você vê aqui é
nosso modelo Puck convertido em HTML padrão Portanto, temos o título principal em HTML. Esse valor é inserido
dinamicamente em tempo de execução
e, ao lado
dele, temos By E dentro disso, temos
esse elemento H um. Portanto, se você quiser retornar a marcação
TML para a moeda, use um
mecanismo de visualização Novamente, existem vários
mecanismos de visualização disponíveis, como Pug,
EJS, MastaC e Mas quando você está criando serviços
RESTful para o back-end de seus aplicativos
cliente, você realmente não
precisa de um mecanismo de visualização
ou de um mecanismo de modelagem Acabei de abordar esse
tópico porque
queria que meu curso
de nodos fosse abrangente. Em seguida, falarei
sobre dados como integração.
11. Integrando bancos de dados com Express.js: Tudo bem, vamos para a integração do
banco de dados. Na verdade, temos
uma seção separada sobre esse tópico, na qual
ensinarei detalhadamente como trabalhar com um banco de dados MongoDB. Mas nesta palestra,
quero apenas destacar quais são
as várias opções de
integração de banco de dados disponíveis para
você ao usar o Node e o Express Portanto, no site do Express, se você acessar o guia e,
em
seguida, a integração do banco de dados, nesta página, poderá ver vários drivers de banco disponíveis para você usar. Você pode usar Cassandra,
Out Base, CQL, Bango,
Oracle, Redis, quel Sur, Elastic Portanto, há várias
opções disponíveis aqui. Para cada um deles, você
pode ver alguns exemplos de código. Então, vamos dar uma olhada no MongoDB. Basicamente, o que
você precisa fazer é instalar o driver
para trabalhar com o Mongo Então, o NPM instala o MongoDB
e, em seguida, você o carrega usando
a função necessária Em seguida, você obterá uma
API simples para se conectar ao Mongo
e, em seguida, poderá acessar
várias coleções e assim por diante Trabalhar com outros
bancos de dados é o mesmo. Instalamos um driver
e, em seguida, você pode obter um módulo com uma API simples. Agora, no caso do
mango, especificamente, existe outro pacote chamado mongoose,
que é construído em cima do mango,
encontrado em cima desse Usamos o mongoose porque ele nos
fornece uma API mais simples. Novamente, mais adiante neste curso, teremos uma seção
abrangente sobre como trabalhar com
mongo e
12. Protegendo aplicativos Express com autenticação: Até agora, abordamos
muitas coisas sobre o Express. Mas e quanto à autenticação? Bem, a autenticação
está fora
do escopo do
Express porque o Express é uma estrutura mínima e
leve e não tem uma opinião
sobre autenticação. Então, mais tarde no curso, teremos uma seção
abrangente sobre autenticação
e autorização. Então, mostrarei como
proteger sua API e seus pontos.
13. Melhores práticas para estruturar aplicativos Express: Portanto, este é um código que
escrevemos em app dot Js ao longo
desta seção. Se você olhar aqui, temos um arquivo muito fraco com
92 linhas de código, e esse é um aplicativo muito
simples. No aplicativo do mundo real, você não quer escrever todo
esse código dentro do app dot JS. Então, nesta palestra,
vou
mostrar como
estruturar adequadamente seu aplicativo A primeira coisa
que queremos fazer é retirar todo o código
dessa API de cursos e
colocá-lo em um arquivo separado. Em outras palavras, para cada parte lógica
do nosso aplicativo, para cada endpoint da API, queremos ter um
arquivo separado ou um módulo separado Portanto, todas as rotas
para trabalhar com cursos estariam
em cursos com pontos JS, e todas as rotas
para trabalhar com,
digamos, autores deveriam
estar em autores com pontos Gs. Quando estiver na raiz do projeto, vamos criar uma nova
pasta, chamá-la de rotas. Aqui tivemos um novo
arquivo courses dot js. Agora, de volta ao app dot js, vamos selecionar todo o código
para trabalhar com cursos. Agora, reduza os
cursos e cole aqui. Agora, de volta ao aplicativo dot js. Você pode ver aqui que temos
apenas 36 linhas. Mas primeiro, vamos terminar de
refatorar as rotas dos cursos. Então, vamos cortar essa linha e voltar aos cursos com o
ponto JS na parte superior. Aqui, primeiro, precisamos
carregar o Express. Então, o Constant Express,
exigimos que seja assim. Sem AppGs, chamamos de
Express como função. E temos um objeto de aplicativo, certo? Mas essa abordagem não funciona quando você separa a rota
em um módulo separado. Então, aqui precisamos usar um roteador. Portanto, esse expresso tem
um método chamado roteador que retorna o objeto
roteador. Agora, aqui, vou renomear esse aplicativo para roteador para maior clareza Então pressione F dois Roteadores. Então, a diferença é que
neste módulo no módulo de cursos, em vez de trabalhar
com o objeto app, trabalhamos com o objeto roteador. Está bem? Agora, finalmente,
no final deste módulo, exportamos esse roteador. Então, o módulo que exporta, nós o configuramos para esse roteador. Então, em resumo, colocamos
o roteador na parte superior, adicionamos rotas a ele
e, finalmente, exportamos o roteador no final do módulo. Está bem? Agora, precisamos carregar
esse módulo de cursos
dentro do módulo do aplicativo. Então, de volta ao App dogs aqui, vamos carregar o módulo de cursos. Portanto, exija cursos de rotas de
pastas atuais. Agora, pegamos isso e o
armazenamos em uma constante chamada cursos. E, finalmente, depois de
carregarmos esse módulo, precisamos chamar o aplicativo que use. Aqui, precisamos
fornecer dois argumentos. O primeiro argumento é um caminho, então corte os cursos de APS E o segundo argumento é nosso objeto de roteador que
importamos. Isso são cursos. Basicamente, estamos
dizendo ao Express que, para qualquer rota que comece
com cursos AP, use esse roteador, o roteador que carregamos
do módulo de cursos. E com isso, podemos voltar ao nosso módulo de cursos e tornar nossas rotas um
pouco mais curtas. Então, voltando ao
módulo de cursos na parte superior, veja que cada rota aqui tem
essa parte de cursos de API. Não queremos repetir isso todos os lugares porque
no app dot JS, dissemos ao Express que qualquer
rota que comece com slash da API slash
deve ser gerenciada por
esse roteador de cursos deve ser gerenciada por
esse Então, de volta ao módulo de cursos, podemos nos livrar de todos
esses cursos de API. Portanto, para a primeira rota, que é para obter todos os cursos, nossa rota mudará
para apenas slash O mesmo vale para a segunda rota. Para a terceira rota,
temos um parâmetro. Portanto, adicionaremos apenas o ID da coluna. Da mesma forma, para a rota de exclusão, precisamos apenas de ID. E, finalmente, o mesmo
para a última rota aqui. Então você pode ver que nossas rotas
são muito mais simples agora. Agora, de volta ao aplicativo dot Js. Agora, aqui está um
exercício simples para você. Quero que você refatore
essa rota até a praia e a
coloque em um arquivo separado Então, pause o vídeo,
faça este exercício e depois você pode
voltar e continuar assistindo Tudo bem, então aqui está
o que precisamos fazer. Aqui na pasta route, vou adicionar um novo arquivo. Vamos chamar isso de home dot
js para SreeLaDepress. Portanto, exija o Express. Em seguida, pegamos um roteador. Portanto, o roteador é o roteador Express. Agora, de volta ao app dot JS, recortamos essa rota
e colamos aqui. Mas em vez do aplicativo, nós o conectamos a esse roteador. E, finalmente,
exportamos o roteador. Então, o módulo dot Exports, nós o configuramos para este roteador. E, finalmente, voltamos ao app dot JS e carregamos
esse novo módulo. Então, no topo, foi aqui que
carregamos nosso módulo de cursos. Vamos carregar o módulo doméstico. Então, exija casa. Finalmente, aqui onde estamos
adicionando o middleware, chamamos o aplicativo que usa, digamos, para qualquer caminho que comece com
barra, use o Tudo bem Agora, se você
olhar o app dot JS, tudo o que temos aqui é simplesmente o código de inicialização do
nosso aplicativo. Agora, uma última coisa antes de
terminarmos esta palestra. Então, anteriormente, criamos
esse middleware de logger. Nós a colocamos em um módulo
separado e
exportamos essa função no
final desse módulo, certo? Agora, em termos de estruturação de
seu aplicativo, é possível que você
tenha várias funções de
middleware Portanto, é melhor colocá-los todos em uma pasta chamada middleware Então, aqui na raiz
do aplicativo, criamos outra pasta chamada middleware e movemos esse
logger para dentro dessa Uau, e isso também
significa que devemos
acessar o aplicativo ou Js na parte superior, onde
carregamos esse middleware, devemos mudar o caminho
para o