O curso Express. js - Módulo 5: Express avançado | Shivendra Raghuvanshi | Skillshare
Pesquisar

Velocidade de reprodução


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

O curso Express. js - Módulo 5: Express avançado

teacher avatar Shivendra Raghuvanshi, Lead Developer and Online Teacher

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Aulas neste curso

    • 1.

      Introdução do curso

      2:34

    • 2.

      Mergulhando em técnicas avançadas de Express

      0:33

    • 3.

      Magia do middleware no Express.js

      2:57

    • 4.

      Criando seu próprio middleware Express

      4:16

    • 5.

      Utilizando o Middleware Express

      3:58

    • 6.

      Aprimorando o Express com middleware de terceiros

      4:17

    • 7.

      Configurando o Express para diferentes ambientes

      4:17

    • 8.

      Técnicas de configuração avançadas

      9:18

    • 9.

      Solução de problemas e depuração de aplicativos Express

      6:02

    • 10.

      Visualizações dinâmicas com motores de modelagem

      5:04

    • 11.

      Integrando bancos de dados com Express.js

      1:58

    • 12.

      Protegendo aplicativos Express com autenticação

      0:36

    • 13.

      Melhores práticas para estruturar aplicativos Express

      7:35

  • --
  • Nível iniciante
  • Nível intermediário
  • Nível avançado
  • Todos os níveis

Gerado pela comunidade

O nível é determinado pela opinião da maioria dos estudantes que avaliaram este curso. Mostramos a recomendação do professor até que sejam coletadas as respostas de pelo menos 5 estudantes.

5

Estudantes

--

Projeto

Sobre este curso

Bem-vindo ao módulo 5: Advanced Express! Neste módulo, vamos explorar as poderosas características do Express.js que vão além do básico, permitindo que você crie aplicativos dinâmicos, flexíveis e prontos para produção.

Você vai começar dominando o middleware, uma pedra angular do Express.js que permite que você manipule tudo, desde o registro até o tratamento de erros. Aprenda como criar middleware personalizado, usar opções integradas e aprimorar seu aplicativo com middleware de terceiros.

Em seguida, mergulharemos em configurações avançadas, técnicas de depuração e integração do Express com bancos de dados para serviços de backend robustos. Você também vai trabalhar com mecanismos de modelagem para criar visualizações dinâmicas e aprender as melhores práticas para estruturar seus aplicativos Express como um profissional.

Ao final deste módulo, você terá uma compreensão profunda do Express.js e estará pronto para enfrentar projetos complexos com confiança.

Conheça seu professor

Teacher Profile Image

Shivendra Raghuvanshi

Lead Developer and Online Teacher

Professor
Level: All Levels

Nota do curso

As expectativas foram atingidas?
    Superou!
  • 0%
  • Sim
  • 0%
  • Um pouco
  • 0%
  • Não
  • 0%

Por que fazer parte da Skillshare?

Faça cursos premiados Skillshare Original

Cada curso possui aulas curtas e projetos práticos

Sua assinatura apoia os professores da Skillshare

Aprenda em qualquer lugar

Faça cursos em qualquer lugar com o aplicativo da Skillshare. Assista no avião, no metrô ou em qualquer lugar que funcione melhor para você, por streaming ou download.

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