Construir clone de Trello Fullstack: WebSocket, Socket IO | Oleksandr Kocherhin | Skillshare

Velocidade de reprodução


1.0x


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

Construir clone de Trello Fullstack: WebSocket, Socket IO

teacher avatar Oleksandr Kocherhin

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.

      Apresentação

      1:25

    • 2.

      Quais tecnologias usamos

      3:33

    • 3.

      Recursos para download

      0:40

    • 4.

      Como instalar nó e angular

      8:09

    • 5.

      Como configurar servidor

      5:05

    • 6.

      Como instalar banco de dados

      7:27

    • 7.

      Você usa um bom editor?

      2:19

    • 8.

      Como configurar soquete com Express

      11:53

    • 9.

      Como criar modelo de usuário

      22:20

    • 10.

      Como adicionar registro

      20:10

    • 11.

      Como implementar login

      11:03

    • 12.

      Como criar middleware

      15:40

    • 13.

      Como criar um módulo de auth

      18:59

    • 14.

      Página de registro - Marcação + formulário

      12:55

    • 15.

      Página de registro - serviço + validação

      11:06

    • 16.

      Página de login

      10:00

    • 17.

      Página inicial

      8:13

    • 18.

      Interceptor de auth

      8:05

    • 19.

      Guarda de autos

      13:52

    • 20.

      Placas de esteiras

      14:15

    • 21.

      Frontend para placas de confeites

      10:00

    • 22.

      Formulário inline

      15:27

    • 23.

      Como criar um conselho

      19:19

    • 24.

      Como adicionar barra superior

      7:38

    • 25.

      Como criar módulo de placa

      8:58

    • 26.

      Como criar um único conselho

      2:46

    • 27.

      Como adicionar fluxo de placa

      6:26

    • 28.

      Como criar serviço de soquete

      9:55

    • 29.

      Como se juntar e sair do quadro

      17:19

    • 30.

      Autenticação no socket.io

      11:27

    • 31.

      Como criar colunas

      9:14

    • 32.

      Criar coluna com websockets

      12:14

    • 33.

      Como criar colunas

      11:36

    • 34.

      Criar formulário de coluna

      15:57

    • 35.

      Como criar uma tarefa básica

      9:35

    • 36.

      Como criar tarefas

      11:42

    • 37.

      Como criar formulário de tarefa

      8:24

    • 38.

      Nome do quadro Atualizar

      15:27

    • 39.

      Excluir placa

      8:18

    • 40.

      Excluir coluna

      10:09

    • 41.

      coluna atualização

      8:54

    • 42.

      Desinscrever

      6:54

    • 43.

      Módulo de tarefa e componente básico

      15:54

    • 44.

      Como tarefa e colunas

      13:57

    • 45.

      Tarefa Atualizar

      14:42

    • 46.

      Excluir tarefa

      7:30

    • 47.

      Implementação

      31:29

    • 48.

      Trabalho de casa

      2:02

  • --
  • 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.

135

Estudantes

--

Projeto

Sobre este curso

Neste curso, vamos criar uma API de clones Trello usando Angular, Angular, NodeJS, Express, MongoDB e Socket IO. Este curso está totalmente focado em mergulhar rápido e profundo na criação de aplicativo fullstack com essas ferramentas. Vamos começar do zero e passo a passo você vai se aproximar de aplicativo real acabado. Você vai entender profundamente como estruturar seu aplicativo, criar módulos e serviços reutilizáveis e compreensíveis e dividir código em pedaços menores de código. Vamos escrever código de forma eficiente para torná-lo puro e evitar complexidade de dados. Vamos fazer comunicação em tempo real implementando WebSocket com Socket IO.

Nosso código será escrito com Typescript no backend e no cliente.

Vamos implantar nosso aplicativo no servidor de produção real no final do curso.

Para cada lição você vai ter código fonte da lição, por isso é fácil ver o progresso e obter um aplicativo trabalho em qualquer lição que você quiser.

O que você vai aprender neste curso:

  • Como estruturar e configurar projeto

  • Escreva código de alta qualidade com texto em projeto real

  • Como criar módulos, controladores e serviços

  • Como implementar autenticação em http e em websockets

  • Compreendo profundamente padrões de design angular e expressa

Nenhum conhecimento prévio com exceção do Javascript é necessário (porque vou ensinar tudo desde o básico), mas se você tiver experiência com qualquer um destes (Angular/Express/Typescript/MongoDB/Socket io), será mais fácil para você passar este curso.

Se você está se sentindo como você aprendeu na web, mas ainda falta conhecimento de como criar seu próprio aplicativo real este curso é o que você precisa.

Conheça seu professor

I am a full-stack developer with a passion for learning and teaching what I know. I have been programming for around 10 years and teaching for almost 6 years.

I believe in learning through doing and this philosophy is present in every course that I teach. I love exploring new web & mobile technologies and my courses focus on giving you the edge in our fast-moving industry.

Visualizar o perfil completo

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. Apresentação: Bem-vindo ao meu curso full stack, onde estamos construindo projetos ferroviários do zero. É tão bom ter você aqui neste curso, implementaremos um projeto real a partir da pasta vazia até o aplicativo de produção totalmente funcional finalizado que será implantado no trilho servidor, vamos implementar um recurso que o projeto típico precisa, como por exemplo, autenticação, trabalhar com o Pi, gerenciar e criar estado reativo, trabalhar com formulários e muito, muito mais. Neste curso, usaremos muitas ferramentas diferentes em nosso cliente. Usaremos o Angular, que é a melhor solução para grandes aplicações de produção escaláveis. No back-end, usaremos agora o xadrez foi expresso para criar nossa API para armazenar nossos dados. Usaremos o MongoDB, que é uma solução muito popular para armazenar dados em seu projeto. E também as pessoas usam o Socket Layer para criar atualizações em tempo real dentro do nosso aplicativo. Obviamente, escreveremos o melhor código possível, que será seco, escalável e fácil de entender. Ao final deste curso, você poderá criar seus próprios projetos de qualquer complexidade usando essas ferramentas. Quem sou eu? Meu nome é Alexander Cohesion e sou um desenvolvedor web com mais de dez anos de experiência, bem como o instrutor profissional com vários cursos sobre tecnologias da web. Eu fiz o meu melhor para colocar todo o meu conhecimento dentro deste curso e eles querem dizer isso com você. Então, bem-vindo a bordo e vamos começar. 2. Que tecnologias usamos ?: Neste vídeo, quero falar sobre as tecnologias que usaremos neste curso. E, desde o início, quero definir expectativas realistas. Usaremos muitas tecnologias aqui. Será Angular, Node.js Express, MongoDB, TypeScript e socket IO. E isso é muita coisa para aprender. E então, neste curso, eu não vou te ensinar todas as coisas do começo ao fim. Simplesmente não é possível. A quantidade de conhecimento em cada ferramenta aqui é enorme. É por isso que este curso é focado. Construindo um projeto real do início ao fim. Sim, claro que você entenderá e aprenderá todas essas tecnologias em algum nível. Mas aqui, em algumas tecnologias, você pode precisar compreensão básica do que estamos falando. Com isso dito, vamos pular para a lista. E o primeiro da nossa lista é o Angular. Se você não sabe, o Angular é um dos três frameworks front-end mais populares, e nós o usaremos para criar frente e lado de nosso aplicativo. Angular é uma estrutura muito rígida que se adapta a grandes empresas. E temos esse TypeScript pronto para uso, o que significa que, usando o Angular, podemos construir aplicativos maiores, torná-los seguros por causa das digitações e dimensioná-los, se necessário. Se você não conhece o Angular tall, eu recomendo que você veja a lista sobre os conceitos básicos do Angular, como os componentes estão funcionando, como criar módulos, como adicionar roteamento e assim por diante. Depois de entender essas coisas, será muito mais fácil para você entrar no curso. O próximo na lista, conhecemos o xadrez e, na verdade, o NodeJS usaremos no back-end com o Framework, que é chamado Express. E se não o expressar, o framework mais popular para Node.js, é super pequeno, não é rigoroso, é realmente flexível e vamos usá-lo como uma solução muito popular para construir back-end. E neste projeto, devemos construir não apenas conexões de soquete gerenciadas. O back-end, é aqui que expressa uma boa escolha aqui, mas nem tudo é expresso por padrão, temos JavaScript. Claro que não é a melhor abordagem. Nós realmente queremos usar o TypeScript porque usaremos o TypeScript no cliente com angular. É quando o back-end com o Express. Também queremos usar o TypeScript. Por que isso? Porque , na verdade, o TypeScript traz para o JavaScript estática aperta. Isso torna nosso código muito mais seguro e vemos todos os nossos problemas, não em tempo de execução, mas no transpiler e no tempo. Obviamente, agora um projeto, devemos armazenar nossos dados em algum lugar, o que na verdade significa que, para o nosso back-end, precisamos de um banco de dados. E a solução mais popular aqui é o MongoDB. Este é realmente o banco de dados mais popular do mundo, onde podemos armazenar dados e se encaixa muito bem em nossa pilha com o Angular no cliente e o NodeJS foi expresso no back-end. E por último, mas não menos importante, na lista está o Socket IO. Queremos em nosso aplicativo implementar WebSockets para notificar outros usuários quando criamos uma coluna de tarefa ou crédito quando mudamos de parte, todos os usuários dentro dessas partes devem ser notificados. E a solução mais popular para WebSockets dentro de uma palavra conhecida é chamada de soquete IO. É a biblioteca que nos ajuda a gerenciar WebSockets no back-end e simultaneamente no cliente. É por isso que é realmente uma boa escolha. Mais uma vez, se você não estiver familiarizado com algumas ferramentas aqui, está tudo bem. Começaremos do zero, mas focaremos o aprendizado de todas essas ferramentas apenas nas necessidades diárias. O que realmente significa que vamos aprender coisas básicas, coisas corretas e coisas que são necessárias para implementar este projeto ferroviário. 3. Recursos para download: Neste vídeo, quero lembrá-los sobre o código-fonte, porque, na verdade, dentro deste curso, em cada aula em que codificamos algo, você pode encontrar o código anexado desta palestra específica, que na verdade significa que cada palestra tem um código fonte dentro. E se você quiser apenas pegar o código-fonte da palestra, você certamente pode fazer isso. Basta crescer sob o vídeo e verificar o arquivo anexado ao vídeo. E de forma diversa, como sempre, se você tiver alguns problemas com seu código, algo não estiver compilando ou você tiver apenas uma pergunta sobre o vídeo ou o curso em geral, basta escrever seus comentários nesse vídeo, e eu certamente responderei a eles. 4. Instalar o nó e o angular: Neste vídeo, instalaremos o NodeJS Angular em sua máquina. Como você pode ver aqui, estou no site oficial, Node js.org, onde você pode baixar agora o xadrez em sua máquina. Se você não o tiver instalado, você pode verificar se ele está instalado em sua máquina. Se você acabou de escrever o nó menos a versão dentro do seu console, se você está obtendo a versão como 16, está tudo bem se você tiver algo mais antigo, eu recomendo que você atualize sua versão do Node. Mas aqui está o ponto importante, é que você pode ver que temos duas versões. Em primeiro lugar, 16 LTS e 17 atuais. E você pode pensar, ok, eu preciso instalar o atual. E eles não podem recomendar que você instale o atual porque a versão de suporte de longo prazo é normalmente muito mais estável. É por isso que, para todos os meus projetos, especialmente se eles estão sendo enviados em produção, estou usando a versão do nó LTS, o que na verdade significa que se você está pulando para este site e vê como a versão LTS pode ter 17 ou 18 anos. Eu ainda recomendo que você faça o download de Ts e não atuais e não importa em qual sistema operacional você está trabalhando. Não, isso funciona em todos os lugares. Basta baixá-lo aqui, instalá-lo em sua máquina e, em seguida, verificar dentro do console com o nó menos versão que foi instalada com sucesso o Node em sua máquina. Você também pode digitar aqui e Pm menos versão para verificar se o npm também está disponível para você. Nosso próximo passo é instalar angular e realmente trabalhar com o globo, estamos usando uma ferramenta chamada Angular CLI, que na verdade significa que esta é a ferramenta que nos ajuda antes de tudo a criar um Projeto Angular, então gere diferentes módulos ou componentes e faça muitas coisas com o Angular. Então, como podemos instalar o Angular CLI em sua máquina, como você pode ver aqui, estou no site oficial, Angular slash CLI, e aqui está o primeiro passo instalando o angular CLI. E podemos simplesmente copiar esse comando que instalará globalmente o Angular CLI em sua máquina. E como você pode ver para isso, estamos usando o npm, que terá após a instalação de cadeiras conhecidas. É aqui que eu posso simplesmente jogar pagamentos tau menos g Angular CLI. E estou instalando globalmente o Angular CLI na minha máquina. Agora devemos verificar se nosso Angular CLI foi instalado com sucesso. Podemos escrever isso na versão G menos e aqui estão algumas informações importantes. Em primeiro lugar, podemos ver que o Angular CLI é a versão 13, o que na verdade significa que instalamos angular 13 aqui em nossa máquina. Em segundo lugar, esta é a nossa versão do nó que é ativada em sua máquina. Isso é npm e este é o sistema operacional. E algumas versões do Angular que você pode ver aqui. Se você vir essa saída, isso significa que você instalou com sucesso o Angular CLI em sua máquina. O próximo passo é gerar frente e parte do nosso aplicativo. Como você pode ver aqui, eu estou dentro dele ser dobrado. E eles não criaram nosso projeto aqui, o que na verdade significa que raramente criamos tudo do zero. Então, o que eu quero fazer aqui, eu posso apenas experimentá-lo negócio MK e depois o nome do nosso projeto, L Trello. E, na verdade, neste projeto, estamos implementando o clone do trailer. Aqui está apenas um nome com um prefixo legal e WSSE, você pode criar uma pasta não a partir do botão terminal, apenas no seu gerenciador de arquivos. Agora, eu quero pular dentro da nossa pasta ultra law. E aqui devemos criar duas pastas diferentes porque queremos separar nosso back-end do nosso front-end. E você pode perguntar, por que isso? E, na verdade, por diferentes motivos. Em primeiro lugar, é mais fácil dividir seu front-end e back-end se você quiser, por alguns motivos, colocá-los posteriormente em diferentes repositórios ou talvez até equipes diferentes. Em segundo lugar, se os separarmos em pastas diferentes, então não é um monólito, que na verdade significa que com certeza não injetaremos algumas coisas do back-end dentro da pasta front-end e vice-versa. Eles são realmente isolados e os separam conforme precisam estar na aplicação real. É por isso que aqui eu quero criar duas pastas. Em primeiro lugar, será cliente e, em segundo lugar, será cliente de servidor e insight. Teremos nosso aplicativo angular e, em seguida, diz servidor. Teremos nosso gs conhecido com o Express, que será nosso aplicativo de back-end. Agora podemos gerar nossa aplicação angular, como você pode ver aqui na documentação, simplesmente executamos o gene hue e o nome da pasta. Depois pulamos a pasta e iniciamos nosso servidor. Mas aqui temos um problema porque criamos diretamente nossa pasta cliente e podemos pular agora inserir pasta do cliente, o que na verdade significa que não podemos criar nosso aplicativo angular com mecanismo você porque a pasta já existe. Para isso, podemos usar um comando muito bom no gene you. E então aqui devemos fornecer o diretório do nome do aplicativo, e aqui está a barra de pontos, o que na verdade significa que esse comando criará para você em aplicativo angular em seu diretório existente. Como você pode ver aqui, estou dentro do cliente onde exatamente queremos gerar nossa aplicação angular. E eles podem colar esse comando aqui no gene Hue app name, directory dot slash. E, obviamente, não queremos nomear o nome do nosso aplicativo. É aqui que podemos fornecer o ELL Trello, assim como nomeamos nosso projeto com o mesmo Enter oculto. E iniciamos nosso processo de geração de um novo projeto Angular. E aqui temos algumas perguntas do Angular CLI. Precisamos de roteamento angular? Claro, sim, é por isso que estou acertando sim, aqui, qual folha de estilo devemos usar. E aqui vou escolher um CSS. Depois disso, nosso projeto será gerado. Como você pode ver aqui, todos os pacotes foram instalados com sucesso, mas depois estamos recebendo uma mensagem que pode ser confusa para você. Aqui estamos recebendo a mensagem de que agora foi criado o branch master como nosso branch git padrão. E eles podem mudar o nome para o nome mais tarde, mas ele ainda não está lá. E, na verdade, não importa qual branch foi gerado para você, master ou main, ele funcionará em qualquer caso. Então você pode simplesmente ignorar esse aviso. E a última etapa que precisamos fazer é iniciar nosso aplicativo de cliente. E como você pode ver aqui na documentação, ele está no G serve. Então, simplesmente inserimos o cliente, devemos experimentá-lo e apenas servir sem especificar nada. Como você pode ver aqui, estamos obtendo uma saída verde. A mensagem de que agora o servidor de desenvolvimento ao vivo angular está escutando no host local por 1200. Então, agora podemos simplesmente abrir o localhost 4.200. E aqui vemos a página angular padrão e agora inserimos o console. Nosso servidor web deve estar funcionando o tempo todo enquanto estamos desenvolvendo o aplicativo. Agora, vamos dar uma olhada nos arquivos que foram gerados rapidamente. Como você pode ver aqui, abri meu editor, estou na pasta L Trello, e temos aqui duas pastas, servidor e cliente e cliente insight. Todos esses arquivos foram gerados com o Angular CLI. E a parte mais interessante para nós é essa pasta de origem. E dentro da AB, temos nosso componente de aplicativo. Isso é exatamente o que vemos aqui na tela. Este é o componente padrão do angular. É aqui que, em primeiro lugar, quero remover o componente do aplicativo, o SCSS, as especificações dos componentes do aplicativo. E aqui temos apenas esses quatro arquivos. Agora podemos entrar no HTML do componente App e realmente queremos remover tudo, e realmente queremos remover tudo exceto esta última linha, a saída do roteador. Isso é extremamente importante rapidamente. Então eu vou remover tudo desse arquivo e apenas viver aqui seca a saída. E no topo, podemos apenas experimentá-lo. Olá l Trello. Então, sabemos que está funcionando. Depois disso, precisamos entrar no componente do nosso aplicativo e alterá-lo. Porque, na verdade, aqui estamos usando URLs de estilo do arquivo, o que alterará o removido. É aqui que podemos simplesmente remover essa linha e usamos aqui um modelo. E nem precisamos desse trailer do título L porque não o estamos usando. Simplesmente temos nosso componente de aplicativo e ele é um componente vazio. Agora, quando vou pular para a página dentro do navegador, posso ver que tudo foi removido. Nossa página está completamente limpa e agora temos apenas uma mensagem de hello little trailer, o que na verdade significa que preparamos com sucesso a parte do cliente de nosso aplicativo que a boa vontade implementará posteriormente. 5. Configurar servidor: Neste vídeo, quero preparar nossa parte de back-end do nosso projeto para iniciar a implementação. Como você pode ver aqui, está completamente vazio. Então, o que vamos criar aqui, na verdade, o que devemos fazer, devemos inicializar o arquivo JSON do pacote com o conhecido. Então, aqui podemos escrever npm in need e ele criará para nós um arquivo JSON de pacote. Aqui, devemos responder a algumas perguntas. Normalmente, eu só pressiono Enter em todos eles. Não importa para nós. E no final, simplesmente clicamos em Sim e estamos prontos. Agora podemos pular e dizer editor e sair do nosso cliente para o nosso servidor. Agora, aqui temos apenas um arquivo simples, Beckett Jason com nome, descrição da versão , script principal, onde não temos nada no autor vazio e na licença. Agora, precisamos instalar dois pacotes que nos ajudarão a criar nosso projeto de back-end. Então, aqui podemos escrever estilo de deficiências. E depois desse não demônio menos d, o que isso significa? Em primeiro lugar, o que não é um demônio? Que este é um pacote especial que nos ajudará a recarregar toda vez que mudarmos algum arquivo, nosso aplicativo back-end. E é exatamente isso que a Angular está fazendo rápido no cliente. Mas dentro do nosso projeto de back-end não temos nenhum servidor web que esteja fazendo isso rápido. É por isso que quando Stalin e um demônio, e como você pode ver aqui, eu usei a opção menos d, o que na verdade significa em nosso pacote Jason, nenhum demônio foi instalado dentro das dependências de desenvolvimento. E dependências de desenvolvimento são dependências que estamos usando quando estamos desenvolvendo um projeto. Não precisamos de nenhum demônio na produção. Isso é apenas para desenvolvimento. E nosso próximo pacote é chamado de nó Ts, e também é apenas para desenvolvimento. É aqui que estamos escrevendo npm install Ts node minus t, o que significa que essa é uma dependência de desenvolvimento. Então, o que o node está fazendo? Este é apenas um processo que transpira nosso código TypeScript dentro do código JavaScript em tempo real, executado exatamente como o código JavaScript normal dentro do node. Isso é extremamente eficiente porque queremos escrever código TypeScript. É por isso que devemos transformá-lo primeiro de TypeScript para JavaScript. E esse pacote ajuda a fazer isso de uma maneira muito fácil. Agora vamos pular e dizer Beckett json e verificar o que temos. Temos aqui para desenvolver dependências. E aqui eu quero criar um novo script, mas não preciso do teste de script. Queremos aqui iniciar nosso servidor web. Este é y, aqui está um estilo de script, e aqui podemos chamar um demônio de caminho para o nosso arquivo. E aqui eu quero escrever a barra de origem server.js. E como você pode ver aqui, temos o server.js, que criaremos em um segundo. Então este é o arquivo TypeScript e a parte mais interessante aqui que não especificamos que estamos usando aqui o nó Ts dentro de nenhum daemon. Daemon faz isso automaticamente fora da caixa se instalarmos o nível nevado e especificado aqui não o arquivo JavaScript, mas o arquivo TypeScript. E a última coisa que devemos fazer é criar o arquivo de configuração ts, que é um arquivo de configuração para TypeScript. Isso está aqui dentro de uma pasta de serviço. Quero criar um novo arquivo, ts config dot json. Aqui vou colar esse conflito e esse é um conflito super típico para o aplicativo Node.js com TypeScript. Então, aqui estamos definindo as opções do compilador. É exatamente assim que o TypeScript transpira nosso código de TypeScript para JavaScript. Portanto, o módulo CommonJS significa que estamos escrevendo nosso TypeScript no backend dentro do substantivo baú. E nosso alvo é a óptica atmosférica, porque o nó pode ler facilmente no meu código seis do script. Portanto, nossa resolução de modo é nó porque estamos escrevendo dentro de cadeiras de substantivos, mova-se nos mapas de origem. É aqui que passa o mapa de origem. Nosso negócio é o diretório. A saída será gerada. Aqui temos uma pasta dist, ela será criada automaticamente. Também temos aqui o módulo NDS verdadeiro estrito inter pop, e precisamos dessa opção yes module inter Pope para converter corretamente as entradas TypeScript para exigir dentro do jazz conhecido. Então, criamos com sucesso nossa configuração do TypeScript, e agora podemos criar nossa pasta de código-fonte e dentro desse arquivo, porque como você pode ver aqui, nosso servidor viverá dentro do servidor de origem Ts. Então, estou entrando nessa fonte e criando um ponto ts de servidor de arquivos. E não se esqueça do Ts NodeJS. Agora podemos entrar e simplesmente escrever servidor de log do console apenas para testar se ele está funcionando. Agora, vou pular dentro do console e aqui dentro da pasta do servidor, posso escrever npm start, como você pode ver aqui, temos uma saída de no demon, o que é totalmente bom. Ele está lavando arquivos TypeScript aqui e aqui. Nenhum demônio iniciou nosso teste do servidor de origem do nó Ts, o que na verdade significa que ele simplesmente usa o nó Ts dentro, mas reinicia nosso servidor. E este é o servidor de saída que escrevemos dentro desse arquivo. E agora o Demon Bull reinicie nosso servidor todas as vezes quando fazemos algumas alterações. 6. Instalar banco de dados: Neste vídeo, falaremos sobre no banco de dados de estilo em sua máquina. E há outra dimensão que usaremos o MongoDB aqui. Então, qual foi a ideia? Devemos instalar em nosso banco de dados de máquina local para que possamos salvar lá e ler a partir daí alguns dados que usaremos em nosso aplicativo. Esses dados estarão disponíveis para nós ao vivo localmente. No momento em que queremos implantar nosso projeto em produção, devemos configurar o banco de dados em produção e faremos isso no final deste curso. Portanto, agora a questão é como podemos instalar o MongoDB em sua máquina específica e você pode trabalhar em diferentes sistemas operacionais. Então, queremos algo que funcione em qualquer lugar sem problemas. Na verdade, instalar o banco de dados sempre pode ter algumas dificuldades. Aqui, como você pode ver, eu já abri o site oficial do MongoDB com a seção de instalação do MongoDB. Este é o URL para que você possa verificar se estiver interessado e parece muito fácil. Simplesmente escolhemos aqui um sistema operacional. Então, aqui estou clicando no link MongoDB Download Center. E agora estou aqui nesta página da web. E neste momento já não está muito claro o que o MongoDB devemos instalar. Existem diferentes versões disso. Existem versões gratuitas que queremos usar e as soluções pagas que não precisamos. E, na verdade, aqui devemos rastrear um pouco e ver aqui o servidor da comunidade MongoDB. Na verdade, essa comunidade do MongoDB é o nome da versão gratuita do MongoDB que queremos usar. Então, aqui à direita, podemos escolher a versão atual é totalmente boa. Agora, aqui está sua plataforma, talvez o Windows, e agora você simplesmente faz o download e instala. Então, basta clicar duas vezes aqui e instalá-lo. Mas depois disso, existem algumas etapas adicionais. Devemos configurar o diretório de dados. Aqui você pode ver que eles estão fazendo isso dentro da linha de comando assim. E assim, é por isso que você pode instalar o MongoDB assim. Isso é totalmente bom. Essa é a maneira oficial, mas na verdade meus alunos tiveram muitos problemas ao usar bancos de dados com instalação oficial. Por que isso? Porque, na verdade, em cada sistema operacional, você pode ter alguns problemas. Além disso, você deve criar uma pasta, especificar o caminho e assim por diante. É mais difícil. É por isso que eu recomendo que você veja a segunda possibilidade, como você pode instalar o banco de dados em sua máquina. E depois falando aqui sobre o DACA e sobre o Docker Desktop. Então, o que é Docker? Esta é uma ferramenta adicional específica que você não deve aprender, mas você pode simplesmente usá-la. A ideia principal é que o Docker embale tudo dentro do contêiner. É completamente isolado e não tem nada a ver com o seu sistema operacional. Docker funciona em todos os sistemas operacionais e é gratuito, que realmente significa a ideia aqui de que estamos instalando o Docker, antes de tudo em sua máquina. E em segundo lugar, usamos a imagem oficial do Mongo do Docker. Como você pode ver aqui, o link para o Mongo, que é suportado pelo próprio MongoDB. Portanto, isso não é uma ferramenta de terceiros. Isso é super oficial e a ideia principal é que este mongo seja embalado dentro do contêiner, por isso fica completamente isolado em sua máquina e você simplesmente pega do contêiner, a porta onde você pode conectar e gravar dados nesse contêiner. E é assim que ficará quando você começar. Como você pode ver aqui à esquerda, deve ser verde. E neste momento, você sabe, ok, meu Docker está funcionando e para você provavelmente a lista aqui estará vazia. Isso é totalmente bom. A ideia principal é que, antes de tudo, você inicie o Docker em sua máquina. Depois disso, simplesmente pulamos para o console e devemos executar esse comando, como você pode ver aqui, escrevi docker run e depois de instalar o Docker desktop em sua máquina, você pode escrever o Docker dentro do console. Este é o nome conhecido, e aqui estamos escrevendo docker run then minus d, que significa que este deve ser um processo desanexado, o que na verdade significa que não queremos executá-lo aqui dentro deste terminal. Queremos apenas desconectá-lo do terminal. Aqui especificamos ports e depois disso estamos especificando o nome mongodb. E aqui, Mongo, esse nome, mongodb é o nome do contêiner na minha máquina. E aqui o que queremos baixar, essa é exatamente a imagem que usaremos. Aqui estamos usando o Mongo 404. Você também pode usar a versão posterior aqui, você pode conferir no site oficial do Mongo ou aqui dentro do Docker. Como você pode ver, você pode clicar aqui tags, rolar um pouco. Por exemplo, você pode usar mais recente ou apenas verificar a versão, como você pode ver aqui, a versão mais recente é 507. Neste momento, eu instalei na minha máquina por 0 para, mas isso não faz muita diferença. As coisas que vamos experimentar dentro do MongoDB são as mesmas em todas essas versões. Agora estou acessando aqui e Docker fará o download desta imagem na minha máquina. Como você pode ver, não obtive nenhuma saída , exceto um hash. E isso ocorre porque o MongoDB já foi baixado pelo Docker na minha máquina. Portanto, isso não é um problema, e essa linha simplesmente iniciou o Mongo DB novamente na minha máquina. E, na verdade, se eu estou abrindo agora a ferramenta Docker, você pode ver aqui que contém um MongoDB e ele é verde porque está sendo executado no momento e podemos falar com ele. É por isso que, como você pode ver, você não precisa criar arquivos adicionais. Você não precisa se preocupar com algumas permissões ou pastas. Simplesmente funciona. E esta é uma linha única que é usada para muitos projetos. Agora, a questão é obviamente como podemos pular dentro do console do MongoDB quando ele está dentro do contêiner. E para isso temos um comando especial, docker exec, que significa executar TI. E aqui está o nome do nosso contêiner. No nosso caso, foi o MongoDB. E depois disso, estamos escrevendo nosso comando e queremos vir e Mongo aqui porque é isso que está instalado dentro do contêiner. recipiente interno pode ser instalado seja o que for. No nosso caso, essa imagem do Mongo simplesmente tem o Mongo dentro. É por isso que estamos pressionando Enter. Estamos recebendo aqui muitas mensagens do MongoDB. E como você pode ver depois disso, agora estou aqui no terminal do Mongo dentro do contêiner, e eles podem escrever aqui alguns comandos do Mongo. Por exemplo, mostrar bancos de dados, ponto e vírgula, estou pressionando Enter, e você pode ver quais bancos de dados eu tenho aqui dentro. Agora, você pode dizer, ok, mas eu não usei o Docker, instalei o MongoDB apenas da maneira oficial, o que eles deveriam fazer? E, na verdade, você deve fazer apenas uma única coisa. Se você o instalou da maneira oficial, então você tem dois comandos diferentes em seu console. Em primeiro lugar, será um comando de Deus, e isso começará exatamente da mesma forma que fizemos com o docker execute o processo MongoDB em sua máquina, que na verdade significa que o banco de dados será como um processo rodando em sua máquina. E o segundo comando que você deseja usar é o Mongo. Este comando saltará diretamente no console de inserção, assim como fizemos com o torque. Será exatamente o mesmo. O mais importante neste curso é que seu banco de dados Mongo deve estar sendo executado diretamente em sua máquina durante o desenvolvimento do projeto. O que realmente significa que você tem três coisas. Em primeiro lugar, você tem um banco de dados padrão. Em segundo lugar, iniciamos o servidor web para o back-end. E o último é o servidor web estático para o frontend. 7. Você usa um bom editor?: Estamos quase terminando com a subtipagem de todas as nossas ferramentas. E a última pergunta que eu quero fazer, você realmente usa o editor correto? Porque, na verdade, escreveremos muito TypeScript dentro do seu editor. E o editor não suporta muito bem o TypeScript, então você pode pensar em usar outro editor. Como você pode ver aqui, estou dentro do meu editor, este é o Vim, mas não estou sugerindo isso para você. Eu só quero mostrar do que estou falando. Como você pode ver aqui onde inserir componente dentro do Angular e aqui temos a entrada do nosso componente. Normalmente, quando estamos escrevendo o código com não escreva invertidos apenas escreva algo como adicionar componente ou talvez apenas adicionar do que comp. E então temos um preenchimento automático. E isso você pode ver aqui, podemos escolher muitas coisas. Na verdade, queremos inserir componentes do Angular. Ele não cuidava apenas daqui. E antes de tudo, foi preenchido automaticamente até o fim. E em segundo lugar, recebi esse componente de entrada externo do Angular com. E é extremamente importante que seu editor possa fazer isso. Você realmente precisa de suporte essas entradas externas quando está escrevendo código. Porque toda vez que você deve escrever uma entrada, se você realmente fizer isso manualmente, como o componente de entrada, e você realmente não se lembra de qual pacote você deve inseri-la. Isso não é eficiente. Você simplesmente gasta um tempo escrever código nas coisas de Ron. Nós realmente precisamos desse recurso de entrada externa. E o segundo recurso é , obviamente, que você deseja ter um suporte do TypeScript dentro do seu editor, o que na verdade significa quando estamos escrevendo algo incorreto. Por exemplo, não selecione aqui, mas apenas selecione onde chegar diretamente aqui, um argumento de mensagem do tipo select não existe no componente de tipo, o que na verdade significa, mas não gasta tempo depurando alguma mágica. Simplesmente vemos nosso erro de digitação diretamente no editor. Você pode usar aqui qualquer editor que tenha suporte ao TypeScript. Mas se você não sabe qual editor usar, eu recomendo fortemente que você procure no VS Code. Este é um editor totalmente gratuito, que funciona em todos os sistemas operacionais. Você simplesmente o instala. Você está obtendo esse editor com suporte integrado ao TypeScript pronto para uso, o que na verdade significa que você está obtendo todos esses recursos dentro do seu editor. E, nesse caso, é muito mais fácil escrever código. 8. Configurar soquete com Express: Neste vídeo, estamos começando com o desenvolvimento do nosso projeto. E, na verdade, o objetivo deste vídeo é configurar nosso servidor back-end com express, MongoDB e socket IO. Então, vamos começar. Aqui. Precisamos instalar vários pacotes novos. Em primeiro lugar, queremos expressar que isso é uma estrutura. É por isso que eu quero entrar no console. E como você pode ver onde dentro da pasta raiz isso é desenhado, não queremos instalar aqui pacotes porque primeiro devemos pular dentro da pasta do servidor aqui boop deseja instalar pacotes. É aqui que estou certo no npm install express. Nesse caso, estamos instalando essa estrutura como uma dependência. Aqui você pode ver agora que temos uma nova dependência, expressando isso como nossa estrutura. A próxima coisa que queremos instalar é o mangusto. E se você não sabe o que é o Mongoose, este é o pacote mais popular para trabalhar com o MongoDB dentro de cadeiras conhecidas. Por que é mais popular, porque você pode simplesmente configurar sua conexão com o MongoDB com ele, você pode criar seus modelos e trabalhar com MongoDB de maneira mais correta trabalhando com modelos. Então você normalmente tem algo como uma RAM e aprenderemos Mongoose mais íngreme nas próximas palestras. E a última coisa que queremos instalar aqui é o Socket IO. É por isso que o npm install socket dot ion. E esta é exatamente a nossa biblioteca para trabalhar com WebSockets dentro de cadeiras conhecidas. Então, como você pode ver, todas as nossas dependências estão instaladas e agora podemos pular na fonte definida, servidor Ts, e não temos nada aqui. E podemos começar configurando nosso xarope. Mas, na verdade, aqui está a questão. É muito fácil escrever seu código para o Stratton Express. Sua entidade é realmente fácil de criar um servidor web para Socket IO, mas na verdade não é tão fácil configurar juntos o MongoDB Express e o soquete IO. Porque o que queremos de expresso, queremos rodadas normais, assim como na aplicação normal, mas também queremos vincular ao seu soquete IO para que possamos trabalhar com WebSockets. E, além de tudo isso, precisamos de alguma forma iniciar nosso MongoDB. Então, como eu disse, não é fácil, mas esta é a produção porque na verdade ninguém precisa de apenas um único pacote. Nós realmente queremos a aplicação completa pronta para produção. Então, primeiro de tudo, vou inserir nosso Express. Expressar. E, na verdade, neste momento você provavelmente pensa, ok, o que ele está fazendo. Ele tentou um inverso dentro das cadeiras de substantivos. E, na verdade, isso é totalmente bom porque não estamos bem aqui. Javascript, onde bem aqui, TypeScript. E isso acontece com nossa configuração. E só para lembrá-lo aqui, temos nossa configuração ts. Isso aconteceu para o ECMO ScriptSig, que agora pode ser lido , Jess. Mas o mais importante, mais resolução é CommonJS e node. É aqui que ele será convertido para exigir e funcionará como um encanto dentro do jazz agora. Mas, para nós, é extremamente confortável porque usar entradas é muito melhor do que o exigido pela mão direita. E aqui temos um próximo problema. Como você pode ver aqui, eu tenho um erro. Não é possível encontrar o arquivo de declaração para o módulo expresso. O que isso tem um significado? texto datilografado tenta nos ajudar com o inverso. Ele não pode fazer isso fora da caixa porque TypeScript não sabe nada sobre pacote expresso. E aqui está uma solução que devemos instalar com o npm install save-dev, types express. Assim, podemos instalar digitações adicionais para pacote expresso e, em seguida, digitar script pode nos ajudar pequenos. E isso é exatamente o que queremos fazer. Precisamos pular e definir console e direito e pagamentos tau. E aqui está em tipos slash Express, e aqui é importante menos a opção de apenas instalá-lo como uma dependência de desenvolvedor. Não precisamos dessa biblioteca na produção. E como você pode ver após a instalação, esse erro desapareceu. E agora o TypeScript pode nos ajudar com o Express. Então, aqui importamos com sucesso nosso pacote expresso e agora podemos criar nosso aplicativo. Então eu posso simplesmente escrever aqui const ab equals, e aqui estamos chamando Express. E como você pode ver agora, se eu sou halita e expresso, você pode ver todos os tipos de expressos neste pacote específico. Por exemplo, podemos ler aqui que ele cria um aplicativo expresso e isso é extremamente útil para fins de desenvolvimento. A segunda coisa que queremos fazer criar um servidor HTTP e você verá o porquê em um segundo. Então aqui eu quero desestruturar, criar servidor a partir de, e aqui estará http. Como você pode ver, estamos obtendo o ATP pronto para uso e também criando um servidor porque esse é o pacote de nós padrão. Mas pode acontecer que você não tenha digitações para cadeiras conhecidas. É aqui que podemos pular diretamente no console e escrever npm install types node menos t. E, neste caso, estamos instalando com certeza todas as digitações necessárias para cadeiras de substantivos. Então, aqui importamos o servidor de criação de http. Agora devemos usá-lo. Então, após o aplicativo, podemos criar nosso servidor HTTP. E aqui queremos chamar nosso servidor de criação e fornecer dentro do nosso aplicativo. E só para lembrá-lo, app, esta é uma instância do nosso Express. Este é o nosso servidor expresso. Estamos criando aqui o servidor HTTP. Além disso, a próxima coisa que queremos inserir aqui é soquete. Este é o y aqui, onde é importante Servidor com grande S do pacote de E/S de soquete. E agora, depois disso, podemos criar diretamente nosso servidor de soquete. Então aqui const ion, e aqui estamos nos chamando de servidor. E, por dentro, estamos fornecendo nosso servidor HTTP. É exatamente por isso que criamos esse servidor HTTP primeiro e antes de serem expressos. Agora, neste arquivo, temos três coisas diferentes. Em primeiro lugar, temos nosso aplicativo, para que possamos trabalhar diretamente com o Express. Em segundo lugar, temos nosso servidor HTTP, que podemos começar com alguma porta. O terceiro é o nosso IR, para que possamos fazer algumas solicitações do WebSockets. E só para verificar se tudo está funcionando, quero usar aqui nosso aplicativo e experimentá-lo apt-get slash. Então, queremos criar nossa nova rota na barra. E aqui não precisamos de nada, mas eu só quero responder com alguma corda. É por isso que aqui podemos escrever solicitação e resposta. E aqui dentro da API rest dot send está ativa. Se você não está familiarizado com o Express, é assim que criamos apenas rotas de jogo dentro do nosso servidor de back-end. Então, aqui estamos dizendo, ok, estamos criando agora get route for slash, o que significa para a página inicial. E aqui está nosso Kohlberg. Dentro de nosso Kohlberg estavam recebendo solicitação e resposta. E aqui podemos usar dot send para enviar a string para essa rodada específica. A última coisa que devemos fazer aqui é iniciar nosso servidor. Então, aqui podemos escrever servidor HTTP. Não ouça e ouça. Estamos fornecendo algumas portas, por exemplo, para 1001. Depois disso, temos um retorno de chamada. O servidor web em torre é bem-sucedido e talentoso. Assim, podemos escrever dentro de algum log do console, por exemplo, que nossa API está escutando na porta. E aqui vai ser nossa parte. E, na verdade, teria sido isolado colocar o esporte em um arquivo de configuração adicional, mas por enquanto ele também irá. Então, vamos verificar se está funcionando. Eu tenho aqui uma guia com o servidor de API aberto. E como você pode ver aqui, nenhum demônio reiniciou esse servidor da web de novo e de novo. E em algum momento agora estamos recebendo nossa API de log do console escutando na porta 4.001, o que na verdade significa que até mesmo o navegador, abriremos o host local para 1001. Você pode ver aqui que nossa API de mensagens está ativa, mas não é tolerável. Também quero verificar se nossa conexão de camada de soquete está funcionando. É por isso que aqui depois do EB, podemos escrever ir ponto e aqui temos. E como você pode ver, em primeiro lugar, estamos tirando todas as digitações da caixa com o Socket Layer. Não precisamos instalar nenhum pacote adicional. Em segundo lugar, você pode ver isso na função de ouvinte para o nosso soquete IO, o que na verdade significa que podemos escrever aqui, e estamos fornecendo aqui como a primeira conexão de parâmetro. E, na verdade, essa é a ação padrão que pode acontecer dentro do soquete IO. E aqui temos nosso retorno de chamada. Não queremos nada por enquanto aqui, mas podemos simplesmente escrever console.log conectado. E não podemos realmente ver que a camada de soquete está funcionando para nós porque apenas definimos uma guia no back-end, mas não no cliente. Mas é assim que escreveremos nosso código Socket Layer no back-end e estamos totalmente preparados para isso. Então aqui nós zap, estamos trabalhando com o Express com um quintal, estamos trabalhando com Socket Layer e servidor HTTP que estamos usando para iniciar o servidor. E a última coisa que devemos fazer aqui é configurar nosso Mangusto. E só para lembrá-lo, mangustos o pacote para trabalhar com o MongoDB. Então, aqui no topo, eu quero inserir um vai de mangusto. E agora aqui está um ponto muito importante. Você nunca deseja iniciar seus servidores web antes de iniciar a conexão com o banco de dados. A ideia principal é que dentro de você observador, você fará algumas solicitações para o banco de dados, e o banco de dados ainda não está pronto, então podemos fazer essa solicitação, o que realmente significa todas as vezes queremos ter certeza de que o MongoDB é, sua conexão está estabelecida. E só depois disso estamos iniciando nosso servidor web. Aqui é o que eu quero escrever depois do nosso soquete IO, podemos escrever aqui ponto Mongoose e temos aqui um método connect. E, na verdade, por dentro, queremos fornecer nosso URL mongodb. Então, o que eu quero colar aqui é este ano, é MongoDB dois pontos duas barras, host local 27017 barra de porta l Trello. E, na verdade, essa parte à esquerda é o caminho padrão do MongoDB. E realmente não importa como você instalou o Mongo DB da maneira oficial ou com o contêiner Docker, ele funcionará exatamente da mesma forma. Ou você tem um processo MongoDB em execução em sua máquina, no esporte, ou você tem um MongoDB em execução dentro do contêiner com o esporte, que está disponível fora em nossa máquina local. Aqui após a barra, este é apenas o nome de como um banco de dados que você pode escrever aqui, qualquer nome e ele será criado. Acabei de escrever aqui o trailer, como o nome do nosso projeto. Então, essa linha é realmente uma promessa. É por isso que aqui podemos escrever ponto. Depois de nos conectarmos com sucesso ao nosso banco de dados MongoDB, ele será acionado. E agora, por dentro, podemos primeiro escrever que nos conectamos com sucesso ao nosso banco de dados. Para que eu possa escrever aqui conectado ao MongoDB. E também quero mover esse ouvinte HTTP para dentro. Nesse caso, em primeiro lugar, nossa conexão com o MongoDB é estabelecida. E depois disso, estamos iniciando nosso servidor. Agora eu quero entrar no nosso servidor web e verificar se ele está funcionando. Como você pode ver agora, estou recebendo uma mensagem conectada ao MongoDB e depois do semestre que nossa API foi bem-sucedida, o padrão, o que na verdade significa que esse é exatamente o nosso objetivo. Em primeiro lugar, o MongoDB. Em segundo lugar, nosso servidor web. Na verdade, neste momento, você pode obter um pouco do Azure em relação à conexão aqui. E o problema mais popular que você pode ter, você não iniciou o processo do MongoDB em sua máquina. Se não for iniciado, não poderemos nos conectar a um banco de dados do MongoDB. Então aqui você provavelmente receberá algum erro, como não é possível conectar-se ao Mongo DB ou a conexão falhou. Mas se você vir na tela conectado ao MongoDB e o pagamento for iniciado, isso significa que você configurou tudo com sucesso. E iniciamos nosso servidor web no back-end com MongoDB e socket IO. 9. Criar modelo de usuário Mongoose: Neste vídeo, falaremos sobre como criar nosso modelo de usuário. Na verdade, agora a inicialização do aplicativo registrará usuários. Assim, usuário atual, podemos fazer login com o usuário, que significa que precisamos de alguma forma lidar com nossos usuários no front-end, no back-end e no banco de dados interno. Então, neste vídeo, vamos nos concentrar no mangusto e no banco de dados. Mais uma vez, o que é mongoose já foi instalado este pacote no pacote R JSON. Você pode ver o Mongoose aqui, mas o que ele essencialmente faz, este é o site oficial do Mongoose. Você pode ver aqui o exemplo. Então, injetamos bens humanos e fazemos o ponto do Mongoose se conectar. E aqui está um banco de dados do MongoDB. Depois disso, podemos escrever o módulo mongoose cat, e definimos que nosso gato nomeou string, o que na verdade significa que cat é nossa entidade. E agora podemos criar essa entidade apenas dentro do JavaScript. É aqui que estamos no Reino Unido, e fornecemos dentro do nome. Então aqui criamos um gatinho, que é apenas um objeto. Mas agora, dentro de Katie, temos um método de salvar. E esse método retorna como uma promessa, o que na verdade significa que é assim que salvaremos o registro dentro do MongoDB. Agora você pode perguntar, ok, por que precisamos de mangusto? Por que não podemos simplesmente usar o driver oficial do MongoDB como mongodb dot save e jogar dentro de algum objeto que queremos salvar. Não é confortável trabalhar em um projeto enorme, mesmo no projeto médio, não é tão confortável porque você não tem nenhuma abstração. Você está escrevendo um código de nível super baixo, como você precisa salvar dados no banco ou como você os lerá. Na verdade, é por isso que preferimos usar rampas dentro de nossos projetos de back-end. O que são Ram Dass rápido, definimos algo como modelos, que são nossas entidades dentro do nosso projeto. Por exemplo, temos um usuário que talvez tenha tarefas ou você tenha quadros se estivermos falando sobre aplicativo de trilha e assim por diante. E então podemos definir quais relações entre esses modelos. E então todas essas relações são feitas de uma maneira muito mais fácil. Podemos fazer isso sozinhos com o MongoDB, o que significa que simplesmente escrevemos menos código. É por isso que, neste vídeo, queremos nos concentrar em nosso modelo de usuário. E a primeira coisa que eu quero fazer dentro da fonte, eu quero criar uma pasta de tipos. E, na verdade, estamos bem aqui TypeScript, o que significa que devemos aproveitá-lo. E isso é muito importante para investir mais tempo em TypeScript do que em escrever seu código. Nesse caso, será mais fácil para você desenvolver seu aplicativo. É aqui que aqui nos tipos de fonte eu quero criar pontos ts da interface do usuário. E como você pode ver aqui, eu tenho essa notação em que temos um sufixo do que exatamente é. Por dentro, quero criar nossa nova interface de usuário. E se você não conhece o TypeScript muito bem, esta é apenas uma definição do objeto que podemos usar em qualquer lugar. Neste caso, estamos usando a interface do Word, que é uma palavra reservada dentro do TypeScript. E aqui definimos um usuário de interface e podemos definir quais campos temos dentro de nosso usuário. Em primeiro lugar, devemos criar um e-mail, porque e-mail é o que estamos usando no aplicativo para registrar o usuário, validar esse usuário e enviar e-mail para o usuário. Além disso, precisamos aqui de um nome de usuário e ele será transmitido e a senha também será necessária. E, obviamente, devemos usar o hash de uma senha e nunca interromper as senhas apenas como uma tensão de avião. E por último, mas não menos importante, aqui será criado em, não precisamos usar esse campo, mas é muito bom tê-lo, antes de tudo, para fins de depuração. E em segundo lugar, podemos obtê-lo do Mongoose imediatamente e será um encontro. Então, é assim que uma interface de usuário está parecendo. Agora, em toda a nossa aplicação, em nosso back-end, podemos usar essa interface de usuário. Agora, à direita, quero criar um modelo para esse usuário. É por isso que na fonte podemos criar uma nova pasta chamada modelos. E lá dentro podemos registrar pontos ts do usuário, e esse é o nosso modelo. Isso é exatamente algo para Mongoose. Então, o que eu quero escrever aqui é nosso esquema de usuário. E o que isso significa aqui, definimos um esquema do nosso modelo. E para isso, estamos usando um novo esquema. E como você pode ver, eu não tenho nenhum preenchimento automático. Então, vamos tentar importar aqui o esquema. E como você pode ver, eu não tenho uma entrada correta aqui. Eu tenho outra entrada do inspetor, e isso não está correto. Então, vou digitar aqui o esquema de entrada do mangusto. Vamos verificar se temos um erro. Não temos um erro, o que significa que isso foi apenas um problema do meu editor. Aqui eu posso inspecionar o esquema, que significa que ele está realmente disponível com o TypeScript dentro. Aqui estamos bem no seu esquema. E agora, dentro de colchetes redondos, podemos definir nosso objeto, mas o esquema não é o que usaremos dentro do aplicativo. Deveria ser um modelo. É por isso que aqui podemos escrever isso e exportar o modelo padrão. E esse modelo também vem do Mongoose. Então, vamos colocar aqui o modelo de vírgula. E aqui model é uma função em que fornecemos nossa string. Ele será usado com grande matiz. E há um segundo argumento. Fornecemos aqui um esquema de usuário. É assim que definimos um modelo dentro do Mongoose. Então, aqui podemos exportar o modelo padrão que fornecemos aqui e nome e nosso esquema. E aqui devemos definir nosso esquema. Mas estamos certos no TypeScript. E, na verdade, não é a melhor maneira de criar um novo esquema. Por que isso? Aqui destacamos nosso esquema e você pode ver que muitos n estão aqui e isso é ruim. Por que isso? Porque não definimos nenhum tipo do nosso esquema. É por isso que o que queremos fazer. Queremos criar uma definição do esquema para um usuário. Então, eu quero pular aqui à esquerda e criar aqui uma interface especializada. Portanto, é uma nova interface para o documento do usuário. Aqui está uma grande diferença, temos aqui uma interface para o usuário. Isso é apenas usuário com os campos e isso é usar um documento. Isso é o que estamos usando apenas para mangusto. E aqui eu quero escrever x tans. E se você não sabe com o que se estende, basta pegar todos os campos do nosso usuário aqui. Então eu quero escrever aqui estende o documento de vírgula do usuário. E, na verdade, esse documento deve ser carregado do Mongoose. Então, aqui no topo, eu preciso escrever um documento de entrada do mangusto. E, na verdade, por enquanto, não precisamos fornecer nada lá dentro. E você pode perguntar agora, ok, mas não faz nenhum sentido O que fez estava aqui fora. Criamos um documento de usuário de interface. Aqui estamos simplesmente usuários e documentos estendidos. E sim, faz sentido porque, antes de tudo, temos nosso usuário de interface. Podemos usá-lo em qualquer lugar. Essa é a nossa parte, mas também a misturamos com o documento. E o documento está vindo do Mongoose. Esta é a definição do documento e parte rápida e importante é, por exemplo, esse AD, porque cada documento dentro do mongodb tem NAD. E neste caso aqui, não precisamos especificar se o usuário tem AD, ele vem do documento do mangusto. E agora podemos pular aqui à direita e usar frequentemente o esquema. Podemos fornecer em tanques um documento de usuário que acabamos de criar. E agora eu posso inseri-lo aqui no topo. Portanto, é da nossa interface de usuário de tipos. Neste caso, estamos dizendo que nosso documento do usuário é o que precisamos fornecer dentro do esquema de nossos usuários. E exatamente o mesmo que podemos fazer com nosso modelo aqui, podemos fornecer nosso documento de usuário. E se você não sabe o que essa parte significa, isso é na verdade um genérico, o que significa que estamos fornecendo o tipo genérico. Pode ser o que for por padrão que fosse qualquer um. Mas se agora inspecionarmos nosso esquema, você pode ver que ele não é mais. Aqui temos nosso documento do usuário, e isso é extremamente importante para nós e para a validação do TypeScript. Porque na verdade aqui, agora dentro do que eu quero fazer, eu quero jogar algo que não existe dentro do usuário. Por exemplo, digamos que temos dentro do formulário de propriedade do usuário. E aqui dentro, queremos fornecer que o tipo é string. E eu estou salvando isso e depois entro aqui e estreitando que o argumento do tipo foo não é atribuível ao parâmetro do tipo. E aqui podemos ver nosso nome de usuário de e-mail, senha criada adicionar ID de sublinhado, que vem do documento e aqui para sublinhar a versão. O que realmente significa que, se não tentarmos este documento do usuário aqui, não obteremos nenhuma validação do TypeScript. É extremamente importante que estejamos conseguindo. Agora, dentro da máscara, forneça todos os campos. Chairman d'etre para nosso usuário. E vamos começar com o e-mail. Então aqui nosso campo é e-mail e depois disse: Devemos fornecer o tipo, é uma string. Em segundo lugar, aqui podemos dizer propriedade necessária e, como você pode ver, TypeScript nos ajuda e mostra quais propriedades podemos fornecer informações Mongoose. Então, na verdade, é necessário, mas pode fornecer uma matriz com alguns dados e mensagens válidos. Porque, na verdade, queremos mostrar no front-end e uma boa mensagem quando nosso e-mail não é válido. Portanto, não é apenas uma corda. Este é um e-mail inválido. E para isso, podemos inserir aqui no validador superior. Então, aqui eu quero inserir dados válidos para o validador John. E como você pode ver, estamos recebendo um módulo de erro. validador não está instalado, então devemos entrar no nosso servidor. Aqui estou parando o servidor web e eles escreverão aqui deficiências tau dados válidos, mas isso não é tolerável. Também quero obter tipos para este pacote. Isso é y here at types slash valid data, mas deve ser instalado no modo de desenvolvimento. Então aqui, não se esqueça, menos t. Agora podemos abrir à direita, são empacotados em JSON e, como você pode ver aqui nas dependências de desenvolvimento, tenho tipos validador e independências validadas. Agora, aqui não temos nenhum erro para os dados válidos, que possamos especificá-los dentro de required. E, na verdade, aqui, estou um pouco errado. Este não é um campo obrigatório porque, em vez disso necessário simplesmente fornecer se for obrigatório ou não. No nosso caso, o e-mail é obrigatório. Aqui, como segundo parâmetro, podemos fornecer uma mensagem de erro se estiver vazia. E aqui podemos fornecer e-mail é necessário. E depois disso, temos nossa validação. É aqui que temos uma propriedade validada, e é exatamente aqui que queremos usar nosso validador. Então, aqui eu posso escrever um ponto de validação e estamos obtendo um bom preenchimento automático por causa dos tipos. E aqui vou escrever é um e-mail. Então, aqui temos muitas validações. E onde eu obtenho uma validação de e-mail pronta para uso. E há um segundo argumento que podemos fornecer aqui, o e-mail inválido. Por último, mas não menos importante, quero criar índices. E, na verdade, se você não sabe o que são índices, essas são coisas que podem tornar suas solicitações de banco de dados mais rápidas. E em segundo lugar, ele pode tornar, por exemplo, o campo de e-mail único. Nesse caso, quero escrever índices de criação. E aqui como um objeto, estou fornecendo insights, únicos, verdadeiros o que ele faz, ele lê nosso e-mail é um índice único neste caso, mas não consigo salvar duas pessoas com o mesmo e-mail. Então, mais uma vez, dentro do esquema do mangusto, estamos fornecendo todos os campos que precisamos para o nosso usuário. E o primeiro campo era um e-mail aqui, mas deve fornecer um tipo dentro. E essa é exatamente a linha de carga que precisamos por padrão. Mas, na verdade, podemos fornecer aqui obrigatório, o que podemos definir em verdadeiro ou falso, aqui podemos fornecer alguns validadores e podemos criar índices. E, na verdade, podemos fazer todas essas coisas assim dentro do driver MongoDB do avião. É por isso que eu prefiro usar o Mongoose porque é em um reino em que estamos tirando todas essas coisas da caixa. Nosso próximo campo é nosso nome de usuário. Então, aqui podemos fornecer nosso nome de usuário e será mais fácil. Em primeiro lugar, o tipo será string e, em segundo lugar, required deve ser true. E aqui também quero fornecer o erro de validação. É por isso que usaremos a mesma notação com a matriz. Aqui é verdadeiro e o nome de usuário é obrigatório. Agora podemos copiar e colar esse usuário porque será o mesmo. E a última, o que temos aqui é nossa senha e nossa senha é tipo string, e também é necessária, mas aqui a senha é necessária. E a última coisa que queremos fazer é selecionar false. E, na verdade, o que select false está fazendo, ele nunca selecionará esse campo quando estivermos fazendo alguma solicitação. Por exemplo, queremos obter um usuário por ID do banco de dados. Não conseguiremos esse campo de volta. E isso é extremamente importante porque faz com que nosso aplicativo seja salvo. Não importa quais consultas estamos escrevendo. Sempre sabemos que não receberemos uma senha de volta, o que significa que estamos, por padrão, no lado seguro. Por último, mas não menos importante, o que eles querem fornecer aqui são carimbos de data/hora. Assim, podemos fornecer aqui dentro de um objeto e podemos escrever aqui carimbos de data/hora, e aqui estamos definindo-o como verdadeiro. Nesse caso, nossa propriedade CreateDat será gerada diretamente pelo mangusto. Mas, como você pode ver aqui, há um erro de digitação. Não precisamos fornecer o assunto aqui. É um segundo argumento depois do nosso objeto, que na verdade significa no novo esquema como uma função que estamos fornecendo em primeiro lugar, esse objeto com todos os nossos campos e, em segundo lugar, o objeto com carimbos de data/hora verdadeiros. Portanto, este é o segundo documento de como o novo esquema. Então, estamos prontos com a primeira parte do nosso modelo. Mas temos um problema muito grande aqui se tentarmos usar nosso usuário assim. Por exemplo, aqui podemos escrever um novo usuário e foram fornecidos dentro de um objeto com senha de nome de usuário de e-mail. E depois disso, chamaremos de seguro e, em seguida, nosso usuário salvará diretamente essa senha como string simples. Isso é proibido, isso é errado e nunca devemos fazer isso. É por isso que devemos corrigir esse problema. O que podemos fazer sobre isso, devemos fazer hash de nossa senha antes de armazená-la no banco de dados. E para isso, podemos usar uma biblioteca muito boa, que é chamada de cripta. E essa é a solução mais popular. Faça hash na senha. É aqui que devemos entrar no console e instalar este pacote. Então, o npm instalado be crypt jazz e também queremos instalar digitações. Então, aqui no types slash be crypt jazz, mas obviamente deve ser width menos t. Então, vamos verificar o som. Estou pulando para o pacote JSON. E aqui eu vejo os tipos serem cristãos nas dependências de desenvolvimento e serem independentes da cripta. Isso está completamente correto. Agora, o que podemos fazer aqui, podemos definir a oração de pontos do esquema do usuário. E essa é a possibilidade de executar alguma função antes de algo. Aqui, estamos interessados em fornecer segurança, o que na verdade significa que executaremos nossa função diretamente antes da segurança. Então, aqui eu quero escrever uma função sinc e eles dirão Por que estou usando a função aqui e não a função de seta em um segundo. É muito importante escrever assim. E aqui estamos obtendo o Next. E agora aqui temos colchetes e podemos fazer algo por dentro. A ideia principal é que podemos fazer o que quisermos aqui com nosso objeto. E depois disso, quando mudamos de assunto, por exemplo, devemos ligar em seguida e, em seguida mangusto prosseguirá com o salvamento de nossos dados. E a pré-venda significa que essa função será chamada, primeiro depois de Criar e depois após a atualização. E isso é exatamente o que queremos. Por exemplo, queremos não apenas criar uma senha para o usuário, mas também atualizar posteriormente no formulário de atualização. E a primeira condição que eu quero escrever aqui é assim. Caso contrário, esse ponto é modificado. E como você pode ver, temos uma função modificada e podemos fornecer insight palavra, senha, e então queremos apenas não fazer nada e retornar em seguida. Então, o que estamos fazendo aqui, estamos verificando se nosso campo de senha foi modificado. Não é o caso foi criado porque lá teremos uma senha, mas é o caso da atualização se as sugestões do usuário e não alteramos a senha, então não faz sentido aplicar essa função. Este é o caminho aqui onde frango, ok, se o campo da senha não for modificado, então simplesmente dizemos para o Mongoose, vá em frente. Agora, como você pode ver aqui, escrevemos uma função sinc e não uma função de erro. E é importante aqui porque queremos usar aqui essa propriedade. E para ter uma referência correta , devemos escrevê-la como uma função e não uma função de seta, porque outro caso, isso será executado e também usamos aqui uma função sinc porque a operação da cripta será síncrona. Então, depois disso, eu quero escrever try-catch. E, na verdade, se obtivermos algum erro, será cripta, então entraremos na jaula. Aqui, estamos recebendo nosso erro e queremos devolver essa Sarah para dentro em seguida. Aqui estamos jogando dentro do Azure como erro. E você pode perguntar, ok, mas por que esse estranho erro de notação é como era? Na verdade, se você tentar escrever assim, receberemos um erro. Argumento do tipo desconhecido não é atribuível ao parâmetro do tipo callback error ou undefined, o que na verdade significa que dentro de uma gaiola, todo Azure é desconhecido, o que é óbvio porque isso é esboço e não sabemos o que aconteceu. É por isso que estamos escrevendo catch, mas na verdade não podemos usar flecha assim e podemos fornecê-la dentro de seguida, é por isso que devemos converter um tipo de nossa era em algo significativo. Nesse caso, estou usando a seta S e podemos fornecer erros dentro da próxima função. Isso é exatamente o que estamos fazendo aqui. Agora devemos tentar nossa lógica para hash da senha. E para isso eu quero, no topo, inserir nosso módulo js grande e rasgado. Então, estou inserindo be crypt jazz do Big Rip jazz. E agora, dentro da nossa tentativa, podemos primeiro obter um sal. E se você não sabe Para ser cripta onde gerar e primeiro sal e , em seguida, fornecemos na função descriptografar para hash a senha. Este é o caminho aqui, precisamos pegar um sal. E para isso nós somos Colin be crimped js dot gen salt. Como você pode ver, esta é uma função que são sincronicamente gera sal rápido. E aqui podemos fornecer dez, por exemplo. E essa é uma função assíncrona. É aqui que devemos tentar esperar, para obter sal rápido. E agora aqui devemos atualizar nossa senha. E, na verdade, essa função é chamada antes de salvarmos esse registro, o que significa que, com isso, temos uma referência a todos os campos que estamos tentando salvar. E aqui vou escrever essa senha de ponto para alterar nosso campo que estamos tentando salvar. Aqui queremos atribuir um hash de ponto de xadrez creep de peso B e, na verdade, hash como você pode ver aqui, teremos nossa senha e primeiro lugar, devemos fornecer nossa senha, essa senha. E em segundo lugar salt, neste caso, nossa senha será criptografada e apenas armazenaremos um hash dentro de nosso banco de dados. Nesse caso, depois de ligarmos seguida e precisarmos fazer isso com certeza, essa senha será atualizada e salvaremos o registro limpo. É por isso que, por dentro, queremos escrever return next e simplesmente o chamamos, isso acionará o salvamento de um registro no banco de dados. E a parte mais importante que redesenhar essa lógica dentro do modal vendeu essa lógica com a economia é completamente isolada dentro do modelo. E quando escrevermos algum código relacionado ao usuário, nem saberemos sobre essa lógica. Está tudo dentro do modelo. Não tem nada a ver com encontrar um usuário ou salvá-lo. É o que está acontecendo dentro do modelo. A última coisa que precisamos para o futuro é a função validar senha. Por que precisamos disso? Porque, na verdade, quando vamos tentar fazer o login do usuário, queremos comparar não apenas o e-mail, mas também a senha fornecida. E temos uma coisa muito boa que é chamada de métodos dentro do Mongoose. Então, aqui podemos escrever métodos de esquema de usuário e aqui queremos criar um novo método, por exemplo, validar senha. E, na verdade, está funcionando exatamente da mesma maneira, como por exemplo, métodos dentro de classes. Assim, podemos chamar nossa instância do nosso usuário. Esse método valida a senha. E aqui devemos fornecer a função. E, novamente, não estou escrevendo aqui a função de seta, mas apenas uma função aqui obtendo a senha como parâmetro. Porque, na verdade, quando queremos comparar uma senha, forneceremos algo que queremos comparar. Aqui, a senha é uma string, e aqui dentro queremos comparar a senha fornecida com senha dentro de nossa instância. Então, aqui podemos simplesmente retornar be grip js dot compare. E esta é uma função para comparar, em primeiro lugar, uma senha de avião que é fornecida de fora. E em segundo lugar, nossa string, e essa é essa senha de ponto que estamos armazenando como um hash dentro do nosso registro. Portanto, nosso uso mais recente ficará assim, onde aqui, por exemplo, temos um usuário e queremos salvá-lo. Então, aqui temos um novo usuário. Devemos fornecer dentro do nosso e-mail. Em seguida, devemos fornecer aqui um nome de usuário e, em seguida, forneceremos aqui uma senha. Depois disso, tentaremos salvar um usuário. Então, aqui vamos chamar de uso. Isso economiza. E, na verdade, depois de Colin tão fino, nossa imprensa Salvar será chamada e armazenaremos a senha correta. Mas depois dessa linha, também podemos escrever uma senha de validação de ponto de usuário. E aqui podemos fornecer qualquer senha que quisermos comparar. Essa função retornará para nós verdadeiro ou falso, dependendo da exatidão da senha. E isso é totalmente correto para fazer todas essas coisas dentro do modelo do usuário e não dentro de alguns controladores onde simplesmente trabalhamos com usuários. Porque neste caso nossa lógica está completamente isolada dentro do usuário. E agora estamos perdendo apenas uma única linha aqui dentro de nossa interface de usuário de tipos com documento de usuário definido. Mas, na verdade, devemos especificar dentro deste documento do usuário que escrevemos aqui um novo método, validar senha. É por isso que o que eu quero fazer aqui, eu quero criar um novo método dentro de validar senha. E sabemos que por dentro estamos obtendo algum parâmetro, podemos apenas chamá-lo de param1, e isso é uma string, e sabemos que de volta estamos recebendo uma string. Nesse caso, usarei um documento digitado completamente corretamente e podemos usá-lo mais tarde dentro do TypeScript para chamar esse método de validação de senha e obter o preenchimento automático. 10. Adicionar registro: No vídeo anterior, criamos com sucesso nosso modelo de usuário. E eles podem entender que vídeo anterior estava realmente seco porque acabamos criar um modelo e você não viu como usamos esse modelo em um aplicativo real. É por isso que o objetivo deste vídeo é criar nosso método de registro, o que significa que registraremos o usuário, e é exatamente assim que usaremos nosso modelo de usuário. Então, vamos dar uma olhada em nosso código. Por enquanto, temos apenas um modelo dentro dos modelos de origem. E o que queremos construir é a arquitetura MVC. O que isso tem um meio realmente interno expresso como uma estrutura. Não temos nenhuma arquitetura expressa com algumas rotas simplesmente definidas iniciar o servidor da web e estamos prontos para ir. Não temos muitas regras definidas internamente expressas. É por isso que devemos fazer algo por conta própria. E a arquitetura muito popular que usa bem nosso projeto de back-end é o MVC, que na verdade significa visualização de modelo e controlador. E, na verdade, 90 por cento dos casos, usaremos apenas modelos e controladores. Não usaremos nenhuma visualização só porque estamos trabalhando e criando um EPI e não precisamos renderizar visualizações lá. Nós apenas respondemos com o castigo e é isso. É por isso que minha ideia é criar uma nova pasta chamada controllers. A ideia principal é que aqui, em vez disso irmandade S registre todas as nossas rotas. Por exemplo, aqui temos uma rota para a página inicial. A ideia principal é que não estamos escrevendo a lógica dessa rota aqui diretamente como um retorno de chamada, vamos escrevê-la em um controlador específico do site, o que na verdade significa que todos os nossos pedidos queremos dividir controladores diferentes. Por exemplo, temos um controlador de usuário e houve tumultos em todas as nossas ações em relação ao registro, login, obtenção de login do usuário e assim por diante. Em seguida, temos um controlador de placa onde escreveremos dentro de tudo o que está relacionado à placa. A parte mais importante é que o modelo interno definiria como estamos trabalhando com o banco de dados. Então, criamos nossa entidade como usuário, mas dentro da maneira do controlador usando essa entidade. E estamos construindo algumas respostas da nossa API, o que na verdade significa que estamos separando nossa lógica. Tudo o que era banco de dados está indo para modelos, mas estamos usando modelos em tais controladores. Então essa era a teoria. Agora vamos criar nosso primeiro controlador. E para isso eu quero me registrar aqui em sua rota, e será uma rota para registro. É por isso que aqui temos uma postagem no aplicativo e o URL será de usuários slushy pie slash. Aqui estará o registro de pontos do controlador de nossos usuários. Portanto, nossa primeira regra aqui é que todos os nossos URLs, começaremos com a API de barra, porque na verdade é muito bom ter um namespace para nossa API. Em segundo lugar, como você pode ver onde não é importante, algo como registrar onde as entradas aqui controlam todo o usuário e precisamos ter uma boa nomenclatura. O nome típico e para controladores é sempre com ativo do que, por exemplo, um controlador de usuário e não um controlador de usuário. Agora vamos importar a estrela à medida que os usuários a controlam. E se você não sabe o que isso está fazendo, a ideia principal é que por dentro teremos um monte de funções. E desta vez como grupos, todas essas funções dentro desse objeto. E então podemos escrever algo como registro de ponto de controle de usuários. Então, aqui queremos importá-lo, e aqui temos nossa barra de controladores, e aqui vamos criar usuários de arquivos. E como você pode ver, não faz sentido nomear esse arquivo como controladores de usuários, porque esse arquivo está situado diretamente dentro dos controladores. Este é o caminho aqui, Vamos pular para que ele controle. E aqui está o users.js. E este é o nosso arquivo que é um controlador. E então diga que estava certo, todas as ações que estão relacionadas à entidade do usuário. Agora à direita, quero abrir nosso servidor Ts. E como você pode ver, na verdade essa parte que você pode ver aqui é o que estamos escrevendo dentro do controlador. Então esse é o nosso retorno de chamada. E, como você pode ver, essa é apenas uma função simples com a resposta da solicitação. E o terceiro parâmetro aqui pode ser o próximo. É por isso que o que eu quero fazer aqui, eu quero criar uma função que é chamada register. E essa é uma função assíncrona. Por que precisamos aqui em uma função síncrona, porque trabalharemos com banco de dados e essas solicitações para nosso banco de dados ou como síncronas. E aqui estamos recebendo como argumento, antes de tudo, pedido, segundo resposta, e o último é o próximo. E isso é apenas uma função. Então isso é exatamente o mesmo que estamos colando aqui diretamente, mas acabamos de movê-lo para fora, dentro do nosso controlador. Mas esse código é ruim. Por que isso? Porque, na verdade, aqui não digitamos nossa resposta de solicitação. E a seguir, então aqui posso escrever dois pontos, e aqui temos nosso pedido. E essa é a parte mais importante. Aqui temos uma solicitação que vem da API Fetch. Nós não precisamos disso, mas precisamos é de um pedido que vem do expresso. Este é o y aqui, pedido de importação do expresso. E como você pode ver agora, temos uma definição completamente diferente. Temos aqui dentro vestido, corpo, corpo de pedido. E isso é exatamente o que precisamos. Além disso, precisamos aqui não apenas de solicitação, mas de resposta, e estou na Grã-Bretanha aqui também de resposta. Digite aqui a resposta como resposta. E a última não é a próxima, mas a próxima função. Aqui, nossas duas entradas estão corretas. É de expresso. Então, é assim que normalmente criaremos uma nova ação do controlador. Não importa se é um controlador de usuário ou se é algum controlador de artigo, será sempre o mesmo. Agora, diretamente lá dentro, eles querem escrever try-catch. Por que isso? Porque, na verdade, escreveremos um código síncrono com async await dentro dessa função. E queremos lidar com todos os erros. E a maneira mais fácil foi expressa para lidar com um erro é usando next, e já o usamos anteriormente dentro do nosso modelo. Aqui está funcionando exatamente da mesma forma. Então podemos escrever aqui, tentar e temos gaiola e estamos recebendo algum erro. O que queremos fazer, o que chamar aqui seguir e jogar dentro do erro. É isso, na verdade, esta é uma única linha que propagará nosso erro para expressar, e então express mostrará a Sarah na tela. Agora, por dentro, queremos criar um usuário porque, na verdade, esse é o registro e o registro significa simplesmente criar um usuário. É por isso que aqui eu quero importar o modelo do usuário. E aqui temos nossos modelos slash user model que criamos anteriormente. E como você pode ver aqui, eu não nomeei usuário com U maiúsculo, mas usei o modelo. Isso é apenas para ficar bem claro dentro do nosso código que estamos trabalhando com o modelo. E agora podemos usar esse modelo por dentro. Então podemos escrever aqui const, e aqui está o novo usuário, porque aqui queremos registrar um novo usuário e estamos bem aqui no modelo de usuário hue. E agora, por dentro, devemos passar alguns dados. No nosso caso, devemos passar aqui em masculino do que nome de usuário e senha. Então, aqui queremos escrever isso. Queremos definir um e-mail, e isso é request dot body dot email. Então, queremos definir aqui nome de usuário, e isso é request dot, dot username. E a última é a senha, e é a senha do ponto do corpo do ponto da solicitação. Mas aqui temos um grande problema. Por padrão, o express não pode funcionar com fervura e, por padrão, o express não passa um tau. É por isso que o que devemos fazer, devemos instalar um pacote adicional para isso. E esse pacote se chama BodyParser. É por isso que vou entrar no console e estar ciente de que estou dentro do servidor. Vou escrever npm install. E aqui queremos instalar o BodyParser. Estou pressionando Enter e o pacote está instalado. Agora podemos iniciar nosso servidor novamente e voltar atrás. Então, a ideia principal é que aqui, em vez da irmandade S, vou importar meu analisador corporal. Então, aqui vamos chamá-lo de BodyParser com CamelCase e estamos importando do pacote BodyParser. Agora, em algum lugar aqui, antes de fazermos nossas rotas, podemos escrever ab use e por dentro queremos experimentá-lo bodyParser dot json. E, na verdade, aqui você pode verificar diretamente o que o BodyParser Jason está fazendo e ele retorna um middleware, o tom labial analisa JSON e é exatamente isso que queremos. Queremos passar nosso JSON, mas não é apenas isso, mas também queremos mais um analisador de corpo de IPOs. E aqui será codificado por URL de ponto. E, por dentro, estamos fornecendo informações estendidas através do que essas duas linhas estão fazendo. primeira linha procurará apenas aplicativo de tipo de conteúdo json e , em seguida, os pais de um corpo no JSON. Assim, podemos trabalhar com nosso corpo como um objeto e isso é extremamente fácil. Na próxima linha, faremos exatamente o mesmo mas para strings codificadas por URL. E então também obteremos nosso corpo. Assim, com essa configuração em cada projeto, você pode trabalhar normalmente com a API onde você tem o corpo como adjacente. E isso é exatamente o que estamos fazendo aqui. Estamos lendo corpo a pedido. Agora eu quero fazer o log do console aqui nosso novo usuário para que possamos verificar como ele se parece. E depois disso, quero tentar salvar o usuário. Então, aqui podemos experimentá-lo usuário salvo, e aqui podemos chamar um peso em seu usuário dot save. Esta única linha criará um novo usuário na França dentro do banco de dados. É por isso que aqui eu quero registrar o console do usuário salvo, coma, usuário salvo. Agora eu quero usar essa ferramenta que é chamada Postman para fazer o pedido. E se você não tem carteiro em sua máquina, você pode simplesmente pular para Postman. Não carregue aqui. É totalmente gratuito. Ele tem níveis pagos, mas não precisamos deles para o nosso curso. Aqui, parece que sim. E, na verdade, o que queremos fazer, queremos fazer uma solicitação de postagem em nosso URL. E aqui temos nosso host local para 1001 usuários slash slash. Agora, aqui devemos pular para o corpo e selecionar aqui errado. E à direita podemos dizer que isso é adjacente. Agora, o que queremos passar por dentro é um objeto com três campos. Em primeiro lugar, temos aqui e-mail, por exemplo, foo em gmail.com. Em seguida, temos nosso campo de nome de usuário, por exemplo foo, e nosso campo de senha, por exemplo, 123. Agora vamos enviar uma solicitação e verificar se está funcionando. Como você pode ver, a solicitação trava. E isso é completamente normal porque na verdade aqui , mas não chamou de descanso Jason, por exemplo. É por isso que é revólver. Mas agora podemos pular para dentro do console e essa é a nossa saída. Em primeiro lugar, aqui podemos ver nosso novo usuário. Isso é antes de salvar. Então isso é o que temos depois de Colin, novo modelo de usuário, o que na verdade significa que estamos jogando dentro desses três campos e obtendo usuários de um Goose. E como você pode ver, a principal diferença do nosso objeto é que temos aqui o NAD, que é um AD do MongoDB, e ele foi gerado automaticamente rapidamente. E, na verdade, depois disso, podemos usar esse novo usuário e salvá-lo, por exemplo, banco de dados com o método dot save, o que é extremamente fácil. E a parte mais importante é aqui o usuário salvo. Este é o nosso usuário salvo, que vem do banco de dados. Como podemos dizer que ele já está salvo. Em primeiro lugar, aqui vemos nossa senha e, na verdade, nossa senha aqui. Demos 123, mas aqui não salvamos como 123. É uma senha com hash. Por que isso está acontecendo? Porque na verdade definimos o modelo e aqui temos um método pressione Salvar. E só para lembrá-lo, aqui geramos um hash da nossa senha e salvamos esse hash com a cripta em vez da senha. E esse é um padrão extremamente importante. Não queremos escrever aqui nenhuma lógica em relação à alteração da senha para o hash. Não faz nenhum sentido porque queremos definir um modelo com alguma lógica. E então isso acontece magicamente porque está definido. Neste caso, aqui salvamos, acabamos de alterar nossa senha e hash e dentro do nosso controlador não sabemos nada sobre isso. Os mesmos objetivos sobre esses campos criados em e atualizados em. Esses dois campos foram adicionados para nós porque aqui definimos carimbos de data/hora verdadeiros. Portanto, nosso usuário foi salvo com sucesso no MongoDB. Mas, na verdade, não podemos simplesmente jogar o usuário salvo como resposta. É que, antes de tudo, não precisamos de todos os campos e, com certeza, nunca devemos fornecer essa senha fora. E, na verdade, só para lembrá-lo aqui, dentro do nosso usuário de modelos, dissemos que a senha não está selecionada, ela é selecionada como falsa. Mas, na verdade, depois que salvamos o usuário aqui, essa senha é devolvida rapidamente. E, na verdade, se estivermos fazendo algo bem, não receberemos o campo de senha. Mas depois de salvar, o usuário obviamente está conseguindo. É por isso que devemos criar uma boa resposta que atenda às nossas necessidades. É por isso que aqui eu quero criar uma função adicional, normalizar o usuário. E aqui estamos recebendo o usuário e sabemos que este é o documento do usuário. E como você pode ver nosso documento do usuário, podemos inserir a partir de tipos de interface do usuário. Só para lembrá-lo, usar um documento é exatamente como um objeto de usuário com ID e método de validação de senha. E como você pode ver aqui, podemos inspecionar novos usuários e podemos ver que isso é usar um documento e a propriedade, isso é exatamente o que estamos passando aqui e aqui dentro desta função, queremos retornar o normalizado para o usuário da API. Então, primeiro de tudo, aqui teremos um e-mail, este é o email ponto do usuário. Então queremos nosso nome de usuário. Ele será usado nome de usuário, e o último é 80, é o ID do ponto do usuário. E só para lembrá-lo, no MongoDB ou as mulheres são armazenadas com ID de sublinhado. Mas, na verdade, aqui dentro do Mongoose, podemos usá-los de ambas as formas, como ID de sublinhado e como ponto AD. Esse método já existe e é simplesmente como referências sublinhado id. Então vou normalizar o uso de uma função está completamente pronta e agora podemos chamar aqui comer quando respondermos com esse usuário salvo. Então eu posso simplesmente escrever aqui como areia e por dentro estamos passando usuário normalizado e aqui está nosso usuário salvo. Vamos verificar se está funcionando. Não temos nenhum erro aqui no servidor da web. Vou abrir aqui Postman e clicar em Enviar novamente. E como você pode ver com sucesso em nosso usuário normalizado e não chegamos aqui, por exemplo, senha de volta, o que é extremamente importante. Mas aqui está algo que eu não gosto em nossas respostas. Na verdade, fizemos alguma validação dentro de um modelo. Mas se eu remover aqui o nome de usuário e clicar em Enviar, chegaremos aqui 500. E esta é, na verdade, uma página HTML com alguma validação aqui. Não é isso que queremos, o que podemos fazer aqui, podemos usar o esboço e ler mensagens da nossa época. Mas o principal problema é que nosso erro nem sempre é erro de validação. Pode ser, por exemplo, 500, mas também podemos obter erros de validação. E a maneira mais correta de verificar isso dentro do TypeScript é assim, onde bem aqui que estão o Azure é a instância erro de validação do Azure DOD. Mas aqui é importante inserir o erro corretamente porque queremos importar esse erro do Mongoose. Então, aqui estou eu informando nossa era do Mongoose. Neste caso, ele será tratado corretamente porque, na verdade, aqui, era que o erro de validação é uma classe de mangusto. E se tivermos algum erro de validação do Mongoose, podemos trabalhar com eles aqui. Agora vamos tentar dentro log do console e verificar o que estamos obtendo aqui. Vou clicar em Enviar novamente. E como você pode ver dentro do console, estamos recebendo aqui erros. E isso é um objeto. O que significa que podemos ler as mensagens do assunto e mostrá-las na tela. Aqui eu quero criar uma mensagem de propriedade. E aqui podemos escrever valores de ponto de objeto, que lerão valores de nosso objeto. E por dentro estamos lançando erros de erro. Isso é exatamente o que estamos recebendo do mangusto e queremos passar por todos os campos. E aqui estamos recebendo erros e só precisamos de uma mensagem de erro. Então, isso será uma série de strings. Agora podemos simplesmente escrever o status de risco de retorno, por exemplo, quatro para dois, o que significa entidade não processável. E aqui pontar mensagens JSON, o que na verdade significa que aqui, quando estamos recebendo alguma mensagem de validação respondendo com esse status estamos respondendo com esse status e estamos mostrando essas mensagens de erro, não temos quaisquer erros no console. Então, vamos tentar novamente. Estou batendo aqui e estamos recebendo boas mensagens de erro. usuário é exigido por isso porque aqui verificamos dentro da gaiola, por exemplo, da classe, normalizamos nossas mensagens aqui e respondemos com elas. E, na verdade, faz muito sentido mover essa função mais tarde para algum auxiliar, porque faremos exatamente as mesmas coisas repetidamente, onde temos uma validação. E aqui está o último passo que queremos fazer. Na verdade, precisamos que nosso cliente forneça um token, o que na verdade significa que quando nosso usuário é logger tin, geramos um token exclusivo para fazer uma autenticação DVT. O que isso significa? Temos um token de string especial que estava jogando no cliente. E então o cliente pode anexar isso para ser t ao cabeçalho. E, posteriormente, verificaremos se a solicitação está autenticada e o difusor tem permissão para fazer algumas alterações. Mas neste vídeo, simplesmente precisamos lançar dentro de nossa resposta, o token GBT que geraremos. E para isso, devemos instalar um pacote adicional. Aqui vou escrever o token da web JSON npm install. E não é só que também vai querer começar a digitar. Então, aqui estarão os tipos slash JSON web token. Então, instalamos dois pacotes e, em seguida, reiniciamos meu servidor web. Agora vamos pular de volta. Aqui queremos importar agora nosso JSON Web Token, ou apenas DVT. Então, vamos tentar aqui na produtividade do token da web JSON. E agora o que queremos fazer aqui dentro normalize, e este é o melhor lugar para fazer isso, porque aqui temos todo o usuário e estamos construindo algo que não está relacionado ao banco de dados. Então, queremos gerar aqui nosso alvo. E para isso somos apenas Colin, pontos GBT assinam o interior. Devemos fornecer uma carga útil e alguma chave secreta. Então, o que mostramos a carga útil do insight aqui? Em primeiro lugar, queremos obter um anúncio e este é o ID do ponto do usuário e , em seguida, um e-mail. É user.email. Na verdade, basta fornecermos apenas um ID para que possamos usá-lo posteriormente por ID. Mas também é bom ter e-mail para validação e compreensão com Susan e o que é secreto aqui. É apenas uma string aleatória que nos ajudará a decodificar e depois chamar tokens. Então, o que queremos fazer realmente queremos aqui dentro desses serviços criar um novo arquivo. Por exemplo, config dot ds. Aqui, armazenaremos todas as propriedades necessárias , como, por exemplo, secretas. Então aqui eu só quero exportar, const, nossa propriedade secreta e eles vão chamá-la de segredos, obviamente por razões de produção você quer ter aqui algo mais seguro. Talvez algum hash longo como 12 símbolos sejam. Então agora podemos usar o segredo aqui apenas invertendo nosso segredo para John. E aqui temos nosso arquivo de configuração. Agora, em vez dessa chave secreta ou privada, vou apenas escrever um segredo. Então, o que essa linha faz, ela gera um token que é apenas uma string. E agora precisamos adicionar aqui à nossa resposta, esse símbolo. Vamos verificar se está funcionando, mas não há erros. Vamos pular para dentro. Carteiro, clique em Enviar. Como você pode ver aqui, devo fornecer meu nome de usuário. Então, por exemplo, para, vamos dar uma olhada nisso. Aqui temos todos os nossos campos e também conversamos. E como você pode ver, nosso token é apenas uma string única que anexaremos a todas as suas solicitações no cliente e decodificaremos de volta no back-end, que faremos em nossos próximos vídeos. Por isso, implementamos com sucesso nosso método de registro também com validação e normalização para nossa API. 11. Implementação de login: Nos vídeos anteriores, mas implementamos totalmente nosso método de registro neste vídeo, queremos implementar o início do nosso usuário, mas na verdade eu quero que você tente fazer isso sozinho, porque será super parecido com o registro e já estamos preparados de tudo. Então, o que você precisa fazer com um dedo do pé? Em primeiro lugar, insights server.js, você quer criar uma nova rota. E, na verdade, aqui já temos nossa rota para registro. Agora precisamos criar um para o login. Por exemplo, podemos criar uma string slash api slash users slash login. Agora aqui em tal controlável deve criar um novo método de login. A questão é, obviamente, o que chegaremos lá e o que esse método deve fazer. E, na verdade, inserir Postman, podemos apenas tentar usá-lo. Então, aqui você terá um login de barra e, em vez de e-mail, nome de usuário, senha, simplesmente jogamos nosso e-mail de solicitação e senha. Não temos nome de usuário porque esse é o login e o e-mail é exclusivo. E aqui você tem duas variações possíveis, como você pode implementá-la. A primeira variante é mais fácil. Você simplesmente quer ler um e-mail do corpo. Você quer tentar encontrar o usuário dentro do banco de dados e retornar esse usuário de volta. E, na verdade, não se esqueça de usar o usuário normalizado porque precisamos dessa conversa. E também, se você quiser uma abordagem mais difícil, você também pode tentar validar não apenas o e-mail, mas também a senha para esse método de validação dentro do nosso modelo. Mas mesmo que você tente dar o primeiro passo sozinho, tudo bem. Se você quiser implementar um deles, basta pausar o vídeo agora e agora, vamos fazer isso juntos. Portanto, nosso primeiro passo será pular para dentro ou para as irmandades. Aqui queremos criar uma nova rota. Então, temos aqui um post porque este é um pedido de postagem seguindo o Guinean. E aqui temos o CPI slash users slash login. E aqui está o nosso método de login ponto do controlador de usuários, que criaremos em um segundo. Agora vou pular para salvar o usuário dos controladores e eles não copiarão colarão nada porque queremos e colarão nada porque queremos tentar escrevê-lo do zero. Então, aqui temos nosso método de login e sabemos que este é um método assíncrono em que recebemos nossa solicitação, que é a solicitação exatamente como no topo do registro interno. Em segundo lugar, temos aqui a nossa resposta, que é a resposta do tipo. O último é o próximo, esta é a próxima função. E agora, aqui dentro da nossa função, queremos escrever, tentar pegar. Então, dentro da gaiola aqui, teremos nossa era e eles só querem propagá-la para a próxima era. Por que isso? Porque, na verdade, aqui não teremos nenhuma regra de validação, mas vamos apenas verificar, oh, validação dentro da nossa tentativa e não dentro da captura. O que precisamos fazer lá dentro? Aqui, estamos recebendo nosso corpo de solicitação com e-mail e senha. E nosso primeiro passo é tentar colocar esse usuário dentro do banco de dados. Aqui podemos escrever um K. Precisamos do nosso usuário e tentar novamente com um modelo de usuário de peso para encontrar um. E como você pode ver aqui, encontramos por ID, encontramos e encontramos um. Então, na verdade, usar model.fit find tenta encontrar todos os documentos como uma matriz por algum predicado. Por exemplo, aqui podemos encontrar uma lista por campo ativo. Aqui, encontre um. Faremos o mesmo, mas tudo bem, apenas um único disco. É isso que queremos usar e, às vezes precisaremos encontrar um elemento por ID. Aqui temos uma boa multa pelo método. E como você pode ver aqui, também temos muitos outros métodos, como por exemplo, encontrar um e excluir e atualizar e assim por diante. Mas, por enquanto, usaremos find one e depois dissemos Devemos dar um predicado como um objeto. E aqui temos nosso e-mail e este é o e-mail do corpo de solicitação. Então, na verdade, esse único liner tentará encontrar nosso registro dentro da coleção do usuário por meio deste e-mail. Aqui, como você pode ver onde obter o documento do usuário. Mas na verdade isso não é verdade porque podemos chegar aqui agora e não um documento porque talvez a mulher não exista. Este é o caminho aqui. Quero verificar se não recebemos um usuário, então queremos lançar um erro. E para isso, podemos simplesmente retornar nosso status de ponto de resposta. Aqui temos foto para status como anteriormente. E aqui queremos jogar um pouco de JSON de volta. E, na verdade, aqui com não tem validações diferentes. Em qualquer caso, simplesmente lançamos login ou senha inválidos. Este é o caminho aqui no topo. Posso criar e salvar no objeto nossos erros. Então, aqui eu quero criar erros. Este é um objeto com campo, e-mail ou senha, por exemplo. E aqui o valor é e-mail ou senha incorretos. Portanto, o ponto principal é que temos exatamente a mesma estrutura de nossos erros, assim como temos em todos os outros lugares. Aqui, estamos apenas retornando nossos erros dentro do JSON. Se não tivermos um usuário. Depois disso, podemos responder com nossos usuários. Então aqui está areia e aqui podemos chamar nosso usuário normalizado e foram fornecidos inserir o usuário que encontramos. E, na verdade, se você escreveu esse código mesmo sem esse erro, verifique seu ouro, porque você tentou fazer algo sozinho. Agora vamos verificar se esse código está funcionando. Portanto, não temos nenhum erro aqui dentro do servidor da web. Vamos abrir nosso carteiro e clicar em Enviar. E como você pode ver aqui, na verdade, ele já está funcionando. Aqui está nossa barra api slash users slash login. Esta é uma solicitação de postagem com nossos dois campos. Aqui estamos recebendo o banco do usuário correto com o Tonkin. E, na verdade, se aqui, nosso e-mail não existe, envio oculto e estamos recebendo um objeto com e-mail e senha, e-mail ou senha incorretos, o que realmente significa que temos sucesso implementou nosso pulmão queniano do usuário. Mas aqui estamos perdendo apenas uma pequena coisa, e isso é validado pela senha, mas isso é extremamente fácil de usar Só porque já preparamos tudo dentro do nosso modelo. E só para lembrá-lo dentro do nosso modelo de usuário aqui na parte inferior, temos esse método de validação de senha e estamos usando aqui be crypt compare, onde estamos comparando a senha de o usuário com alguma string. Isso é exatamente o que queremos fazer aqui. Podemos apenas criar uma variável com a mesma senha. Aqui, queremos chamar o usuário dot validate password. E como você pode ver, temos aqui nosso preenchimento automático do TypeScript. E, na verdade, estamos obtendo esse preenchimento automático só porque, dentro do nosso documento de interface do usuário, escrevemos essa linha. Se você não escreveu essa linha aqui, então você não obterá esses preenchimento automático. Então, aqui temos nossa senha de validação e, dentro, queremos fornecer uma string para verificar se ela está correta. E esta é a senha do corpo da solicitação. E, na verdade, se essas senhas forem iguais, chegaremos aqui booleano. Mas, como você pode ver, estamos recebendo uma corda, o que significa que algo está errado. Vamos verificar nossa interface. Validar senha retorna uma string, está errado, deve ser booleano aqui. Agora é a mesma senha retorna falso booleano. E aqui podemos escrever alguma condição. Por exemplo, se nada for a mesma senha, queremos lançar exatamente o mesmo erro. Então, vou copiar e colar aqui. Desde o status dos dois erros JSON, vamos verificar isso. Estou sentado aqui e estamos recebendo esse bom usuário. Mas o que acontecerá se jogarmos aqui a senha incorreta? Estou clicando aqui enviar e estamos recebendo um erro. Então, vamos dar uma olhada no console. Aqui estamos recebendo uma mensagem bastante estranha, argumento ilegal, string indefinida. E como você pode ver aqui em nosso rastreamento de pilha, ele vem do nosso controlador e ouve da nossa linha Model Ts de origem por padrão. Então, vamos pular dentro do nosso modelo Ts linha 44. Como você pode ver, esta é a nossa grande comparação de criptas. A questão é: qual é o problema? É por isso que o que podemos escrever aqui é validar a senha. E aqui temos, antes de tudo, nossa senha e essa senha. E, na verdade, eu só quero ver isso aqui, saber que estamos no lado seguro. Nosso servidor é reiniciado. Então, vamos verificar o som. Estou pressionando enviar olhar sem fim para dentro do console. E como você pode ver aqui, quanto melhor vemos, primeiro lugar, validar a senha. Isso é uma string e aqui está o nosso objeto. Mas como você pode ver neste assunto, com não tem senha, é por isso que não podemos comparar o objeto com a senha porque não temos uma senha. Por que não temos? Porque na verdade aqui no topo, dissemos para a senha, selecione false, o que é completamente correto. Em 99 por cento dos casos, não queremos selecionar uma senha porque ela é segura. Mas, na verdade, neste caso específico , neste método de login não podemos trabalhar sem senha porque precisamos comparar nossa senha do usuário. É por isso que o que podemos fazer, devemos assumir que este encontre um. Então, ele também recebe uma senha. E para isso, podemos escrever dot select. Aqui está uma string dentro que estamos escrevendo mais a senha. E, na verdade, esta é uma notação muito boa porque podemos usar aqui mais senha, menos biografia e assim por diante. Se quisermos remover ou adicionar campos específicos, nesse caso, apenas para essa solicitação específica, estamos recebendo não apenas o usuário inteiro, mas também o campo de senha. E agora, se tentarmos de novo, estou batendo na areia. Podemos verificar e disse console. E agora estamos recebendo nosso usuário com senha, que é hash, e então não temos nenhum erro, mas não está funcionando corretamente porque aqui eu tenho uma senha errada e ainda estamos recebendo usuário, por que isso está acontecendo. E, na verdade, se aqui analisarmos nosso método de validação de senha, estamos usando aqui big crypt compare. A questão é o que estamos recebendo de volta aqui, podemos ver que os Taipings estavam recebendo uma promessa booleana. E isso é extremamente importante. Essa é uma operação assíncrona. Não é síncrono. É assim que devemos voltar para dentro da interface do usuário de nossos tipos. E aqui podemos dizer que estamos recebendo o booleano. Na verdade, é Rami do Booleano. E agora está completamente correto, porque agora, se entrarmos em nosso controlador aqui, usamos a senha de validação. Vemos que estamos recebendo de volta a promessa Boolean Now é a mesma senha prometida Boolean, que não é o que queremos. É aqui que podemos escrever um peso e isso resolverá nossa promessa. E aqui vamos pegar nosso booleano. Como você pode ver, o TypeScript realmente nos ajuda muito a entender as digitações corretas. E sempre podemos verificar o tipo que temos. Aqui. Estamos recebendo a mesma senha e agora ela deve funcionar. Vamos verificar isso dentro de Boltzmann. Estou na areia e estamos recebendo uma mensagem, e-mail com uma senha ou não está correto. Aqui com a senha correta, 123, estamos recebendo de volta nosso usuário e isso é exatamente a solicitação de login implementada. 12. Criar um middleware de auth: Neste vídeo, quero falar sobre middlewares. Então, o que é Middleware? Normalmente, quando estamos fazendo uma solicitação do cliente para o back-end, simplesmente lançamos essa solicitação dentro de nossa rota. E então dentro do controlador, isso é exatamente o que fizemos aqui dentro do nosso servidor de origem. Então, aqui temos dois pós-solicitação, registro e login, e simplesmente entramos em nosso controlador, o que na verdade significa que aqui insira o controlador, estamos recebendo solicitação e resposta. Middleware é algo que pode ser chamado antes de chegarmos aqui, o que na verdade significa que o middleware está sendo aplicado no back-end, mas antes que nossa solicitação seja dois pontos dentro do nosso controlador ou dentro de nossa rota, Kohlberg, fazendo isso middlewares em tudo. Se você precisar fazer algo com solicitação antes que essa solicitação entre no controlador, é exatamente quando você precisa de um middleware. Middleware, precisamos em nosso projeto? Esse é o middleware de autenticação. Por que precisamos disso? Imagine que toda vez que precisamos fazer algo com o Estrategista no usuário, precisamos verificar seu token, o que realmente significa em cada método, como por exemplo aqui registrar, estamos recebendo o token do usuário. Devemos passar esse token. Devemos validar esse token e encontrar o usuário atual com esse token. E não faz sentido escrever esse código em cada ação do controlador. É por isso que devemos criar um middleware que reutilizaremos em todos os lugares. É por isso que eu quero pular aqui dentro da pasta de origem e criar aqui uma nova pasta, que é chamada de meio. Enquanto aqui podemos armazenar todos os nossos middlewares. E o primeiro middleware que devemos criar é o owls dot ts. E, na verdade, o que é Middleware? Isso é só uma função. É por isso que aqui eu quero exportar a função padrão e síncrona. E você pode perguntar, ok, mas por que é um síncrono? Simplesmente recebemos nosso pedido e fazemos algo com ele. Porque, na verdade, aqui também queremos trabalhar com o banco de dados. Se tivermos um token, esse token é válido. Queremos ler uma ideia do usuário a partir desse token e obter esse usuário do banco de dados. Assim, podemos usar esse usuário que será preparado dentro do nosso controlador posteriormente. É por isso que é uma função assíncrona. Aqui estamos recebendo uma resposta de solicitação. E a seguir, exatamente como fizemos anteriormente, aqui, vamos digitar nossa solicitação, então temos nossa resposta. A última aqui será nossa próxima função, que será a próxima função de R expressa. E aqui vou inverter no topo nosso pedido e resposta. E essa função não retorna nada. É por isso que é uma função vazia. E dentro dessa função, queremos ler o token da nossa solicitação, mas não vou envolver diretamente todo o nosso código com try catch. Por que isso? Porque tentaremos fazer alguma solicitação assíncrona ao nosso banco de dados e ela pode falhar. É por isso que aqui é uma boa abordagem escrever try-catch onde estamos pegando nossa flecha e depois a captura lateral. Só queremos assumir riscos e status e aqui estaremos 401. Você pode perguntar, ok, mas por que não mostramos um erro aqui? Porque, na verdade, não nos importamos. Este é um middleware para verificar nossa autenticação. Se por algum motivo não pudermos analisar a conversa e falar e ouvir, válido. Não foi possível encontrar esse usuário em nenhum caso, isso significa que nosso usuário não está logado. É aqui que estamos diretamente com nosso status 401. Agora, aqui devemos ler nosso status. Então, aqui eu quero criar nosso cabeçalho e podemos obter nosso cabeçalho a partir de cabeçalhos de ponto de solicitação, autorização de ponto. Na verdade, isso significa que armazenaremos nosso token dentro do cabeçalho de autorização. E, na verdade, uma abordagem típica, espero que implementemos nossa autorização de dever é que temos aqui a chave de autorização, este é o nosso cabeçalho e o valor aqui será o token de espaço do portador. Então, aqui teremos um fluxo único. É por isso que devemos dividir nosso token de acordo. Mas antes de tudo, aqui lemos nosso cabeçalho e pode ser que ele não esteja definido. Nesse caso, podemos simplesmente dizer para 01, aqui é y. Se não tivermos nosso cabeçalho, podemos simplesmente copiar e colar esta linha com pausas e status para 01. Depois disso, realmente precisamos analisar nosso token. Então aqui vamos começar nossa conversa e esta é a nossa divisão de cabeçalho, e isso é apenas uma string que foi dividida por espaço. Então, estamos obtendo uma matriz com dois elementos. Como você pode ver aqui. Na primeira posição, teremos melhores. E na segunda posição , será a nossa corda. O que queremos obter, é aqui que pegarei o segundo elemento da matriz e ele será nosso token. Mas, como você pode ver aqui, estamos recebendo a mensagem do TypeScript. Esse objeto é possivelmente indefinido. E é por isso que eu gosto tanto do TypeScript. Isso ajuda muito durante o desenvolvimento. Qual é o problema? Na verdade, aqui temos nosso IV, vestimenta e status, o que significa que não viremos aqui. Mas o TypeScript entende que viremos aqui porque, na verdade, não tentamos aqui, retorne. E é por isso que esse código é inválido porque neste caso aqui, nosso cabeçalho pode ser esticado ou indefinido. Mas após essa verificação correta com return, ela pode ser apenas uma string válida. Portanto, a próxima etapa que precisamos fazer é verificar nosso token. Ao usar o GBT, esse é o caminho aqui, eu quero importar DVT do JSON Web Token. E só para lembrá-lo, esta é uma biblioteca que usamos para gerar um token no back-end, e agora precisamos validá-la. É por isso que aqui podemos tentar que estamos obtendo alguns dados do nosso token. E aqui estará o GBT verificando o interior. Bem, Python, antes de tudo, um token. Em segundo lugar, nossa chave secreta. E só para lembrá-lo aqui dentro de nossa configuração, nós temos nosso segredo. É por isso que aqui vou apenas tentar segredo e ele será enviado a partir de nossa configuração. E não precisamos fornecer opções adicionais para ouvir. Mas se verificarmos aqui nossa tensão de dados ou lote de TVP PE, mas na verdade sabemos que isso não está correto, não é isso que estamos começando por dentro. Se olharmos aqui, dentro de nossos usuários do controlador, aqui geramos nosso token e dentro temos ID e e-mail, o que na verdade significa que é válido aqui dizer após a verificação da derivada como. E aqui podemos dizer que estamos recebendo de volta um objeto com uma string D e também nosso e-mail, que é uma string, neste caso aqui agora nos dados estamos obtendo o banco de dados correto. Este é um objeto com um e-mail D e D. Então, estamos pegando aqui a ideia do usuário e agora podemos tentar buscá-la no banco de dados. Mas, para isso, precisamos usar nosso modelo. Este é o caminho aqui no topo. Podemos importar nosso modelo de usuário de nossos modelos. Então, aqui podemos pular de volta para dentro de nossos modelos slash, e aqui temos nosso usuário. Agora, após nossos dados, podemos fazer uma solicitação para recuperar um usuário. E, na verdade , aqui estamos usando um peso. Aqui teremos usado um ponto modelo. E aqui queremos encontrar o usuário pelo AD, e temos essa função por padrão dentro do mangusto. E aqui, em vez de uma div, podemos escrever o ponto de dados AD, e esse usuário estará lá, ou pode estar agora, é aqui que também precisaremos verificá-lo. Se não tivermos um usuário de volta, também queremos dizer que o usuário não está logado. Mas se tudo estiver bem, então queremos definir uma solicitação interna ao nosso usuário. Então, na verdade, a ideia principal é que essa solicitação seja atualizada por nós aqui. E mais tarde, quando ligarmos em seguida, essa solicitação chegará ao nosso controlador e, em seguida, teremos acesso direto a esse usuário. Este é o caminho aqui, eu quero escrever a solicitação usuário igual a usuário. E esse é esse usuário que obtivemos do banco de dados. E depois desse romance, basta ligar em seguida. E esta linha está dizendo que estamos prontos com nosso middleware e nossa solicitação pode prosseguir para nosso controlador. Mas aqui temos um problema, como você pode ver aqui, onde eu obtendo um usuário de propriedade de erro não existe na solicitação de tipo e, na verdade , é completamente válido. Esta solicitação vem do expresso e expresso internamente, não há usuário de campo. Então, o que podemos fazer aqui, a abordagem Ron será escrever aqui qualquer um e eu recomendo que você evite usar qualquer em seus projetos, porque TypeScript não pode realmente ajudá-lo. Você simplesmente tem seu código com buracos de JavaScript simples. Este é o seu aqui, Ras como qualquer outro, será uma abordagem super ruim. Por que isso? Porque aqui simplesmente dizemos que não nos importamos com as solicitações. Simplesmente dizemos que é qualquer usuário pontual e está funcionando. Essa é a abordagem para iniciantes. Não estamos escrevendo um código assim. Aqui. O usuário da solicitação está totalmente bem, mas essa solicitação não deve ser uma solicitação expressa. Devemos estendê-lo. E, na verdade, aqui dentro dos tipos, podemos criar um novo tipo e vamos chamá-lo interface de ponto de solicitação expressa, ponto ds. Agora, por dentro, posso criar essa nova interface. E vamos chamá-la de interface de solicitação expressa e, na verdade, ela deve se estender. Então, aqui está a solicitação estendida. E, na verdade, esse pedido virá diretamente do expresso. Então, aqui no topo, posso escrever uma solicitação de importação expressa. Então, o que estamos fazendo aqui, na verdade, simplesmente criamos uma interface e estendemos tudo o que tínhamos pedido interno para nossa interface. E agora aqui podemos simplesmente dizer que temos um campo, o usuário, que pode estar indefinido, e este é o nosso documento do usuário. Aqui você pode tarefa ou k, Mas por que o usuário pode ser indefinido aqui não temos um caso em que o usuário de solicitação interna é indefinido e você está totalmente certo, mas não estamos usando middleware com cada solicitação. Às vezes, não teremos um usuário dentro de nossa solicitação porque nem todas as solicitações precisam ser autorizadas. E agora podemos simplesmente copiar colar essa interface de solicitação expressa e pular definir nosso middleware e colocá-lo aqui em vez de solicitar. Então, agora eu preciso importar middleware de solicitação expressa. Não estamos mais usando solicitações do express. Estamos usando a versão regular estendida. E agora não temos nenhum erro. E o que estamos recebendo aqui é uma solicitação completa do express mais nosso campo de usuário. E essa é exatamente a abordagem correta para usar o TypeScript. Então, criamos com sucesso nosso middleware. Agora precisamos usá-lo. E para isso, quero criar uma nova rota. Bem, vamos pegar o usuário atual falando. Então, vamos voltar atrás e dizer servidor de origem. E aqui temos dois trilhos posteriores aqui. Agora eu quero criar o apt-get e temos aqui barra API slash user. Essa é a rota para buscar o usuário atual. Agora, depois disso com vírgula, eu quero escrever middleware. E, na verdade, neste arquivo, não declaramos qual é o nosso middleware. Então, precisamos inserir aqui nosso middleware a partir de nossos middlewares. Então aqui temos horas de middlewares. E isso é exatamente o que faremos. Se você está escrevendo assim, então você aplicará esse middleware antes de sermos dois pontos aqui controlador. E aqui obteremos o ponto do controlador de nossos usuários, por exemplo, a ação atual do usuário, o que na verdade significa, antes de tudo , nesta rota, esse middleware coruja será executado se obtivermos uma solicitação do usuário é ir para o controlador, então onde campeão aqui. E como você pode ver com o express, é muito fácil de ler e entender. Agora eu quero pular para dentro do controlador de usuários e criar esse novo método. Então, vamos ao fundo, criar nossa nova função, que será um usuário atual. E aqui sabemos que estamos recebendo solicitação e resposta, mas importante, mas aqui não estamos usando solicitações expressas, estamos usando nossa versão estendida. Então, aqui vou escrever dessa forma, obtenho uma interface de solicitação expressa. E o próximo parâmetro aqui será a resposta levantada. Está permanecendo o mesmo de antes. E aqui, dentro da nossa função, devemos aplicar alguma lógica. O que queremos fazer aqui, na verdade, dentro do usuário atual, podemos obter esse usuário diretamente da solicitação. Aqui podemos dizer pontos de vestir e normalizar o usuário, assim como fizemos no topo. E aqui solicitaremos esse usuário. E, na verdade, funcionará principalmente porque o que estamos fazendo aqui, estamos usando nosso usuário a partir da solicitação para jogá-lo dentro do usuário normalizado. E só para lembrá-lo, nós normalizamos o usuário aqui no topo. E isso é apenas um documento de usuário normal. E geramos aqui falando nossa resposta e a enviamos de volta. Mas, na verdade, aqui temos o TypeScript. O que isso significa? Aqui estamos recebendo um argumento de erro do tipo documento do usuário ou indefini-lo. Ele não pode usar um documento. E isso é totalmente válido porque dissemos que dentro da nossa solicitação nem sempre temos um usuário. E, na verdade, o ponto é que essa lógica nunca vai acontecer porque dentro do nosso servidor aqui, vamos lançar esse middleware, o que na verdade significa que, se não tivermos usuário, então esse middleware doméstico retorno para 01. Mas o TypeScript não se importa com nosso middleware porque simplesmente lê nossa função. E se eu estiver apenas olhando nossa função sem nosso middleware, então nosso código é inválido por isso, porque aqui estamos tentando jogá-lo indefinido dentro do usuário normalizado. E para lidar com isso para o TypeScript, devemos tentar aqui. Com não ter um usuário, então queremos lançar 401. Então aqui podemos escrever return, res, send status, e aqui dentro para 01. Nesse caso, é totalmente válido para TypeScript porque aqui no usuário request, não pode ser indefinido com isso verificou aqui? E, na verdade, esse código é muito melhor porque neste caso aqui temos essa única função e podemos testar completamente isoladamente, mas não nos importamos com essa função, o que fizemos fora com funções adicionais, middleware sobre terror com nota mais simples de que essa função funcionará corretamente em todos os casos, porque cobrimos todos os casos aqui, nossa função deve ser implementada corretamente. Vamos verificar se está funcionando. Estou pulando para o servidor e temos algum erro. Vamos verificar o que temos. E, na verdade, aqui você pode ver que era a era do TypeScript e a última compilação foi bem-sucedida. Começamos o observador conectado ao MongoDB e aqui está nossa API. Assim, podemos ir diretamente para o Postman e tentar fazer uma solicitação GET. Mas dentro de nossa solicitação, devemos fornecer um token. Este é o caminho aqui. Vou copiar e colar para conversar porque devemos usá-lo. E para isso criarei aqui a solicitação GET. E isso é slash api slash user. Só estou acertando aqui enviado. E como você pode ver, estamos chegando aqui sem autorização. Por que isso? Porque a autorização interna com não forneceu um token válido. Mas se em vez dessa corda, eu vou colar nossa conversa tão Birra do que espaço. E então nós temos nossa corda, eu estou apertando aqui enviar, e funcionou magicamente. E aqui estamos recebendo nosso usuário normal com o Tonkin. Mas o mais importante é que não experimentamos. Toda essa lógica com a obtenção do usuário atual aqui dentro desse método, é escrita dentro do middleware. E agora podemos usar nosso middleware em todos os lugares onde queremos verificar o usuário atual ou se precisamos das informações do usuário atual dentro do nosso controlador. 13. Criar módulo de auth: Nos vídeos anteriores sempre serão preparados alguns pedidos de Pi para o nosso usuário registrado e o usuário atual. Então, agora não seria bom começar a implementar algo no front-end. É por isso que aqui eu quero entrar no nosso cliente. E aqui eu quero começar com nosso módulo de usuário. E o que teremos em nosso módulo de usuário são duas páginas fazendo login e registrando. Mas não basta ter apenas duas páginas para se registrar e fazer login dentro do nosso módulo, também precisaremos de um serviço para trabalhar com o usuário atual. Por exemplo, precisamos registrar o usuário, fazer login do usuário, obter o usuário atual, e assim por diante e até esse loop, precisamos de uma interface para o nosso usuário atual também, é aqui que neste vídeo, vamos nos concentrar noções básicas do nosso módulo de autenticação. Para isso, quero entrar na pasta do aplicativo de origem. E aqui eu quero criar uma nova pasta. Aqui queremos isolar tudo, o que está falando sobre autenticação, o registro está começando. Nosso primeiro passo aqui é criar um módulo. E se você não está familiarizado com o Angular, apenas duas palavras sobre módulos dentro do Angular, dentro de outras estruturas, como por exemplo, reagir, simplesmente usamos importações e exportações, Bot Insight angular, temos muito mais, temos injeções de dependência, que na verdade significa que todo o aplicativo está dividido em módulos diferentes. Por exemplo, no nosso caso, estamos definindo o módulo aqui e agora. Agora podemos criar coisas diferentes dentro deste módulo e elas serão isoladas dentro desse módulo. E podemos definir o que queremos expor para uso externo. E se não expusermos nada para uso externo, não podemos simplesmente usar as coisas deste módulo. E essa é realmente uma boa abordagem para grandes aplicações. Vamos criar, antes de tudo, nosso módulo. Para isso, precisamos exportar nossa classe, nosso módulo. Agora, no topo desta classe, queremos fornecer um decorador de módulo NG. E por dentro passaremos coisas diferentes, mas por enquanto não precisamos registrar nada aqui ainda. O que eu quero fazer agora, quero voltar para dentro do nosso módulo de aplicativo, porque, na verdade, precisamos registrar esse módulo dentro do nosso módulo de aplicativo. Em outro caso, este módulo não vincula ao nosso aplicativo porque estamos apenas carregando um módulo e devemos colocar todos os módulos filhos também dentro dele. É aqui que aqui dentro dos pássaros, podemos simplesmente escrever nosso módulo. E com esta linha onde obter uma entrada automática aqui no topo. E agora temos certeza de que nosso módulo está carregado. Nosso próximo passo aqui é criar uma interface de usuário atual. E do meu ponto de vista, não tem nenhuma relação com o módulo corujas. Então aqui podemos criar um novo tipo de pasta e registrar aqui, ponto ts da interface do usuário atual. E dentro do nosso projeto Express, não tínhamos nenhuma regra sobre a nomeação de arquivos porque lá acabamos expressar e tudo o que estamos escrevendo, simplesmente escrevemos com nossas próprias diretrizes digamos o angular, é altamente recomendável nomear todos os nossos nomes de arquivo, Start e depois postfix da entidade. Por exemplo, aqui escrevemos o módulo de pontos porque é um módulo anunciado. Neste caso, estamos bem aqui, interface de pontos porque será uma interface e exatamente o mesmo acontece com as classes. Aqui não estamos escrevendo corujas de classe, mas nosso módulo. E aqui dentro do CurrentUser, estamos bem aqui, interface especializada, e aqui temos nossa interface de usuário atual. Agora, a questão é o que vamos entrar? E é fácil responder que só precisamos olhar para dentro do nosso carteiro. Então, aqui estamos voltando para nosso usuário atual, e-mail, nome de usuário, ID e token. Então, podemos simplesmente escrever aqui que obtemos um DStream. Temos nosso token, que é string. Nós temos o nome do nosso usuário. Também é string, e o último é o nosso e-mail. E com isso, temos sucesso ao definir nossa entidade de usuário atual em nosso cliente. E agora, em todos os lugares em que estamos falando sobre o usuário atual, podemos usar essa interface. Nosso próximo passo aqui é criar uma classe, porque, na verdade, antes de começarmos criar componentes para registro e leucemia, mas devemos criar um serviço que se comunique com nossa API. E o serviço com certeza pertence ao nosso módulo. É por isso que aqui vou criar uma nova pasta, serviços e quero criar aqui o ponto services.js. Na verdade, é realmente um bom nome se você não sabe como nomear seu serviço. Se você quiser apenas empacotar alguns métodos dentro do seu serviço dentro do módulo e você realmente não sabe do que se trata esse Methods II. Você pode simplesmente nomear o serviço como um módulo. No nosso caso, temos aqui nosso módulo e nosso serviço. Mas se você for o serviço em algum momento será muito grande. Você sempre pode se separar. Pode ser no serviço de login, registro, serviço, Serviço de Usuário Atual, o que você preferir. Por enquanto, nosso serviço está completamente bom. Aqui eu quero exportar o novo serviço de horário de aula. Agora, é super importante não esquecer de escrever no topo injetável. Porque se você quiser, tente esta única linha, será muito difícil depurar um problema. Suas entradas funcionarão, mas você obterá alguma mágica no console. É por isso que nunca se esqueça do injetável se estamos falando de serviços, agora devemos registrar o serviço dentro de um módulo. E isso é exatamente, está indo na direção de injeções de dependência e módulos dentro do Angular. Então, o que queremos fazer aqui, queremos criar um novo campo chamado provedores. E aqui está uma matriz e estamos escrevendo dentro do nosso serviço. Portanto, essa é exatamente a maneira correta de registrar todos os serviços dentro do nosso módulo. Agora queremos criar nosso primeiro método aqui e ele será obtido do usuário atual. Bem, aqui podemos simplesmente escrever que queremos criar, obter a função do usuário atual e ela retornará rapidamente observável do usuário atual. E neste ponto, você pode ter perguntas se você não conhece Angular tão profundamente, e se você não sabe quais são nossos observáveis e este fino com genérico aqui pode ser confuso para você. Então, o que é observável? Isso é apenas uma representação do fluxo. Então, o que é stream? Isso é algo que mudou ao longo do tempo, o que realmente significa que podemos nos inscrever no stream. E quando a mudança estiver acontecendo no fluxo, obteremos um novo valor. Então diga o angular, tudo está trabalhando no amor com fluxos quando não está usando promessas. que realmente significa fluxos e observáveis, é um padrão específico, como escreveremos nosso código. Então, o que estamos dizendo aqui é que estamos recebendo de volta um observável. E aqui estamos fornecendo o tipo de dados que estamos recebendo de volta. E no nosso caso, estamos dizendo aqui que essa função deve retornar um observável do tipo interface do usuário atual. interface do usuário atual é exatamente nosso objeto de usuário atual. Agora, dentro, queremos buscar alguns dados e, para isso, dentro do Angular, temos HTTP. É por isso que aqui vou escrever construtor e dentro privado, http é igual ao cliente HTTP. Então, o que esta linha está fazendo no topo, essa notação com construtor, então privada alguma variável é igual a alguma classe é como estamos injetando algumas dependências dentro de um serviço. E está tudo bem se for um pouco assustador para você ver esse código, vamos escrever exatamente o mesmo código repetidamente em cada vídeo. Por enquanto, você só precisa entender que devemos usar HTTP aqui dentro do nosso serviço. É aqui que devemos injetar esse cliente HTTP. E agora aqui em nossos métodos, podemos usar esse ponto HTTP e dinâmico é aqui que queremos usar o método GET para obter nosso usuário. Então, o que eu quero fazer agora eu quero criar um URL. E, na verdade, aqui podemos simplesmente colar http localhost 4.001 slash api slash user, e simplesmente jogamos aqui nosso URL. E agora precisamos retornar esse URL HTTP GET. Mas aqui estamos recebendo um erro. tipo de objeto observável não é atribuível à interface do usuário atual observável do tipo, por que isso está acontecendo? Porque eles realmente HTTP GET retornando por padrão observável fora do objeto porque nosso HTTP GET Cantril e sabe quais dados estamos recebendo de volta quando não, é apenas nós mesmos em nosso aplicativo, mas podemos fazer aqui, devemos especificar o que estamos recebendo de volta. E neste caso aqui estamos dizendo, ok, esse HTTP GET específico por esse URL retornará interface de usuário atual falsa e não apenas um objeto aleatório. É por isso que, neste caso, quando não está recebendo nenhum erro, porque essa única linha está retornando rapidamente observável da interface do usuário atual. E você só deve se lembrar que todo esse HTTP retornará para nós sempre observável de algo. Agora, a próxima coisa que é muito ruim é essa linha. Por que isso? Em primeiro lugar, aqui estamos diretamente na base da estrada aqui. Essa é uma abordagem super ruim. Por que isso? Porque essa linha vai quebrar na produção. É adequado apenas para desenvolvimento. E precisamos escrever exatamente o mesmo código repetidamente em cada método, isso é ruim. Para isso, temos variáveis de ambiente dentro do Angular. Podemos voltar para dentro ambientes de origem e aqui ambiente, sim, é exatamente aqui que devemos definir todas as nossas constantes com base em um ambiente específico. Então, o que devemos fazer aqui, podemos criar um novo URL da API de propriedade e podemos simplesmente colar nosso fluxo aqui. Então, host local para 1001 slash API. E isso é totalmente bom porque aqui em nosso ambiente de desenvolvimento onde definido na URL da API também terá aqui ambiente para produção. E podemos definir diferentes URLs de API lá. Essa é a maneira mais correta de fazer isso. Agora podemos usar o ambiente aqui e, como você pode ver, estamos recebendo uma URL de API de ponto de entrada externa plus. E aqui simplesmente precisamos usar slash user e nada mais. Nesse caso, estamos reutilizando esse URL de ambiente e ele está completamente isolado dentro da variável de ambiente, nossos serviços estão totalmente prontos. Mas o que queremos fazer, queremos que esse usuário sempre que carregarmos nosso aplicativo angular. Por que isso? Porque eles realmente foram roubados. Nosso usuário atual normalmente está na memória e depois de fazer login ou registro, estamos simplesmente falando dentro do armazenamento local. É por isso que toda vez que estamos entrando em nosso aplicativo, precisamos obter o usuário atual. Para isso, quero voltar para dentro do nosso componente de aplicativo. E esse é exatamente o componente que será carregado em qualquer página. Aqui podemos escrever implemento no init. E se você não sabe o que não está nele, este é um método especial que será chamado na inicialização do nosso componente. Aqui estou certo em engenharia nisso. E então disse que podemos usar nosso serviço, mas para usá-lo, devemos injetá-lo aqui. E aqui estamos escrevendo exatamente as mesmas coisas que escrevemos dentro ou no serviço. Privado, não HTTP como fizemos no serviço, mas nosso serviço que acabamos de criar. E aqui devemos inserir nosso serviço, que está dentro do nosso módulo. E agora podemos usá-lo aqui diretamente dentro do motor nele. Então, este é o nosso serviço e nós temos aqui o método do usuário atual. Mas o que é mais importante esses retornos para nós e observáveis. E normalmente queremos fazer algo para ouvir as mudanças do observável. É por isso que aqui vamos tentar assinar pontos. E agora, inscreva-se aqui, obteremos algumas informações. Então, aqui vou apenas escrever rads e log do console Ras para que possamos verificar se está funcionando. Vou pular para o navegador e recarregar a página. E só para lembrá-lo, seu servidor web cliente também deve ser iniciado. Aqui estamos recebendo um erro. Serviço de cliente HTTP, nenhum provedor para cliente HTTP. O que isso significa? Isso significa que usamos o cliente HTTP em nosso aplicativo, mas não injetamos um módulo de cliente HTTP dentro de nosso aplicativo. Essa é a maneira de consertar isso. Devemos pular dentro de um módulo e aqui devemos importar o módulo cliente HTTP. Nesse caso, nosso erro será corrigido. Vamos recarregar a página. Como você pode ver agora, ele está funcionando, mas aqui estamos recebendo um erro sobre a solicitação de origem cruzada. E, na verdade, isso está totalmente correto porque não configuramos corretamente nosso aplicativo de back-end Express para funcionar com solicitações de origem cruzada. É por isso que podemos simplesmente voltar para dentro do nosso servidor. E aqui em camadas de servidor de código aberto, nosso próximo passo será instalar um pacote adicional. É por isso que vou entrar no nosso servidor. E aqui, npm install course and course é o pacote mais popular para resolver problema do curso com o aplicativo Express. Vou pular de volta para dentro da irmandade S. E aqui posso escrever no curso de entrada superior, corpo de bateria. E agora a única coisa que devemos fazer aqui é antes que nosso analisador corporal, por exemplo, possamos escrever um banco e estamos fornecendo um curso de insight como uma função. Como você pode ver, não temos nenhum erro agora dentro do back-end e podemos recarregar nossa página de front-end. Como você pode ver agora, com a era do não ter discurso e estamos ficando não autorizados. Vamos verificar o que temos dentro da rede. Temos essa solicitação para o usuário, e se eu for torná-lo um pouco menor, podemos ver o que estamos recebendo dentro dos cabeçalhos de resposta e estamos obtendo aqui o controle de acesso permitir estrela de origem. E, na verdade, é por isso que está funcionando. Nosso back-end, configure-o corretamente. Isso permite a origem do acesso. É por isso que não estamos recebendo um erro do navegador. Mas como você pode ver aqui, estamos recebendo 401 não autorizados. E, na verdade, isso é completamente normal. Não estamos logados em nosso aplicativo. Simplesmente buscamos o usuário atual e recebemos um erro. Isso é totalmente bom. O que não está bem com não reagiu de forma alguma a essa solicitação autorizada. Então, o que podemos fazer, podemos voltar para dentro do componente do aplicativo onde escrevemos esse código. E também podemos lidar com um erro. E para isso, podemos escrever dentro do Subscribe, não uma função, mas um objeto. Aqui dentro do objeto , podemos ter dois campos. Em primeiro lugar, depois, esse é exatamente o nosso sucesso. E como você pode ver aqui, estou deixando essa função como está. Mas depois disso, podemos criar um erro. E nesse caso, é isso que acontecerá se tivermos um erro. Então, aqui podemos simplesmente escrever erro do log do console e talvez queiramos ver a Sarah, vamos verificar o que estamos recebendo. Estou recarregando a página e estamos recebendo nosso erro, resposta de erro HTTP. E aqui não temos autorização e podemos reagir nesta era. Então, o que eu quero fazer agora, eu quero criar definir a função do usuário atual. E, na verdade, não faz muito sentido porque não temos sorte, mas ainda precisamos salvar informações dentro do nosso aplicativo de que o usuário não está bloqueado. Nesse caso, todo o aplicativo, cada componente pode verificar, estamos presos de vez em quando nosso componente sabe como reagir a isso. É por isso que devemos voltar para dentro do nosso serviço. E aqui eu quero criar um novo método definido usuário atual. Aqui dentro, estamos recebendo o usuário atual, que é nossa interface de usuário atual. E isso retornará um vazio porque, na verdade, apenas alteraremos os dados internos e não retornaremos nada. E, na verdade, não está totalmente correto. Aqui está a interface do usuário atual ou null se não tivermos um usuário atual. Porque na verdade, se não estivermos bloqueados no Poupon para definir o usuário atual para agora. Agora, a questão é o que estamos recebendo lá dentro? Normalmente, o que você verá em muitos aplicativos. As pessoas simplesmente definem uma propriedade local dentro de horas, como usuário. E então aqui você pode simplesmente escrever esse usuário é igual a usuário. Essa não é a melhor abordagem com o Angular. E dentro do Angular, é super confortável e eficiente trabalhar com fluxos porque é muito mais fácil reagir aos fluxos e combiná-los. É por isso que devemos usar uma abordagem mais difícil, mas é mais adequada para grandes aplicações. Está correto. É aqui que eu quero escrever que estamos chegando aqui, fluxo de usuários atual. Aqui. Eu quero criar um novo comportamento como sujeito, e ele diz comportamento um assunto. Estou dizendo que estamos chegando aqui interface do usuário atual ou agora, ou indefini-la. E depois desses colchetes redondos, e aqui estamos dizendo indefinido por padrão. Então, o que eu escrevi aqui e como vamos usá-lo. Na verdade, o que é assunto de comportamento? Isso é apenas uma representação de fluxos. Isso é apenas um fluxo que tem um valor padrão. Nesse caso, nosso valor padrão é indefinido, e também podemos definir dentro do fluxo tipos como interface do usuário atual agora ou indefinido. E agora dentro do usuário atual definido, podemos mudar o fluxo. Podemos escrever aqui este ponto do usuário atual. E para mudar o fluxo, estamos usando o ponto seguinte e estamos fornecendo valor a você. Neste caso, estamos fornecendo o usuário atual e é totalmente válido porque a interface do usuário atual é um tipo válido. O ponto principal é aqui que muitos componentes dentro de nosso aplicativo podem se inscrever neste fluxo de usuários atual, e eles serão saqueadores automáticos encerrados neste momento aqui, quando nós Você está alterando o valor dentro do fluxo atual do usuário. E não se preocupe, se você não estiver entendendo completamente, você verá como estamos usando isso em palestras posteriores. Então, criamos com sucesso nosso usuário atual definido. Agora, aqui dentro do nosso componente de aplicativo, pelo menos por engano, podemos fazer algo. Podemos definir nosso usuário atual dois. Agora, aqui vou escrever este ponto nosso serviço dot set usuário atual. E aqui dentro eu vou agora. Então, o que está acontecendo aqui em Inicializar nosso aplicativo, estamos chegando aqui usuário atual. Se não obtivermos o usuário atual, estamos definindo-o como nulo. E agora você quer com certeza me perguntar por que eu escrevi aqui agora e defini-lo e usuário atual, faz algum sentido definir aqui usuário atual e agora, mas não indefini-lo. Além disso, eles fizeram isso com o propósito porque na verdade, devemos lidar com três estados diferentes. Em primeiro lugar, por padrão, nós o definimos, o que na verdade significa que, para nós, ainda não buscamos o usuário atual. Não está pronto se estamos sentados aqui agora, significa que buscamos o usuário atual, mas não teve sucesso. Não estamos trancados. Então, agora aqui significa que não estamos trancados. E a interface do usuário atual obviamente significa que estamos presos. Por isso, criamos com sucesso nosso módulo, nosso serviço, interface de usuário atual e algumas funções básicas que precisaremos nas próximas palestras. 14. Página de registro - Marcação + Formulário: No vídeo anterior, preparamos muitos funcionários em relação ao usuário atual. Neste vídeo, quero me concentrar em criar nossa página de registro porque a torta para registro já estará implementada. E para isso, primeiro precisamos criar um novo componente. É por isso que aqui estou dentro das horas do aplicativo aqui, precisamos criar uma nova pasta chamada componentes. O primeiro componente que podemos implementar é o registro. E aqui está uma palavra importante. Na verdade, mais tarde, implementaremos dois componentes, registro e login. As diferenças entre esses dois componentes não são tão significativas. Temos no registro, campo adicional, nome de usuário e login com, não temos esse campo. Então temos diferentes A borracha do pneu. É isso aí. Tudo. Outras coisas continuam as mesmas. É por isso que temos duas possibilidades. Poderíamos criar um único componente e gerenciá-lo apenas entre o login e o registro. Ou podemos criar dois componentes diferentes. Eu prefiro criar dois componentes diferentes só porque é mais fácil de manter mais tarde, mesmo quando duplicamos um pouco o código. Então, aqui vamos criar uma nova pasta e chamá-la de registro. Agora, dentro dessa pasta, devemos criar o arquivo ts, um arquivo HTML. E aqui teremos registrado dot component dot ts e também registrado dot component dot HTML. Agora, dentro de nosso componente, devemos conhecer nosso novo componente de registro de classe e, em seguida, dizer esse componente, devemos primeiro fornecer um seletor. Aqui você tem uma decisão importante. Você pode nomear todos os seus seletores começando com o nome do seu aplicativo. Por exemplo, você cria algum prefixo que é válido dentro do aplicativo. Por exemplo, no nosso caso, podemos chamá-lo de L Trello ou apenas L. E então você tem uma diferença entre todas as bibliotecas que você usa e os componentes do nosso projeto. Porque, na verdade, se estamos pulando dentro do HTML, aqui temos L register, então sabemos que isso é um componente do nosso projeto. Se você tem aqui, por exemplo, prefixo vazio e depois um botão, você entende o k. Esta é uma biblioteca de materiais e não é nosso projeto. Esta é a primeira abordagem possível. Eu prefiro outra abordagem em que eu prefixe cada componente dentro do módulo, o que na verdade significa que agora estamos dentro do nosso módulo. É aqui que o seletor estará lá fora registrado. É muito mais fácil porque não usaremos bibliotecas. E, nesse caso, podemos ver de qual módulo estamos obtendo esse componente. A próxima coisa que devemos fornecer dentro do nosso componente é o URL do nosso modelo. E esta é a URL do nosso componente de registro HTML. Agora, não devemos esquecer de registrar nossos componentes dentro do nosso módulo. Aqui estamos pulando dentro do nosso módulo Ts, e criamos aqui uma declaração de campo. E dentro agora podemos escrever componente de registro e delta E importado de componentes registrados, registrados. Portanto, nosso componente está lá. Agora podemos escrever algumas marcações para nosso componente dentro do nosso componente de registro, sim, e na verdade aqui eu perdi letra S na palavra register. Agora vamos criar um marcador para nossa página de registro. E a primeira classe que temos aqui é div com página de login da classe. E pode ser confuso para você, mas isso ocorre apenas porque nossos estilos foram escritos para a página de login e é exatamente o mesmo que a página de registro. Então, aqui temos nossa página de login div, e agora dentro teremos um link na parte superior. Aqui temos um link de roteador e aqui está a barra. Então, essa rota está indo para nossa página inicial. Dentro do link do nosso roteador, queremos uma imagem. Então, aqui estará a fonte da imagem slash acids, slash Trello, logo dot SVG. E depois desta aula, lei do fio, logotipo principal. E neste momento você quer dizer com certeza, ok, não temos nenhuma imagem. Isso é especialmente para você preparar todas as imagens e colocá-las dentro dessa pasta, dentro de ativos. E você pode pegar todas essas imagens do arquivo desta lição específica na caixa de descrição abaixo, como você pode ver aqui, dentro da fonte, dentro dos ativos, eu tenho muitas imagens, então não se esqueça para levá-los para o nosso projeto. Agora vamos voltar para dentro de nosso aplicativo, nossos componentes se registram, registram HTML e, depois de nossa tag a aqui no topo, queremos criar div com contêiner firme de classe e será nosso contêiner para o nosso formulário. Agora, dentro do contêiner, queremos primeiro escrever o cabeçalho de login da classe def. E, novamente, temos a classe do login, mas não é grande coisa. E aqui estamos escrevendo um registro para o Trello. Depois disso, escreveremos uma classe para erros de validações. E, na verdade, por enquanto, não vamos colocar nenhum erro dentro dele, mas vamos usá-lo mais tarde. Este é o y aqui, apenas erros de classe div estavam fechando. Está completamente vazio e nada é renderizado lá ainda. Agora, depois disso, temos nosso formulário. Então, vamos abrir e fechar a tag do formulário. E dentro de nós temos campos específicos. Então, primeiro de tudo, aqui temos um e-mail, então digite e-mail. E aqui queremos colocar o e-mail do titular. E o último será a entrada de login da classe. Agora eu quero copiar e colar esta linha duas vezes porque não precisamos apenas de e-mail, mas também precisamos aqui do nome do nosso usuário. Então, aqui não precisamos do Type. espaço reservado será nome de usuário e classe. Estaremos procurando informações. E depois desse tipo senha e senha do titular do lugar. Depois disso, podemos criar nosso botão para registrar o usuário. Aqui estaremos tipo de botão, enviar, aula, login, botão enviar. E dentro desse botão, vamos experimentá-lo para um registro. Depois do nosso formulário, queremos renderizar nossos links. Então, aqui teremos links de formulário inferior da classe div. Vamos fechar essa div e criar um único link para nossa página de login. Então, aqui estará um link de roteador. Novamente. Aqui teremos a página de login da barra e o link de registro da classe. Aqui dentro da nossa tag a, simplesmente executaremos o login. Vamos verificar se alguma coisa é renderizada. Na verdade, queremos pular para a página de registro e ver nossa página, mas não funciona porque não registramos nossa rota. Registrado. Para isso, devemos voltar dentro do nosso módulo, nosso módulo. E aqui devemos registrar todas as rotas que queremos criar dentro desse módulo específico. É aqui que aqui no topo podemos criar um array de rotas e podemos dizer que isso é redondo e, neste caso, não será apenas um array. Teremos dentro da validação de cada rodada. Então, aqui precisamos adicionar um objeto com nosso caminho que será registrado e nosso componente que acabamos de criar. E é componente de registro. Nesse caso, ele funcionará depois que adicionarmos essas rotas às nossas entradas. É aqui que devemos direto nos pássaros e usar o ponto do módulo de rota ouvir para crianças. E é importante usar aqui para crianças e não franzidas porque queremos criar o Strauss dentro ou um módulo filho, não dentro do módulo do aplicativo. Aqui está aqui para rotas filho e rotas para este módulo específico. Agora vamos verificar isso. Vou recarregar a página e pular para o registro de barra. E como você pode ver neste caso, ele foi renderizado. Podemos ver nosso telefone sem nenhum CSS, e aqui está nosso arquivo SVG que fornecemos na parte superior. Então agora sua pergunta é certa, enquanto é nosso CSS e esse é o ponto. Também preparei todo o CSS para o nosso projeto. Portanto, estaremos totalmente focados apenas no Angular e escreveremos na lógica de negócios. É por isso que você deve usar o código-fonte do nosso projeto no vídeo. E, em seguida, dentro da pasta de origem, dentro de styles.css, você deve copiar essas linhas. E como você pode ver aqui, tudo isso está em partes dos estilos de Nova Pasta, que você também deve copiar. Portanto, você precisa copiar duas coisas, pasta de estilos de origem e estilos de origem, CSS, você deve substituir esse arquivo. Então, dentro de nossos estilos de origem, temos muitos estilos diferentes. Como você pode ver aqui. Por exemplo, criar tarefa. Temos tudo relacionado à criação de tarefas. E todos esses estilos são globais e usaremos estilos mais antigos apenas para nos concentrarmos totalmente no aplicativo Angular. Além disso, quero lembrá-lo de que nosso arquivo global, estilos de origem, CSS, é usado automaticamente pelo Angular, o que significa que se você escreveu esses símbolos aqui, ele funcionará imediatamente. E agora, se vamos recarregar a página, temos aqui, nossa marcação. Então, temos aqui o ícone do trello, e este é, na verdade, um link para a página inicial. E temos nosso formulário de cadastro com e-mail, nome de usuário e senha. O único problema está aqui, olá l Trello que podemos ver no canto. São apenas algumas sobras dentro do nosso aplicativo de origem, o componente HTML do aplicativo. Aqui podemos remover essa linha e apenas viver aqui tomada do roteador. Então, aqui criamos com sucesso nossa página de marcação para registro. Agora siga em frente para vincular de alguma forma essa forma junto com Angular. E, na verdade, dentro do Angular, temos formas reativas. E este é um módulo Angular adicional para trabalhar com formulários no xadrez desta semana. Este é y. Vamos voltar para dentro de nossos componentes, registrar, registrar componentes ts. E aqui, antes de tudo, quero colocar dentro do nosso formulário, novo grupo de formulários de atributos. E aqui vou tentar que seja igual à forma. E aqui também precisamos do NG Submit para enviar o formulário. E aqui vamos criar no Submit. Agora, a questão é o que é esse grupo de formulários? E, na verdade, dentro de formas reativas, podemos criar um grupo de formulários dentro de um componente. E será uma representação do nosso formulário HTML. E será totalmente vinculado aos nossos elementos HTML e funcionará imediatamente. O que queremos fazer aqui dentro da nossa turma, queremos criar nosso formulário. E isso é, na verdade, esse grupo de pontos se b. E não temos B dentro do nosso componente. É por isso que devemos inserir o construtor injetado. Então aqui vou escrever privado if b, e este é o construtor de formulários. E como você pode ver, ele foi importado de formas angulares. Agora, aqui no topo, temos acesso a esse grande grupo e aqui está o nosso formulário. Então, quais campos temos? Em primeiro lugar, temos um e-mail e, na verdade, aqui podemos dizer como um array nossos validadores, então o valor inicial aqui está vazio e aqui podemos escrever validadores dot required, neste caso formulários reativos. Por padrão, verificaremos se esse campo está vazio. Agora podemos copiar e colar esta linha porque temos exatamente o mesmo. Temos aqui nosso nome de usuário, também campo vazio e validação necessária, e aqui está nossa senha. Também é um campo vazio por padrão e é necessário para que nossa empresa já tenha sucesso. E esta linha aqui para o formulário Firm Group está vinculando esse formulário específico ao nosso HTML, mas não é tudo. Também devemos vincular cada campo. Aqui, em todos os lugares, temos essa contribuição. E, na verdade, o que eu quero fazer aqui, eu quero colocar um atributo de nome de controle de formulário. Aqui, vincularemos um campo específico para cada entrada. Então, o primeiro aqui será nosso e-mail. O segundo é o nosso nome de usuário e o último é a senha. Nesse caso, quando alterarmos essas entradas, elas serão atualizadas dentro do nosso grupo de formulários aqui. E a última coisa que devemos criar é no método Submit. Então, já o criamos dentro do nosso HTML. Aqui podemos simplesmente adicionar no envio e ele retorna nulo. E agora dentro eu quero apenas o login do console em Enviar vírgula, este formulário valores de ponto. Vamos verificar se está funcionando. Vou recarregar o paciente que estamos recebendo um erro não pode vincular ao grupo de formulários, pois não é um elemento conhecido do formulário. Por que isso está acontecendo? Porque não injetamos módulo de formas reativas dentro do nosso módulo. Então, vamos voltar para dentro ou para fora do módulo. E aqui dentro das entradas, devemos escrever um módulo de fóruns reativos. E depois dessa contribuição, não devemos pegar a Sarah. Vamos recarregar a página. Como você pode ver, não temos nenhum erro. Agora posso fornecer algo interno e clicar em Registrar. E como você pode ver aqui dentro do console onde obter onsubmit, e-mail, nome de usuário e senha, o que na verdade significa que todos os nossos campos foram vinculados com sucesso ao nosso componente angular. 15. Página de registro - serviço + validação: Em vídeos anteriores, criamos o mercado para a página de registro e também a empresa, mas ainda estamos perdendo nossa chamada de API, que devemos implementar neste vídeo. É por isso que, em primeiro lugar, quero voltar para dentro de nossos serviços, nosso serviço, porque, na verdade, aqui vamos escrever todas as nossas chamadas de API e já temos aqui o usuário atual, o que vamos polonês depois. Mas, por enquanto, quero criar registro de carvão API. É por isso que aqui podemos simplesmente escrever registro. E a questão é, o que estamos conseguindo aqui? Na verdade, estamos recebendo nosso formulário, mas ainda não o digitamos. É por isso que não é confortável de usar. E não queremos escrever aqui que estamos recebendo nada porque não faz muito sentido o que esse método quer, ele quer saber o que foi fornecido dentro. É por isso que eu queria voltar para dentro nossos tipos e criar aqui um novo tipo. E podemos nomear esse tipo de interface de solicitação de registro. E você pode perguntar, ok, mas por que nome tão estranho? E, na verdade, não é estranho. A ideia principal é a hora corrigir tudo o que estamos escrevendo sobre solicitação e resposta com postfix específico neste caso aqui eu sei. OK. Esta é uma solicitação de registro. Então, esse é o corpo da solicitação. Se estamos falando sobre a resposta do nosso registro, se necessário, então seria um teste de interface de resposta registrado. Nesse caso, é mais fácil entender para que você está usando essa interface. Agora vamos criar essa interface. Então, aqui eu quero exportar nossa nova interface e ela será a interface de solicitação de registro. O que teremos dentro exatamente todos os nossos campos que escrevemos dentro de um formulário. Então, aqui teremos nosso e-mail, uma string, nosso nome de usuário, também será string. E a última é nossa senha. E a senha também é string. E, na verdade, não se trata apenas da forma. Se olharmos dentro de nossos controladores de origem do servidor, os usuários já foram criados aqui um método de registro. E dentro do nosso método de registro, é isso que procuramos dentro do corpo. Portanto, solicite o corpo do e-mail, nome de usuário , senha, e isso é exatamente o que estamos enviando do cliente. Portanto, nossos registrados solicitaram que pudéssemos voltar para dentro de nossos serviços, nossos níveis de serviço. Aqui dentro do registro, o que estamos recebendo como parâmetro, é nossa solicitação de registro e nosso tipo é a interface de solicitação registrada que acabamos de criar. Agora a questão é: o que eu recebo depois do registro, estamos recebendo de volta nosso usuário atual. É assim que podemos escrever exatamente como podemos observar o usuário atual da interface do usuário atual. Nós já temos isso. Nesse caso, tudo dentro do nosso método é digitado corretamente. Agora precisamos criar uma propriedade de URL. Então aqui URL e estamos usando novamente o ambiente pontilham um reino pagador porque são os mesmos usuários de barra, porque eles foram registrados, a solicitação é apenas postar para usuários de barra. E aqui agora eu quero retornar este HTTP e temos acesso aqui ao post HTTP e dentro estamos fornecendo o URL do festival. E em segundo lugar corpo, e nosso corpo é nosso pedido de registro. Mas, novamente, estamos recebendo aqui um erro porque nosso tipo é observável do objeto e não observável na interface do usuário atual. Porque, obviamente, por padrão, postagem HTTP não sabe o que queremos fornecer insights. É aqui que, dentro de nossa postagem HTTP, devemos fornecer o que estamos recebendo de volta. E é a interface do usuário atual, mas não é tudo, também deve criar um método adicional para definir o token dentro do armazenamento local. O que isso significa? Na verdade, quando estamos registrando um usuário ou obtendo o usuário, estamos obtendo também campo token que preparamos no back-end. E não devemos fazer nada com esse campo no cliente, mas devemos apenas salvá-lo e dito armazenamento local e anexar a cada solicitação. Nesse caso, nosso back-end pode entender quando a solicitação é autorizada e que fornecemos o token correto. É aqui que eu quero adicionar um token de conjunto de métodos adicional. E, na verdade, forneceremos o usuário atual porque chamaremos esse método depois de obter um usuário atual ou após o registro ou guineense. Então, aqui o usuário atual é a interface do usuário atual e agora ela retornará nula porque, por dentro, simplesmente queremos usar o armazenamento local. E aqui vou escrever um item de conjunto de pontos de armazenamento local. E por dentro eu quero fornecer conversas de campo e estamos escrevendo dentro do token de ponto do usuário atual. Portanto, esse método mais simples armazena dentro localStorage nosso token do usuário atual, e agora estamos totalmente prontos para ajustar nosso componente. Então, vamos voltar para dentro do nosso componente de registro de componentes. E aqui temos em submissão, e obviamente esse valor firme é desenhado aqui. Queremos usar nosso serviço. É por isso que aqui eu quero injetar nosso serviço. Então, estamos escrevendo novamente em particular e temos nosso serviço, que é nossa classe de serviço de autenticação. E aqui agora dentro no envio, podemos escrever isso serviço dot register. E como você pode ver, somos fornecidos dentro de uma solicitação de registro, mas dentro de nosso componente temos apenas essa forma de ponto, valor de ponto. E, na verdade, esse valor firme, como você pode ver aqui o tipo é qualquer, é por isso que funcionará para nós e não podemos digitá-lo de forma alguma. Então, o que os retornos registrados são rápidos? É um observável. É por isso que aqui podemos novamente escrever Subscribe with so object dentro dos campos que serão próximos se estiver correto ou se for um erro. Então, dentro a seguir, mas vamos pegar a bolsa do usuário atual. E aqui vamos fazer alguma lógica. E se tivermos um erro aqui, devemos especificar um campo de aviação. E aqui está uma função com o Era. E por dentro podemos simplesmente consolar log e estreitar. Então, primeiro de tudo aqui eu quero escrever erro, erro aqui dentro do próximo console log nosso usuário atual, coma, usuário atual. Agora vamos verificar se está funcionando. Fornecerei alguns e-mails que não existem dentro do nome de usuário e senha e clicarei em Registrar. E como você pode ver, aqui está nossa rede. Estamos chegando aqui para solicitar. Em primeiro lugar, estamos recebendo solicitação de opções. E isso é completamente normal porque usamos o curso. E temos uma solicitação entre dois hosts diferentes porque estamos hospedando nossos aplicativos em partes diferentes. Então, você verá essas opções todas as vezes. É completamente normal. Mas estamos interessados em nossa solicitação de postagem, que é uma postagem de usuários sem caminho. E aqui está nossa carga útil. A carga útil está completamente correta e aqui está nossa resposta. Como você pode ver, estamos recebendo de volta nosso token de ID de e-mail e nome de usuário, o que na verdade significa que tudo está funcionando bem. E aqui estamos recebendo nosso usuário atual. Mas, como você pode ver antes, estamos recebendo erro, resposta de erro HTTP. E isso não deve incomodá-lo porque esse é o erro dessa solicitação não autorizada e nós o corrigiremos no vídeo posterior. Ele não faz nada com nosso componente de registro. Então, como você pode ver aqui no console, estamos recebendo nosso usuário atual, o que significa que nosso código aqui está completamente correto. Então, o que podemos fazer agora, podemos escrever este ponto e aqui temos nosso serviço e podemos chamar aqui um token de conjunto de métodos e fornecer insert current user. Então esta linha, porque temos aqui o usuário atual salvará nosso token de currentUser no armazenamento local, mas não é mantido. Também queremos salvar um usuário para todo o aplicativo, e já estamos preparados antes para o mesmo método dot set currentUser. Lá dentro. Podemos simplesmente fornecer nosso CurrentUser e ouvir esse método. Ele apenas definirá esse usuário atual no fluxo de usuários atuais. Você verá como usar o fluxo atual do usuário em vídeos posteriores. Mais importante ainda, que agora após o registro, nós o definimos no Target e nos sentamos em um CurrentUser dentro de nosso aplicativo. E a última coisa que queremos implementar é nossa validação. Porque, na verdade, se obtivermos um erro, queremos mostrá-lo. É por isso que aqui. Em primeiro lugar, quero digitar nosso erro porque sabemos o que é. É uma resposta de erro HTTP. E aqui estamos recebendo nosso erro e podemos escrever aqui, pelo menos, ponto Azure. E sim, essa flecha será qualquer, mas ainda assim é melhor do que nada. Mas queremos fazer agora, queremos salvar nosso erro aqui. Agora, a questão é: em que formato obteremos nossos erros. E para este segundo abrir novamente, nossos controladores, usuários. E como você pode ver, aqui está nossa pegadinha. E o que estamos fazendo nesta linha, estamos mapeando nossos erros e recebendo mensagens como uma matriz de strings, que na verdade significa que temos certeza de que, se estamos recebendo um erro, é sempre uma matriz de strings. É por isso que o que podemos fazer em nosso componente de registro interno do cliente, podemos gerar uma mensagem de erro e mostrá-la aqui. Este é y. O que eu quero fazer aqui, eu quero criar apenas um único erro e ele será do tipo string agora. E, por padrão, será agora porque não temos nenhum erro. Agora, aqui dentro do nosso erro, podemos escrever essa era dos pontos. Sabemos que aqui estamos recebendo nosso erro como um array. É por isso que aqui podemos simplesmente criar o Azure dot dot join aqui se tornará um espaço, o que na verdade significa que queremos juntar todos os nossos erros com vírgula e espaço, e será apenas um campo. Agora, eu quero pular dentro de um componente de registro HTML aqui, onde temos erros de classe div. Eu quero escrever e GE e mostrar esse campo somente quando tivermos um erro e dentro deles eles podem simplesmente renderizar nosso erro. Agora vamos verificar se está funcionando. Mas como você pode ver aqui, estamos recebendo um erro não pode ser vinculado a G se não for uma propriedade conhecida de div. E isso está acontecendo quando não injetamos um módulo comum dentro do nosso módulo. É aqui que, dentro das importações, devemos inserir o módulo comum do Angular. Agora, como você pode ver, não estamos recebendo nenhum erro. E o que eu quero fazer, eu quero fornecer dados inválidos. Por exemplo, dentro do e-mail, fornecerei dados e formato não incorreto. Agora vamos limpar tudo e clicar em Registrar. E como você pode ver aqui, estamos recebendo nosso erro. E esse é um array com e-mail inválido. E estamos renderizando este e-mail inválido aqui no topo, o que na verdade significa que reagimos corretamente azure e Don sucesso ao registrar nosso usuário. Agora, vamos verificar se estamos realmente seguros conversando após o registro. É aqui que vamos recarregar a página e fornecer e-mail correto, nome de usuário, senha, e clique aqui registrar. Como você pode ver, temos nosso usuário, o que significa que começamos na memória. Mas aqui, quando sou campeão dentro do armazenamento local do aplicativo, você pode ver nosso token e aqui está um valor, o que na verdade significa que implementamos com sucesso o registro do usuário e armazenamos o token dentro do localStorage. 16. Página de login: No vídeo anterior, concluímos com sucesso nossa página de registro. Neste vídeo, devemos implementar a página de login. E eu acho que essa é uma ideia incrível que você tente implementá-la por conta própria. Então, o que precisamos implementar nesta página? Na verdade, a página de login é simplesmente um login de barra de URL e vemos exatamente a mesma forma de registro, mas formulário de login. Então, na verdade, temos apenas um e-mail e senha e não temos nome de usuário. Obviamente, todos os textos são diferentes, mas essencialmente é isso. Também usaremos a outra solicitação para seguir o jogo no slushy pie slash users slash login. E aqui eu tenho três níveis de complexidade para você. Em primeiro lugar, você pode pausar este vídeo agora mesmo e tentar implementá-lo sozinho. segundo nível é que você está recebendo alguma orientação minha antes de começar a implementar. Então, o que precisamos fazer? Em primeiro lugar, como você pode ver aqui, componentes de dentro para fora, temos um componente de registro. E como eu disse anteriormente, com não quero compartilhar o componente entre registro e login, o que na verdade significa que podemos implementar o novo login do componente com exatamente a mesma marcação, mas sem nosso nome de usuário e nosso arquivo ts será super semelhante. Precisamos de um formulário, precisamos onsubmit e assim por diante. Mas a principal diferença que haverá em um serviço, não usaremos nosso serviço de registro, mas devemos criar um método de login, que realmente significa que devemos em nosso serviço aqui, criar uma solicitação de login, que fará uma chamada de API. E, na verdade, será muito parecido com o nosso registro. Mas aqui devemos criar uma solicitação não registrada, mas uma interface de solicitação de login. E então, dentro, devemos fornecer um URL correto se você quiser experimentar você mesmo. Agora, basta pausar o vídeo aqui. E se você não quiser experimentar sozinho, vamos fazer isso juntos. E nosso primeiro passo será criar a interface para o nosso serviço. Então, aqui temos nossa interface de solicitação de registro. E, na verdade, como você pode ver, temos três campos aqui, então não podemos reutilizá-los dentro do login. Mas eu quero fazer aqui, eu quero criar uma nova interface, interface solicitação de login. Vamos pular dentro desse arquivo e podemos copiar e colar completamente nossa interface de solicitação de registro, só porque será muito semelhante e eles não querem digitar muito. Então, aqui devemos criar nossa interface, interface de solicitação de login. E temos e-mail e senha internos, e não temos nosso nome de usuário. Então, criamos nossa interface com sucesso. Agora podemos voltar para dentro do nosso serviço e podemos copiar o método de registro e colar totalmente porque o método de login será super semelhante. Vamos nomear nosso método de login. E aqui não recebemos solicitação de registro, mas nossa solicitação de login, aqui precisamos de outra interface que acabamos de criar. É uma interface de solicitação de login. E de volta estamos recebendo nosso usuário, o que significa que é uma interface de usuário atual correta e observável. Agora, aqui está o URL. Temos aqui API URL slash users slash login. E essa API já está implementada dentro do nosso back-end. O login é, com certeza, uma solicitação de postagem, o que significa que aqui devemos fornecer uma postagem com a solicitação de login do corpo que definimos como um parâmetro e nosso serviço de login está totalmente implementado. Nosso próximo passo será criar um componente aqui e, na verdade esse componente de registro definido é muito semelhante ao nosso componente de login. Não faz sentido redigitar tudo sozinho. É por isso que eu quero copiar a pasta inteira e colá-la aqui e renomear o login da pasta. Agora temos o componente de login. Devemos renomear aqui as páginas. Então, será login dot component dot HTML. E aqui faça login dot component dot ts. Nova deve pular dentro do nosso HTML e alterá-lo um pouco e não será tão diferente. Em primeiro lugar, aqui, em vez de registrados no Trello, podemos escrever o login no trailer. Agora estamos deixando aqui o erro, assim como os tivemos. Também houve necessidade de envio de formulário e aqui temos e-mail, nome de usuário. Não precisamos do alto, podemos removê-lo. Nós temos nossa senha. E agora aqui está o botão de envio, não com registro, mas entramos, por exemplo, por último, mas não menos importante, é o link do roteador aqui na parte inferior, ele deve ir para uma página de registro. É aqui que aqui está o registro de barras. E em vez desse texto, podemos escrever dentro de se inscrever para uma conta. Então, mudamos nosso HTML com sucesso. Agora vamos pular para o nosso arquivo TypeScript. Em primeiro lugar, devemos mudar nosso seletor. Ele não está registrado, mas nosso login e modelo são HTML do componente de login. Agora className também é diferente. É o componente de login da era Live como está. E aqui está nosso formulário. Precisamos de e-mail e senha, mas não de um nome de usuário. Então, vamos remover o nome de usuário aqui. Nosso construtor permanece o mesmo. Nosso onsubmit permanece quase o mesmo. Mas aqui não usaremos o método de registro. Criamos um método de login onde dentro estava fornecendo todo o formulário. E aqui temos a assinatura e, se obtivermos sucesso no login, então aqui o log do console e o usuário atual definidos na conversa e estamos definidos no usuário atual, o que na verdade significa que é 99% exatamente o mesmo código como registro interno. E nosso último passo aqui será registrar nossos componentes. Portanto, devemos pular dentro das lágrimas do nosso módulo. Aqui dentro das declarações, devemos dizer que temos um novo componente e é componente de login. E também devemos criar aqui uma nova rota. Então, vou copiar e colar a rota do registro e esse caminho de login e componente serão o componente de login. Vamos verificar se está funcionando. Não temos nenhuma flecha aqui dentro do observador. Vou recarregar a página e tentar pular aqui na parte inferior, por exemplo, na página de login. E como você pode ver onde fazer login na barra. E aqui está o nosso formulário e podemos recarregar a página onde mancha nesta página, está tudo bem. Agora vamos tentar se podemos fazer login. Então, aqui, antes de tudo, quero escrever algo incorreto. Aqui estão alguns e-mails que não existem. E depois alguma senha. Estou batendo aqui dizendo em, e estamos recebendo um erro, como você pode ver aqui antes, estamos obtendo foto em erro com validações. E dentro do nosso erro onde receber e-mail ou senha preenchidos, e-mail incorreto uma senha. E estamos fazendo isso nesse caso porque não queremos notificar o usuário exatamente o que não está correto. Não devemos dizer que algo como este e-mail já foi recebido. Nós simplesmente dizemos que é inválido. É por isso que essa lógica dentro do componente de login do bone work. E só para lembrá-lo aqui copiamos colado no envio e aqui dentro de um erro com juntamos nossos erros, porque no caso da página Register tínhamos aqui uma matriz de strings. Aqui não temos que ver diretamente uma seta, e-mail, uma senha, que na verdade significa aqui, em vez de entrar, podemos escrever um e-mail ou senha da era Dodd. Nesse caso, aplicaremos corretamente a área interna. Vamos verificar o som. Estou recarregando a página. Vamos digitar aqui algum e-mail que não existe, algum login com senha e estamos recebendo um e-mail incorreto com uma senha, o que significa que nossa validação está funcionando corretamente. Agora vamos tentar fazer o login com as credenciais corretas. Então aqui eu tenho completo em gmail.com e aqui está nossa senha 123. Estou batendo aqui, diga maldade, e estamos recebendo o usuário atual. Mas o principal problema é que continuamos nesta página. E em segundo lugar, não removemos essa área. E, na verdade, podemos fazer as duas coisas simultaneamente. Em primeiro lugar, o que eu quero fazer aqui no envio, podemos remover a Sarah. Então, aqui, esse erro de dólar que podemos escrever dentro agora. E, na verdade, posso dizer agora que o nome da era não é o melhor, porque na verdade o erro é super genérico e eles gostariam de mudar esse nome aqui de uma mensagem de era para era, por exemplo, neste caso, precisamos mudar isso aqui dentro da próxima e aqui dentro da era. E depois disso, devemos pular para o modelo e alterá-lo lá também. Então aqui temos Angie se erro, deve ser mensagem de erro. Aqui estamos renderizando nossa era. E eu acho que essa abordagem é muito mais limpa porque nos dá a compreensão que estamos renderizando aqui. Não é um erro genérico. Isso é realmente uma mensagem de erro. Agora devemos aplicar exatamente o mesmo dentro do nosso registro. Então, vamos voltar para dentro do nosso registro. E aqui, antes de tudo, quero escrever uma mensagem de erro. Aqui também está a mensagem de erro e, em seguida, diga o arquivo ts, eu quero mudar a mensagem de erro da seta dois aqui, mensagem de erro correta dentro da era, e queremos configurá-lo agora em nosso sucesso. Então aqui essa mensagem de erro é igual a agora, a última coisa que queremos fazer, queremos redirecionar o usuário para outra página. Não faz sentido que estejamos nesta página e ela lista, queremos pular para a página inicial após o login de um usuário. Para fazer isso, devemos injetar aqui nosso roteador. Este é o meu construtor de inserções. Eu posso escrever roteador privado é igual a roteador. E como você pode ver, esse roteador vem do angular-ui-router. E agora aqui dentro do sucesso, na última linha, podemos escrever este ponto, ponto navegar por URL. E estamos fornecendo aqui URL, por exemplo, apenas barra. E agora devemos fazer exatamente o mesmo dentro da nossa página de login. Então, eu estou entrando no componente de login aqui. Em primeiro lugar, quero injetar um roteador Zhao privado. E depois disso, eu posso colar essa linha, essa rota navegar por barra de URL, o que na verdade significa que em ambos os casos, com registro e login, queremos rejeitar nosso usuário para a página inicial. Vamos verificar se está funcionando. Estou aqui na página de login Estou escrevendo aqui f2 em gmail.com, aqui 123. Estou acessando o login e, em seguida, defendendo a página inicial, que significa que implementamos com sucesso nossa página de login. 17. Página inicial: Nos vídeos anteriores, terminamos nossa página de login. Neste vídeo, implementaremos nossa página inicial para o projeto. E o ponto principal é que esta página será apenas uma marcação e nenhuma lógica. Por que isso? Porque, na verdade, esta página é apenas para usuários anônimos se estivermos bloqueados, mas nunca a vermos porque somos redirecionados diretamente para a página de painéis de ideias. Então, primeiro de tudo, vamos implementar em seu módulo. E para isso dentro do aplicativo, eu quero criar um novo módulo que é chamado Home, que na verdade significa que este é um módulo completamente separado. Não tem nada a ver com horas, e há apenas um componente da página inicial dentro do qual está isolado dentro deste módulo. Então, vamos pular para dentro dessa pasta e criar um novo arquivo Módulo inicial Ts. E muitos estudantes estão me perguntando com frequência por que eles não usam geradores junto com o Angular. E, na verdade, há uma razão para isso. Acho que leva mais tempo para usar um gerador apenas copiar e colar o módulo se precisarmos fazer isso, e também para o processo educacional, que você se lembre melhor. Estou escrevendo do zero. Aqui é y. Vamos criar um módulo home mais uma vez do zero. E a cada próximo módulo, vamos apenas copiar e colar. Isso é o que queremos fazer aqui. Queremos criar uma nova classe e vamos chamá-la de módulo home. Depois disso, devemos injetar aqui um decorador no módulo GI. E por dentro devemos fornecer nossas dependências, pelo menos aqui dentro das entradas, devemos fornecer um módulo comum porque precisamos dele dentro de cada módulo. Por exemplo, para loops como no G4, oferecendo G Se agora, vamos criar nosso componente inicial para essa biomassa, criar um novo diretório componentes. E por dentro, queremos criar uma nova pasta home. E sim, eu entendo que temos apenas um único componente aqui e não faz muito sentido criar componentes de barra do que a pasta Home dentro. Mas, no entanto, é uma boa estrutura. E se você não precisou dividir essa página inicial em componentes diferentes, certeza pode fazer isso. Então, vamos entrar na página inicial e criar aqui o componente home dot HTML e o componente home dot ds. Agora vamos pular dentro da página HTML e voltar para casa aqui, mas não precisamos de nada, apenas algo para testar. Agora vamos pular dentro do nosso arquivo ts. E aqui queremos criar nossa classe e é o componente doméstico. Depois disso, devemos registrar nossos componentes. Então, aqui queremos injetar nosso componente e, por dentro, devemos primeiro fornecer um seletor. Então, aqui vou simplesmente usar um seletor de casa porque não faz muito sentido prefixar nosso componente doméstico com o nome do módulo como home, home, simplesmente não é necessário após a nossa seletiva, devemos forneça aqui no URL do modelo e, em seguida, diga URL do modelo, teremos o HTML do componente inicial. E nosso último passo aqui é adicionar nosso componente à nossa declaração. Então, dentro do módulo home aqui, queremos criar declarações e colocar dentro do nosso componente home. Tudo parece bem aqui, mas não criamos uma rota. É por isso que aqui eu quero criar uma rota de propriedade. E podemos dizer que esse é o tipo de rotas e este é um array com apenas uma única chave. E aqui estará nosso caminho. Esta é uma string vazia, significa homepage, e aqui está o nosso componente, e nosso componente será o componente inicial. Depois disso, podemos registrar essa rota dentro das entradas. Então, aqui estará o ponto do módulo de rota para rotas secundárias. E agora não devemos esquecer de registrar nosso módulo doméstico dentro do módulo do aplicativo. É por isso que eu quero voltar para dentro do nosso módulo de aplicativos. Aqui, insider in birds, podemos adicionar nosso módulo home. Tudo está parecendo bem. Não vejo nenhum erro dentro do observador. Então, vamos abrir um navegador e aqui está nossa página inicial. Como você pode ver, a palavra home é renderizada aqui, o que na verdade significa que criamos com sucesso todo o nosso módulo e componente vazio. E agora simplesmente devemos tentar marcar para a página inteira. Este é o meu, vamos voltar para dentro dos componentes domésticos, home, HTML do componente doméstico. Aqui, comece a escrever nossa marcação. Nada de especial aqui, apenas muitos elementos DOM. Então, aqui temos cabeçalho com cabeçalho home de vidro. E agora vamos fechar esse cabeçalho. Em seguida, queremos criar um link para nossa página inicial. Então, aqui estará uma barra de link do roteador. E aqui temos a aula em casa tinha um link para casa. Vamos fechar a venda e dentro do vínculo duplo para mostrar uma imagem. Então, aqui teremos a barra da fonte da imagem, etc, barra Trello, o logotipo, o ponto branco SVG. E vamos fechar essa imagem. Como você pode ver no navegador, ele é aplicado. E aqui vemos nosso cabeçalho e link para nossa página inicial. Agora devemos fornecer links para a página de login e registro. É por isso que depois de um, podemos escrever div. E dentro do div podemos escrever dois links. Em primeiro lugar, aqui, dentro do div terá um link de roteador para o nosso login de barra que acabamos de criar com a classe WHO tinha um login, fecharei a venda. E logo dentro do login, agora podemos copiar e colar este link e aqui temos o registro de barra. Aqui está o registro do cabeçalho inicial da classe, e o texto dentro também será registrado. Vamos verificar se está funcionando, como você pode ver no navegador aqui à direita, temos link de login e link de registro. Agora, digamos que o primeiro bloco da nossa página. Então aqui estará div, herói doméstico da classe. Vamos fechar essa div e, dentro, queremos adicionar um contêiner inicial da classe div. Vamos fechar essa div. E dentro do contêiner doméstico, temos um div. E dentro dessa div estará a tag H1. E aqui temos o título de Desh em casa de classe. Vamos fechar esse H1 e dentro de cada um que eu quero colar. Embora o texto preparado ajude as equipes a trabalhar de forma mais colaborativa e a fazer mais depois de cada uma, temos a tag p. Essa é a nossa descrição. Aqui deve estar a descrição da casa de vidro. E dentro deste p vou colar a descrição sobre quadros, listas e atuais do Trello. Depois da primeira div, teremos uma segunda div. Vamos fechá-lo. Lá dentro. Deveria ser uma imagem. Então, aqui estará fonte da imagem slash acids slash hero dot SVG. E vamos fechar essa imagem e verificar se está funcionando. Estamos pulando dentro do navegador. E como você pode ver aqui, temos uma primeira seção da nossa página inicial. Aqui à esquerda temos texto e boa imagem à direita. Acho que você tem uma ideia de como funciona a taxa de trabalho e blogs para a página inicial. Como você pode ver, simplesmente temos título, a descrição e a imagem do blog, o que realmente significa que você deseja acelerar o processo de criação da página inicial, porque este é apenas um HTML sem nenhuma lógica. Então, aqui eu quero colar o segundo time da casa do blog. Se desejar, você pode simplesmente pausar o vídeo, redigitar tudo ou simplesmente pegar o HTML da página inicial do código-fonte abaixo do vídeo. Então, o que temos aqui, temos a equipe da casa, o contêiner da equipe do contêiner doméstico dentro. Trabalhamos com qualquer equipe, alguma descrição e uma imagem. Vamos verificar como isso se parece. Aqui. Depois do nosso primeiro elemento, temos o segundo com texto e agora a imagem. Vamos criar agora mais um bloco aqui. Estou colando informações da casa. mesma coisa aqui temos aulas em imagem do que H1 e p. Vamos dar uma olhada nisso. Estou recarregando a página e temos aqui na parte inferior mais um bloco com uma imagem e textos. E agora vamos colar nosso último bloco. Como você pode ver, é um pouco maior. Temos aqui algo sobre fluxo de trabalho e automação. Aqui temos a descrição H1 e também a lista de marcadores. E à direita temos uma imagem como sempre, como você pode ver aqui à direita temos uma imagem e à esquerda temos primeiro uma descrição do título e depois uma lista de marcadores, que na verdade, significa que criamos com sucesso nossa página inicial. Não era algo especial, apenas um marcador para usuário não logado. 18. Interceptor de auth: No vídeo anterior, criamos com sucesso nossa página inicial, mas agora temos apenas um único problema. Na verdade, implementamos muito a obtenção do usuário após a página apenas para lembrá-lo, dentro do nosso aplicativo de insight do cliente, componentes do aplicativo ts, estamos chamando nosso serviço de obter usuário atual. E, na verdade, agora estamos sempre recebendo um erro aqui e não autorizado. E, na verdade, se eu pular para a página de registro e apenas criar alguma conta que não existia anteriormente. Como você pode ver após o registro onde reagiu à página inicial. E dentro do armazenamento local, temos esse token. Isso é o que configuramos no back-end para autenticar nosso cliente. Mas depois recarregue a página. Este token não é usado e estamos chegando aqui sem autorização. E a ideia é basicamente que o cliente da torre deve, em cada solicitação, aplicar esse token do armazenamento local, se o tivermos, neste caso, nosso back-end sabe quando foi autorizado, mas imagine se raramente precisarmos entrar em cada método, como por exemplo, obter usuário atual e que ele tem algum cabelo do armazenamento local. Isso não é deficiente, consome e realmente queremos apenas adicionar esse token em cada solicitação. Para isso dentro do Angular, temos middlewares. É por isso que agora vamos criar um middleware agora. Então, o que é Middleware? Isso é algo no meio entre iniciar nossa solicitação e, e, e, na verdade, aqui temos, por exemplo, o HTTP GET e criaremos um middleware. Isso significa que depois que essa solicitação foi iniciada, mas ela não foi enviada para cá. Queremos aplicar middleware, então queremos fazer algo. Por exemplo, é preciso um cabeçalho lá. É por isso que eu quero entrar nossos serviços domésticos e criar aqui em seu horário de serviço, interceptor, ponto ts de serviço DOD. E será apenas uma aula, assim como o serviço injetável normal. Aqui temos especialistas, horário de aula, interceptor, e aqui devemos dizer que implementa interceptor http. Portanto, a ideia principal é que esse middleware no Angular seja chamado de interceptivo porque intercepta nossa solicitação. E aqui estamos escrevendo implementa interceptor http para obter um interceptor de casa de classe estreita implementa incorretamente interface e interceptação de propriedade está faltando, e isso é exatamente o que devemos criar para implementar esse middleware. É por isso que aqui vamos criar um novo método que é chamado de interceptação. E como você pode ver aqui, meu preenchimento automático já recebeu solicitação e próximo, e retorna evento HTTP observável do escritório, o que na verdade significa que temos um acesso total ou solicitação aqui dentro da propriedade request. E ligaremos em seguida quando estivermos prontos e terminarmos tudo o que precisamos fazer aqui. É por isso que, antes de tudo, o que queremos fazer lá dentro é obter um token do nosso armazenamento local. Então, vamos escrever aqui que temos um alvo e este é o item get de armazenamento local. E por dentro estamos fornecendo token. Depois disso aqui eu quero escrever request equals request clone. E aqui dentro estamos fornecendo um objeto com cabeçalhos de conjunto de campos. Os insights de que os cabeçalhos são um objeto que estamos fornecendo autorização são iguais a uma string falante ou vazia. E depois disso, estamos ligando para retornar ao lado da maçaneta e recebemos nossa solicitação. Então, o que esse código está fazendo, em primeiro lugar, aqui obtivemos um token da Pesquisa Google. Portanto, é um it indefinido ou é um token válido. Agora aqui estamos fazendo pedido de clone. Por que estamos fazendo isso? Como o pedido é imutável, não podemos realmente mudá-lo. É aqui que devemos colônia para definir algo. Aqui estamos usando o cabeçalho do conjunto de propriedades para definir um cabeçalho. O cabeçalho é chamado autorização e dentro estamos fornecendo nosso token. Então, se não tivermos um token, estamos dizendo aqui uma string vazia. E depois disso, estamos chamando next handle, o que significa essencialmente que devemos continuar nossa solicitação e estamos fornecendo uma solicitação atualizada dentro. Então é assim que estamos criando middlewares ou interceptores dentro do Angular. Mas agora devemos injetar esse interceptor dentro do nosso aplicativo. Mas o principal, mas queremos fazer para injetar interceptor, não módulo de dentro para fora, mas dentro do módulo de aplicativo, porque queremos fazer isso em um nível global para injetar interceptor, estamos usando provedores aqui. Então, o que queremos fazer dentro disso fornece um objeto com field provide, e aqui estamos usando interceptores HTTP. Está vindo do Angular também estamos aqui usando a classe. E esta é nossa classe, nosso interceptador, que acabamos de criar. E o último é movido para verdadeiro. E é exatamente assim que devemos fornecer interceptores http dentro do Angular. Então, aqui estamos dizendo que devemos nos registrar e você forneceu e é um interceptor http e devemos usar nosso interceptor de horas de aula. Agora vamos verificar se está funcionando. Estou recarregando a página e vamos verificar dentro da rede, nosso usuário de solicitação. Na verdade, aqui eu quero rolar até o final. Aqui podemos ver a autorização e nosso token, que na verdade significa que nossa interceptação, está funcionando corretamente. E aplicamos diretamente esse cabeçalho de autorização a cada solicitação, por exemplo, para obter um usuário atual. Mas ainda estamos recuperando nosso erro 401 e eles realmente sabem qual é o problema. Se olharmos para dentro do armazenamento local, podemos ver esse token simplesmente como um alvo, isso é apenas um valor. Mas se voltarmos para dentro do nosso backend aqui, dentro da fonte, middlewares, corujas. E é aqui que estamos verificando um token aqui, como você pode ver onde fazer divisão por um espaço. Porque, como eu disse anteriormente, estávamos certos na cerveja e depois no espaço falando. Se estivermos usando uma autenticação DVT, esse não é o nosso caso aqui. Não temos aqui uma palavra, cerveja, e esse é exatamente o nosso problema. Não o implementamos e devemos fazê-lo quando estamos devolvendo um token ao cliente. Então, aqui dentro dos servidores, controladores de origem, usuários, quando geramos torque aqui, dentro de usuários normalizados, devemos escrever aqui espaço. Aqui temos o trem da justiça, onde dentro, onde certo, e cerveja. E aqui estamos injetando nosso token que geramos. Vamos verificar se está funcionando. Portanto, nosso token é inválido, eles simplesmente o removerão e ele pulará para a página de registro. Agora eu quero apenas colocar algumas credenciais aqui e clicar em registrar. E agora, quando estamos verificando nosso armazenamento local, você pode ver que temos cerveja do que espaço e estamos conversando. É por isso que quando eu recarrego a página com o erro don't get for 01 mais, estamos recebendo aqui nossa resposta. E, na verdade, aqui você pode ver que nosso usuário de solicitação é 200 e nossa resposta é exatamente o que esperávamos, como está funcionando. Mais uma vez, estamos nos registrando, por exemplo, ou fazendo login e configurando um token dentro do armazenamento local. Então, o espaço Birra e o token, então, toda vez que estamos fazendo um interceptor de saída de solicitação dentro do Angular, ele anexa dentro do cabeçalho, esse token de autorização. E aqui temos o bear e, em seguida, nosso token e nosso back-end verificam esse usuário e nos dão uma resposta aqui. É por isso que toda vez que recarregamos a página, estamos recebendo de volta nosso usuário atual. E isso é exatamente o que queríamos alcançar. Agora, aqui dentro de nossos clientes fonte AB, componente AB, sim, eu quero fazer uma pequena melhoria porque na verdade, aqui anunciamos o serviço, mas não usamos esse Ras e na verdade agora estamos recebendo um usuário para que possamos escrever aqui não trans, mas este é o usuário atual. E em vez do log do console, queremos defini-lo com o método que já estamos preparados. Então, aqui temos isso, nosso serviço dot set usuário atual, e dentro estamos fornecendo nosso usuário atual. Então, agora nosso usuário está logado com sucesso em nosso aplicativo. 19. Guarda de auth: Neste vídeo, quero falar sobre Gvd em nossos URLs, que na verdade significa, por exemplo, não devemos permitir que o usuário pule para a página inicial. Se ele já está trancado, ele deve pular diretamente para a prancha. Por exemplo, se não estamos bloqueados e estamos tentando pular para a página do quadro, quando não for permitido entrar e devemos ser redirecionados para a página inicial. Portanto, existem diferentes abordagens para esse problema. Mas para qualquer caso de uso, eu recomendo que você comece criando um observável de estanho islâmico. Vamos fazer isso agora. Então, na verdade, eu quero entrar em nosso aplicativo, nossos serviços, nosso serviço aqui será criado fluxo de usuários atuais. E como eles disseram, isso é cortado que podemos usar em qualquer lugar de nossa aplicação. E só para lembrá-lo, estamos usando aqui definir usuário atual para alterar o fluxo. Então, essencialmente o que podemos fazer agora, por exemplo, dentro do nosso componente de aplicativo em algum lugar aqui depois de junho nele, podemos escrever este ponto, nosso serviço ponto usuário atual aqui estamos certos e inscreva-se no quadro, e estamos recebendo aqui nossa resposta. E agora eu só quero escrever aqui o log do console. Então você vê do que eu estou falando? Então, aqui nos inscrevemos no stream do nosso serviço. E agora, toda vez que mudamos nosso fluxo, estamos recebendo esses dados de volta dentro desse componente. Vamos verificar no navegador agora. E estamos obtendo aqui dois registros de console. Em primeiro lugar, corra e defina, e depois Ras e as informações sobre nosso usuário, por que isso está acontecendo assim no início do fluxo é indefinido porque ainda não suspeitamos do usuário. Mas depois de algum tempo em que nossa chamada currentUser for concluída e for bem-sucedida, estamos definindo esse currentUser dentro desse fluxo. É por isso que cada local em que assinamos esse usuário atual pode obter essas informações. E essa é exatamente essa informação. Mas podemos torná-lo ainda melhor porque essencialmente, queremos verificar se estamos trancados ou não. É por isso que normalmente você deseja receber essa resposta e convertê-la em booleana e verificar se é verdadeira. Nesse caso, estamos presos, mas não queremos escrever esse código em todos os lugares. É aqui que podemos, dentro do nosso serviço, criar um fluxo adicional com base em nosso primeiro fluxo. Então, aqui está o nosso usuário atual do Stream. Mas agora eu quero criar um novo fluxo, que é chamado é logger tin. E agora, dentro do nosso aplicativo, em qualquer lugar que possamos usar, o novo fluxo é a equipe de log. Então, o que eles fizeram lá? Aqui estamos usando esse usuário atual e isso já é um fluxo. Nós simplesmente queremos transformá-lo em outro valor. É aqui que estou no pipe do DOD, depois na função Mapa do Site. E se você não sabe, esse é o código Rix JS. Então, essencialmente, estamos usando looks xadrez e dizemos ao Angular para transformar nossos fluxos. E estamos usando dessa forma. Estamos sempre escrevendo dot pipe e depois a lista de nossas transformações. É aqui que você verá esse tubo em todos os lugares e aqui dentro de onde usando o mapa para mapear nossos dados. Então, sabemos que dentro do nosso mapa podemos obter três estados diferentes, indefinido, falso e verdadeiro. Mas o ponto principal é que nosso aplicativo não se importa com indefinido. Era relevante verificar se o login. Se tivermos essas informações, se ainda não as tivermos, queremos apenas aguardar essas informações. Isso é muito antes de eu querer pular essa propriedade indefinida como. É aqui que podemos usar o filtro antes do nosso mapa. E o filtro também é uma função. Então, essencialmente, em primeiro lugar, estamos usando filtro dentro do tubo e depois um mapa. Então, o que estamos obtendo filtro de insight dentro do filtro obtendo nosso usuário atual, e na verdade esse usuário atual pode ser indefinido agora ou nosso usuário atual. E aqui não queremos chegar ao mapa se for indefinido, é por isso que aqui podemos escrever que o usuário atual não é igual a indefinido. Então, neste caso, viremos aqui e aqui está o nosso mapa. Então, o que queremos fazer mapa inserido, onde eu entro aqui, usuário atual. Aqui queremos simplesmente convertê-lo em booleanos para que possamos escrever aqui booleano e depois usuário atual. Nesse caso, essa lógica nos trará de volta verdadeiro ou falso, e ignoraremos isso, indefinindo-o que não precisamos e não usaremos dentro de nosso aplicativo. Mas podemos simplificar ainda mais esse código. Em vez de voar e essa lógica pode definir o mapa, podemos simplesmente escrever aqui booleano, e ele fará exatamente o mesmo. Então R is look at tin é um novo fluxo baseado no usuário atual, que retornará para nós verdadeiro ou falso. Vamos verificar se está funcionando. Eu vou voltar para o componente de configuração. E aqui eu quero escrever este ponto ou ponto de serviço está bloqueado. Aqui também podemos escrever Assine e nossas cabeças e nosso descanso estarão trancados. Então, vamos verificar isso. Podemos até nomeá-lo para ser mais compreensível, está logado. E aqui vamos console log é log of tin, coma é propriedade de login. Vamos salvar isso e verificar o navegador. Estou recarregando a página e aqui não vemos o Islã ficando indefinido. É. Nós simplesmente vemos que aqui é baixo passar porque este é o primeiro estado em que temos verdadeiro ou falso. E é exatamente assim que podemos usar em qualquer lugar do nosso aplicativo, esse fluxo para saber se o usuário está logado ou não. Então, agora eu quero remover esse código porque não precisamos dele aqui. Foi só para testes. E agora eu quero mostrar a solução mais fácil, como você pode redirecionar o usuário para outra página. E podemos simplesmente começar com nosso componente inicial, porque essencialmente aqui queremos redirecionar o usuário para a página do quadro, se ele já estiver bloqueado, como podemos fazer isso. Em primeiro lugar, aqui, devemos injetar dentro do construtor nosso, nosso serviço. Então, aqui o serviço de horário privado é anunciado, serviço que já temos. Agora, aqui queremos escrever implementos no necessário, então inicializamos. Agora, aqui vamos usar a engenharia nele. E por dentro agora podemos escrever exatamente essa lógica Lake Road dentro do nosso componente de aplicativo. Então aqui vai estar este ponto, nosso ponto de serviço. Aqui temos está trancado. Então, depois disso, podemos escrever Subscribe e podemos obter aqui é fazer login na propriedade aqui dentro desta assinatura ou obter true ou nós obtemos false. E se entrar aqui verdadeiro, queremos redirecionar o usuário para a página do quadro. É aqui que podemos simplesmente experimentá-lo. Eve é como uma lata. Em seguida, queremos redirecionar o usuário. E para tentar redirecionar, podemos usar como usamos anteriormente, roteador. Então, aqui vamos criar um novo roteador de propriedade privada. E esse roteador, agora dentro da nossa condição if, podemos escrever esse ponto, ponto navegar por URL. E aqui podemos apenas fornecer painéis de barras. E, na verdade, ainda não implementamos essas barras, mas isso não importa. Nós simplesmente fazemos isso como um exemplo, como você pode restringir o acesso aos URLs. Vamos verificar isso. E, na verdade, aqui já recebemos um erro, não podemos corresponder a novas rotas. E aqui estão os quadros. E, essencialmente, podemos verificar isso, por exemplo, com o registro de barra. Para entender que está funcionando, vou recarregar a página e como você pode ver onde no slash register, por que está acontecendo quando pulando para a página inicial, estou pressionando Enter e nem vimos nossa página inicial onde eles se registram diretamente. Portanto, esta é a maneira mais fácil de implementar, digamos, o redirecionamento angular para outra rota. Mas aqui está um problema que usamos aqui, inscreva-se em uma troca. Você deve ser muito cauteloso com isso. Porque se estivermos usando subscribe, também devemos escrever unsubscribe. Se não tentarmos cancelar a inscrição, isso significa que temos uma assinatura de revólver dentro de nosso aplicativo. Na verdade, nossa patologia do componente doméstico foi destruída porque estamos dentro da página de registro, mas essa inscrição ainda está lá porque não cancelamos a inscrição dela. É aqui que devemos sempre lembrar cancelar a assinatura de nossas assinaturas. Para fazer isso, basta criar uma assinatura aqui na parte superior, por exemplo, é fazer login na assinatura e o tipo é assinatura. Agora, aqui dentro do nosso mecanismo, podemos atribuir esta assinatura registrada. O resultado do Subscribe será nossa assinatura. Agora, aqui no topo, podemos adicionar destruir. Então, quando esse componente será destruído, mas queria criar em G no método destroy. E por dentro podemos simplesmente escrever isso é como obter assinatura, DOD, cancelar inscrição. Estou salvando isso, mas estamos recebendo um erro. Não temos inicializador aqui porque há baixo get in por padrão não está definido, é indefinido e é verdade. É por isso que aqui podemos escrevê-lo ou indefini-lo, porque ele não é definido por padrão e simplesmente o definimos em engenharia nele. Mas este é o meu código aqui, é inválido porque esse objeto pode ser indefinido. É por isso que aqui devemos colocar um ponto de interrogação. Portanto, essa linha não fará nada se for um it indefinido. Mas se tivermos uma assinatura, teremos sucesso com o cancelamento da assinatura quando o componente for destruído. Mas agora eu quero mostrar a você a segunda variante possível dentro e cor para fazer redirecionamentos ou para proteger suas rotas. E esse é exatamente o recurso que é chamado de quadrantes dentro do Angular. E a ideia é exatamente a mesma que com os interceptores, estamos fazendo algo antes do trabalho definir o componente. Então, essencialmente, queremos fazer alguma verificação e retornar verdadeiro ou falso. Este é o caminho aqui dentro de nossas horas de módulo. Quero criar um serviço de insights e você arquivar, e será nosso serviço word dot. Então, aqui eu quero exportar nosso novo serviço de palavras em horário de aula. E aqui estamos escrevendo que os implementos podem ser ativados. E isso é exatamente a mesma coisa que fizemos com nossos interceptores. Como você pode ver aqui, devemos definir, pode ativar para fazer esse R quadrado funcionar. É por isso que aqui podemos escrever, ativar, e aqui estamos recebendo muitas coisas dentro. Na verdade, não precisamos de tudo isso. Podemos removê-lo e esse retorno é muito detalhado. Queremos voltar aqui. Queremos retornar um observável de Boolean, que na verdade significa que estamos retornando verdadeiro ou falso. Mas como o fluxo, agora aqui dentro, queremos usar nosso serviço. É por isso que aqui devemos definir o construtor e injetar aqui dentro do nosso serviço de nosso serviço de horas. E a ideia é que dentro desse método, devemos retornar um observável de Boolean. Este é o caminho aqui diretamente. Eu posso escrever isso. Nosso serviço. Dot é uma lata de madeira. Aqui eu quero escrever pipe porque precisamos fazer algumas coisas dentro. Essa é a minha visão. Também adicionarei o MAB e estamos chegando aqui, pois um argumento é a propriedade de login. Agora, aqui dentro, eles querem simplesmente verificar se temos login, então é verdade, então eles querem diretamente retornar verdadeiro. Mas se tivermos false, quero redirecionar o usuário para outra página. É aqui que também precisamos de um roteador. Assim, podemos injetar aqui roteador privado, e este é o nosso roteador, e podemos usá-lo aqui. Então, estamos escrevendo este roteador ponto de navegação por URL. Por exemplo, com o detector, use o para a página inicial. Se eles não estiverem trancados. Depois disso, devemos retornar false. É obrigatório porque, essencialmente, este é um observável de Booleano e devemos não apenas fazer algo aqui, mas também retornar false. E aqui eu quero navegar por URL, não string vazia, mas apenas uma barra. E você pode dizer, mas por que não voltamos, simplesmente ouça isso, porque esse trancado é um fluxo com verdadeiro ou falso. Porque aqui também queremos usar rota e navegar por URL, e podemos fazer isso se simplesmente retornarmos verdadeiro ou falso. Então agora nosso guache está pronto, mas devemos nos registrar corretamente. Este é o meu dentro do nosso módulo. Aqui dentro dos provedores, devemos colocar nosso serviço de notícias de corujas que acabamos de criar. Agora devemos verificar em alguma rota, nosso quadrante de rotas, é aqui que podemos, ele pode ser ativado. E, por dentro, estamos fornecendo um array com nosso serviço de autenticação, o que na verdade significa que, quando estamos pulando para o login, nosso serviço externo verificará se estamos bloqueados em um nó com o uso de nosso fluxo. E se retornar false, seremos redirecionados para a página inicial. Vamos verificar isso. Estou recarregando a página e estamos recebendo um erro. A classe, nosso serviço quadrado não pode ser criado porque não tem decorador angular. E, na verdade, aqui de dentro para fora ao quadrado, esqueci de escrever injetável. Não se esqueça disso. Este é o caminho aqui. Vamos colocar colchetes injetáveis e redondos. Vamos recarregar a página, mas não temos nenhum erro. Agora eu quero tentar pular para a nossa mesma média. Estou atingindo a mesma média. E como você pode ver, posso acessar a página de login porque aqui escrevemos podemos ativar nosso esquadrão. O que realmente significa que, se estamos passando por aqui, podemos acessar esta página. O que realmente significa que, se aqui dentro do nosso aplicativo, removerei nosso token e eles recarregarão o login da página. Serei redirecionado para a página inicial porque eles não têm acesso a esta página específica porque podem ser ativados, o que na verdade significa que implementamos com sucesso o acesso às páginas em dois maneiras diferentes. Em primeiro lugar, usando o componente e segundo lugar, usando o recurso Angular que pode ser ativado. Mas, na verdade, criamos essa coruja ao quadrado, não para login ou registro, mas para futuras placas e páginas de port, porque havia muitas solicitações apenas para usuários logados. É aqui que eu removerei, posso ativar. E eles também querem mudar nosso código de volta a página inicial dos componentes domésticos, porque aqui não devemos redirecionar para o registro de barra, mas sim placas de barra, que implementaremos em nosso próximo vídeo. 20. Placas de captação: Nos vídeos anteriores, terminamos de implementar nossa página inicial e agora estamos iniciando uma nova seção. E este é um quadro de páginas. Então, sobre o que é esta página, esta é uma página onde podemos obter a lista de painéis do usuário, executá-los na tela e criar um novo quadro. Aqui você com certeza quer perguntar, ok, mas temos soquete IO. Usaremos soquetes que você está exatamente nesta página? E minha resposta é não, porque não precisamos usar socket ou o seu em todos os lugares que temos para isso é para TP ontem, muitos casos em que precisamos de soquete IO, mas com certeza não para esta página. Por que não? Porque, na verdade, esta é a página onde nós, para o usuário atual, uma lista aleatória mais simples de palavras. Não temos outros usuários que precisem acessar essa página específica. É aqui que não faz sentido usar aqui o soquete IO, mas não se preocupe, usaremos o socket ion muito mais tarde na página da placa única. E neste vídeo, vamos nos concentrar em criar nosso quadro no back-end e obter a lista de placas da API. É por isso que vamos voltar do nosso cliente para o nosso servidor. Aqui dentro de nossa pasta de origem, dentro de tipos, queremos criar uma nova interface e vamos chamá-la de board, dot interface e dot ts. Portanto, o conselho é nossa nova entidade. Dentro, registraremos nossa interface de placa, que usaremos em diferentes páginas. Por exemplo, na página com a lista de quadros e na página do quadro único. Então, aqui queremos exportar nossa nova interface e esta placa. E a questão é: o que teremos dentro, exatamente como fizemos dentro do nosso usuário. Teremos aqui uma interface para a placa assim. E teremos aqui o documento do conselho, que estenderá o documento para obter pelo menos uma identificação. Portanto, não precisamos de NAD aqui, mas precisamos de pelo menos um título. Portanto, cada porta deve ter um título. Em segundo lugar, nós o teremos criado aqui, é data e também será data. E, na verdade, aqui no lado direito, usuário, como você pode ver, não criamos o head atualizado, mas está lá por causa do Mongoose, então podemos escrevê-lo aqui também. O último campo que precisamos aqui dentro do nosso quadro. Nosso conselho deve pertencer a algum usuário. É aqui que devemos salvar o MAD do usuário que criou esta placa. E para isso, podemos escrever aqui ID de usuário, e não estamos escrevendo aqui string, mas tipos de ponto Schema, ID de objeto de ponto. Agora devemos importar aqui no esquema superior do Mongoose. Como você pode ver aqui, temos essa notação especial, tipos de esquema, ID de objeto ponto. E é exatamente assim que estamos criando um d's dentro do Mongoose. Então, por dentro, isso não é apenas uma ideia, é um ID de objeto, mas no momento em que construiremos nossa API, esse ID de usuário será simplesmente uma string rápida, para que possamos entender o que o usuário criou essa parte específica. Nosso próximo passo aqui é criar nosso documento para o conselho. É aqui que eu quero uma interface especializada e aqui temos o documento do Word, exatamente como tínhamos à direita. Aqui queremos usar o documento extents e este documento está chegando até nós do Mongoose, então não devemos esquecer de adicioná-lo aqui no topo porque outro caso não funcionará. Aqui, simplesmente colocamos colchetes e nada mais. Portanto, não temos aqui a senha de validação ou algo semelhante porque simplesmente estendemos o documento e assustamos qualquer coisa nova. Então, criamos com sucesso nossa interface de placa. Agora é hora de criar nosso modelo. Então, dentro dos modelos, estamos criando novos pontos de quadro de arquivos. E, novamente, assim como fizemos no usuário, criaremos nosso esquema de quadro. Então, aqui à direita, abrirei nosso usuário para que possamos dar uma olhada. Primeiro de tudo, aqui no topo, vou importar esquema e modelo. E agora queremos criar nosso esquema de quadro exatamente como fizemos com nosso usuário. E aqui estamos vendo um novo esquema e esse é o esquema do mangusto. E lá dentro estamos fornecendo nosso documento do conselho que acabamos de criar. Depois disso, temos colchetes redondos e, dentro, devemos fornecer todos os campos do documento do nosso conselho. O primeiro campo aqui será intitulado. Então, o que é título? É uma corda. Então, vamos dizer aqui que nosso tipo é string. E em segundo lugar, é necessário porque não podemos criar nosso quadro sem um título. É por isso que colocamos aqui obrigatório. Como você pode ver aqui, estamos recebendo um erro. Portanto, o argumento do tipo title não é atribuível ao parâmetro, o que na verdade significa que fizemos algo errado com nosso documento do conselho. E veja nosso problema porque aqui foram estendidos do documento, mas não estendemos do nosso Conselho, o que na verdade significa que todas essas propriedades não estavam disponíveis rapidamente, como você pode veja agora que não temos nenhum erro. O título é que agora só precisamos fornecer o ID do usuário. E aqui dentro, devemos definir nosso tipo e será exatamente o mesmo esquema, tipos de ponto, ID de objeto de ponto. E o próximo é necessário neste caso quando não, Ok. O uso do raio D também é obrigatório. Depois disso, devemos exportar nosso modelo. Então, aqui estará o modelo padrão do especialista e estamos fornecendo uma visão como um documento genérico do nosso conselho aqui agora podemos abrir nossos colchetes e o primeiro perímetro que estamos fornecendo aqui chamado quadro. E há um segundo parâmetro, nosso esquema de placa. Então, como você pode ver, implementamos nossa placa exatamente da mesma maneira que fizemos com o usuário. Mas o board é muito mais simples porque não temos aqui métodos adicionais e validações adicionais. Agora devemos criar um novo controlador de placa. E o método para colocar o Albert lá dentro. É por isso que o que eu quero fazer, eu quero pular em tais camadas de servidor de origem de serviço. Aqui. Em primeiro lugar, quero registrar uma nova rota e ela será app.get. E temos aqui slash api slash boards. E esta é a lista para obter todas as placas do usuário atual. É aqui que queremos usar nosso middleware de SO, porque se não estivermos logados, podemos obter placas. Precisamos ter um usuário. E o último aqui será o controlador do nosso conselho. Nós não temos aqui e aqui, ponto, por exemplo, obter pranchas. Portanto, devemos criar controlador da nossa placa e aqui obter o método da placa. É por isso que no topo. Em primeiro lugar, quero inserir nossa estrela como controladora da placa, Roma, e aqui estarão as placas de barra dos controladores de caminho. E ainda não temos esse arquivo, então vamos criá-lo agora. Aqui dentro dos controladores, eu posso criar pontos ts de placas, e aqui devemos criar uma nova ação. Aqui, faremos exatamente da mesma maneira que fizemos dentro do controlador de nossos usuários. Então, primeiro de tudo, no topo, precisamos inserir nossa resposta de solicitação e a próxima função do express. Depois disso, podemos criar nossa nova função, obter placas, que será uma função assíncrona. E estamos chegando aqui antes de tudo, nossa solicitação e isso é tipo de solicitação, depois resposta, é tipo resposta. E o último é o próximo do tipo, próxima função. E isso anteriormente, queremos escrever aqui try-catch para que possamos lidar com tudo corretamente. Aqui estamos recebendo nosso erro e podemos simplesmente jogá-lo dentro de nossa próxima era aqui será a próxima. Agora, dentro de nossa tribo devemos tentar permitir a lógica para isso. Devemos injetar aqui nosso modelo de placa que já criamos. Então, aqui vai ser um importante modelo do Conselho para Roma. E aqui para dançar, estamos pulando dentro de modelos slash board. E agora podemos tentar encontrar todas as placas por ID de usuário específico. Então, aqui queremos obter nossos conselhos de propriedades. E aqui estamos usando um modelo Bohr de peso. E se você não sabe, find encontrará para nós registros antigos por predicado específico. Então, dentro, podemos fornecer um objeto com usura alimentada t igual a request dot user dot ID. E como você pode ver aqui, obtemos diretamente uma seta do TypeScript informando que o usuário não existe dentro da solicitação. E isso está totalmente certo. Só para lembrá-lo, criamos aqui nossas próprias solicitações personalizadas com o uso de um campo interno. Aqui podemos escrever a interface de solicitação expressa e, nesse caso, ela funcionará corretamente, mas nosso usuário de solicitação pode ser indefinido e, em seguida, esse código não funcionará. É aqui que devemos tentar. Se não tivermos o usuário ponto de solicitação, então queremos jogar aqui para 01. Então retorne o endereço, envie o status, e aqui estará 401, exatamente como fizemos anteriormente no agora controlador de um usuário. Então, aqui na parte inferior, fizemos exatamente o mesmo. E agora devemos simplesmente responder com nossos conselhos. Então aqui podemos escrever rest dot sand, e estamos enviando aqui quadros. E a central, a lista deste quadro é apenas uma matriz. Vamos verificar se está funcionando. Como você pode ver aqui, insira o servidor, isso está conectado e eles não têm nenhum erro. Então, vamos pular para dentro do carteiro. Vamos fazer aqui um pedido slushy pie slash boards. E como você pode ver aqui dentro dos cabeçalhos, ou você já tem um token injetado porque usamos essa solicitação anteriormente. Estou batendo aqui na areia. E como você pode ver onde estou recebendo de volta uma matriz vazia porque não temos nenhuma placa. Então, agora a questão de como podemos obter algumas pranchas se ainda não tivermos nenhuma torta para criar uma placa. E para isso, podemos simplesmente pular dentro Mongo e criar esse porto por conta própria. Este é o caminho aqui. Dentro do console vou escrever docker exec menos 80 MongoDB Mongo. Então, essencialmente, queremos chamar o comando Mongo dentro do nosso contêiner, o MongoDB. Só para lembrá-lo se você não usou o mais escuro aqui, mas simplesmente instalou o MongoDB em sua máquina. Então você só precisa escrever o console de inserção MONGO e ele funcionará. Estou batendo aqui, insira-os aqui dentro do console do Mongo. Agora, aqui precisamos usar nosso banco de dados. É por isso que aqui estou escrevendo use space ultra long. E depois disso eles colocaram ponto e vírgula. Estou apertando Enter. E como você pode ver aqui, mudamos para o trailer dB HL. Agora, aqui podemos escrever as coleções de espetáculos e ponto e vírgula, e como você pode ver, essas são nossas coleções. Temos aqui quadros e temos nossos usuários. O que queremos fazer agora, queremos inserir um novo registro em nossos quadros. Para isso, podemos escrever db dot, ports, dot insert, e aqui temos uma função, então colchetes redondos e dentro de um objeto. E aqui devemos fornecer o que queremos inserir. No nosso caso, será apenas título, por exemplo, primeiro quadro. E devemos escrever aqui algum ID de usuário, mas aqui não devemos fornecer a string VM deve fornecer um ID de objeto. É aqui que eu quero escrever o ID do usuário dois pontos e, em seguida, o IED do objeto. Eu abri aqui colchetes redondos e por dentro estou colando em nosso fluxo. Como você pode ver, isso não é apenas usura, o fim da corda. Estamos começando aqui dentro do ID do usuário e do objeto com a string. E no final, devemos colocar um ponto e vírgula. Estou pressionando Enter e estamos obtendo o resultado correto inserido. E agora aqui podemos tentar obter todos os registros dentro dessa coleção específica. Então, db dot boards, dot find e colchetes redondos. Estou pressionando Enter e estamos recebendo apenas um objeto com ID. E essa é a ideia do primeiro quadro do título do nosso quadro e o AD do usuário é um ID de objeto correto. É por isso que agora podemos voltar para dentro do nosso carteiro, escolher nossa solicitação de painéis de API e clicar em Enviar. Como você pode ver agora, estamos recebendo nosso ASHRAE com um objeto dentro. Aqui temos nosso ID e aqui o vemos como uma string, título e ID de usuário, o que na verdade significa que criamos com sucesso nossa primeira placa a partir do console e temos a lista de nossas placas. Mas aqui eu quero melhorar o last small thin, como você pode ver aqui, estamos obtendo nossos IDs do backend com sublinhado. E, na verdade, normalmente a partir da API, estamos obtendo um DES. Normalmente sem sublinhado. Isso é exatamente a coisa do MongoDB, o que significa que não é tão confortável conseguir um, isso foi sublinhado no front-end e não quero fazer isso. E dentro do Mongoose, existe a possibilidade de ajustar isso. É por isso que eu quero voltar para dentro do nosso código, dentro das irmandades. E aqui, por exemplo, após nossa configuração de abuso, podemos escrever aqui o ponto do Mongoose definido aqui como o primeiro parâmetro que estamos fornecendo ao Jason. E como segundo parâmetro, estamos fornecendo um objeto. E por dentro, em primeiro lugar, estamos dizendo que terminamos Charles. E em segundo lugar, transforme. E aqui dentro transformados temos dois argumentos. O primeiro será sublinhado e o segundo será convertido. E essa é a função. E dentro dessa função, queremos escrever delete o ID de sublinhado de ponto convertido. Então, o que estamos fazendo aqui, aqui podemos mudar para o método JSON que está escrito dentro de um vai aqui, estamos fornecendo transformação, então estamos dizendo como vamos transformá-lo. E, na verdade, dentro do Mongoose, recuperaremos o NAD e o ID do sublinhado. E aqui vamos remover apenas do ID de sublinhado JSON, o que na verdade significa que dentro do Mongoose, ainda temos esse ID de sublinhado. Podemos usá-lo com segurança, mas não o obteremos dentro do JSON, obteremos um ID normal. E você também pode querer saber o que é virtual forte e, na verdade, o incitamento está dentro dos modelos. Podemos criar propriedades virtuais e, por padrão, dentro do Mongoose whoop não as recuperará. E, na verdade, queremos recuperá-los. É aqui que escrevemos virtuals, true. Então, vamos verificar se esse código está funcionando. Estou pulando de volta para o carteiro e estou batendo na areia. E como você pode ver aqui, estamos recebendo exatamente a mesma resposta, mas não temos ID de sublinhado. Temos apenas um d normalmente, que é uma string. E é exatamente como queremos usá-lo dentro do front-end. 21. Frontend para placas de gettings: No vídeo anterior, implementamos com sucesso a colocação de nossas placas no back-end. Agora devemos começar com nosso festival de frontend. Para isso, devemos implementar nosso módulo de placas. Mas só para lembrá-lo aqui dentro da fonte dos clientes , aplicativo, componentes domésticos, casa, Ts domésticos, temos muito direto nas barras quando estamos trancados. É aqui que devemos, antes de tudo, implementar nosso módulo de placas e dentro dessa rota, para que pelo menos nosso código possa funcionar com sucesso. É aqui que queremos criar novas placas de módulos. E este é um módulo separado para uma única página onde temos uma lista das placas e, na verdade, dentro também podemos criar um componente para uma única placa. Mas eu realmente quero separar esses dois módulos porque eles são dois diferentes. Este é o meu interior do nosso módulo de placas. Podemos criar placas ponto module.js. E aqui eu não quero escrever tudo do zero. Eu quero copiar e colar o módulo inteiro completamente e apenas alterá-lo. Então, o que temos aqui? Primeiro de tudo, nossa classe será módulo entediado. Não teremos aqui nas declarações, componente inicial e precisamos aqui e você, mas aqui não precisamos do caminho para casa, mas precisamos de placas de caminho. E essa casa de componentes não existe aqui, então precisamos mudá-la para nosso novo componente, componente de placas. É aqui que, na verdade, o que eu quero fazer, eu quero que os componentes internos copiem totalmente, cole este diretório inicial e cole-o aqui dentro das placas, dentro da pasta de componentes. Então, na verdade, você pode usar geradores angulares se quiser. Eu realmente só quero copiar e colar o módulo. É mais rápido para mim. Então, aqui eu quero renomear esses componentes para placas, e este é o nosso componente raiz das placas de módulo. E lá dentro temos dois arquivos. Em primeiro lugar, o componente HTML das placas. Em segundo lugar, componentes de placas ts. Aqui dentro do HTML, podemos simplesmente remover tudo e apenas escrever quadros para que possamos verificar se está funcionando. Agora, podemos pular para dentro do nosso componente de placas. E aqui, antes de tudo, podemos mudar nosso seletor e podemos escrever aqui quadros e nosso URL de modelo será um componente importante HTML. Agora, aqui dentro, temos nossa classe, que é componente de placas, e aqui devemos remover implementos. Não precisamos disso por enquanto. E eles removerão todo o código do nosso componente de placas, e também podemos remover todas as entradas. Então, criamos com sucesso nosso novo componente de quadro vazio e agora podemos usá-lo dentro de nosso módulo de placas. Aqui podemos escrever componentes de placas e fazer isso. Insira automaticamente aqui na parte superior. E agora aqui temos uma rota para placas de corte. E aqui, dentro das declarações, podemos definir nosso componente de placas. E o último passo que não devemos esquecer é que devemos registrar o módulo desta placa dentro do nosso módulo de aplicativos. Então, aqui dentro de nossas entradas, devemos adicionar módulo de placas. Vamos verificar se está funcionando. Eu não tenho nenhuma seta aqui dentro do servidor web. Agora eu quero pular para a nossa página e recarregar. E como você pode ver onde as palavras em barra aqui está o nosso texto. Se eu pular aqui na página inicial, estarei diretamente no quadro porque estou trancado. Agora, vamos verificar se seremos redirecionados de volta. Se não fizermos login. Para isso, por exemplo, podemos simplesmente remover o token e recarregar a página. E como você pode ver aqui, estamos ficando não autorizados, mas quando não redirecionados de volta para a página inicial. E essencial para isso, criamos dentro de nossa casa serviços r ao quadrado, e podemos usar esse R quadrado agora dentro de nosso módulo de placas. Então, dentro das placas, dentro do módulo Ts aqui na rota que podemos anexar, pode ativar. E aqui devemos fornecer uma matriz com o Serviço Mundial que criamos anteriormente. É totalmente bom usá-lo assim. Não precisamos registrá-lo aqui. Como você pode ver aqui, não há erros. Então, vamos recarregar a página. Como você pode ver agora, não podemos pular para nossos esportes de lama e fomos redirecionados para a página inicial. O que realmente significa que r pode ser ativado, está funcionando corretamente. E agora, apenas com uma única linha aqui, podemos definir quais páginas são permitidas apenas para usuários conectados. Então, criamos com sucesso nosso módulo de placas e agora quero criar uma interface de porta. E poderíamos criá-lo dentro do módulo de placas. Mas, na verdade, eu quero criar aqui dentro da nova pasta AB e chamá-la de compartilhada. Porque, na verdade, eu quero colocar todos os tipos que estamos usando em todos os lugares dentro dessa pasta compartilhada. Por exemplo, quadro de colunas de tarefas. Todas essas são entidades compartilhadas que podemos usar em diferentes módulos. O mesmo acontece com os serviços ou serviços que são compartilhados, como serviço de conselho, serviço de placa única, serviço coluna, serviço de tarefas. Poderíamos colocá-lo em um módulo específico, mas eu realmente quero colocar tudo isso em que apenas buscamos dados para o serviço compartilhado. É por isso que aqui temos a AB compartilhada. E aqui, antes de tudo, quero criar novos tipos de pasta. E agora, dentro dos nossos tipos de fotos de aplicativos, podemos definir um novo tipo e é a interface de pontos da placa. Ts. E vamos exportar aqui nossa nova interface. E isso será uma interface da nossa placa e devemos chamá-la de interface de porta. E por dentro, devemos definir exatamente os mesmos campos que criamos no back-end. E antes de tudo, aqui está NAD, é uma string. Em segundo lugar, é título, também é string. Também criamos aqui que isso é tenso e o último é atualizado. É também uma corda. E, na verdade, aqui adicionais estavam obtendo ID de usuário, apenas para lembrá-lo aqui dentro nossos modelos de origem de servidor e aqui temos nossa placa. Temos UserID, o que na verdade significa que aqui também obteremos o ID do usuário e é uma string. Nossa interface para um único Boyd está completamente pronta e podemos usá-la em qualquer componente. Agora eu quero criar o Serviço para trabalhar com quadros. E, na verdade, todos os pedidos, como criar quadro, ficar entediado , obter quadros, excluir quadro, entrarão no serviço. É aqui que aqui dentro compartilhado, quero criar uma nova pasta e chamá-la de serviços. E então disse que vamos criar um novo serviço chamado Boards service dot ds. Então, aqui vamos definir nossa nova classe. Então, aqui temos o serviço de placas de classe, e devemos escrever em cima dele injetável para que possamos usá-lo em qualquer lugar. O primeiro método que queremos definir aqui é obter placas. Isso é exatamente o que já estamos preparados no back-end. Então, aqui estão nossos painéis get e não precisamos fornecer nenhum argumento aqui. E vamos receber de volta um observável com um raio de nossas pranchas. É por isso que aqui podemos escrever um array de interface de porta. Isso é exatamente o que acabamos de definir. Agora, dentro deste get boards, queremos ter certeza de que o pedido HTP. É por isso que aqui devemos tentar construir e injetar. Aqui estão os clientes HTTP e HTTP. Agora, dentro de nossos quadros, queremos obter um URL exatamente como fizemos anteriormente para o serviço ao usuário. Então, aqui temos nosso URL e é o ambiente. Não use o URL da API para nós. E aqui está o slash board. Esse é exatamente nosso filho. Agora, aqui podemos retornar esse ponto http.get e queremos obter nosso URL sem nenhuma opção. E como você pode ver aqui, obviamente estamos recebendo um erro. O objeto observável não é atribuível à interface observável da placa. É aqui que aqui, como anteriormente, devemos especificar que estamos voltando em uma série de placas, para que nossos serviços estejam completamente prontos e eles só queiram testá-lo. É por isso que aqui eu quero voltar para dentro de nosso módulo de placas e devemos primeiro injetar o serviço aqui dentro dos provedores. Aqui podemos escrever que temos aqui o serviço de placas, e está disponível rapidamente. Agora temos permissão para pular dentro do nosso componente aqui injetado. Então, antes de tudo, quero definir nosso construtor e sabemos que aqui temos o serviço de placas e este é o nosso serviço de placas. Agora, além disso, eu quero escrever aqui implementos nele. E agora não inicializados, eles querem buscar esta lista de nossas placas. Então, aqui temos nossa energia nele e por dentro, eles podem simplesmente escrever este serviço de conselho, obter quadros, se inscrever para obtermos o resultado. Aqui estão alguns resultados. Na verdade, são placas e eles só querem registrar no console o que estamos recebendo de volta. Então, aqui estamos recebendo nossas pranchas, placas de coma. Vamos verificar se está funcionando. Mas não tenha setas aqui dentro do servidor web front-end. E vamos fazer login agora novamente porque estamos bloqueados. Então, aqui vou fornecer nossa comida em gmail.com. Agora, como você pode ver depois de fazer login, mas eu entro no slash boards. E aqui dentro do console podemos ver placas. E esta é uma única placa enquanto estamos conseguindo, porque no vídeo anterior foram criadas dentro do console para testar a torta neste ponto e, essencialmente subplacas para o nosso usuário atual. Por que isso? Porque eles, na verdade aqui está nosso pedido de back-end. Aqui, estamos encontrando nossas placas por ID de usuário, o que significa que estamos encontrando todas as placas dessa solicitação de ID de usuário de onde estamos obtendo essa ID de usuário de nossa solicitação de rede. Aqui está o pedido do nosso conselho e aqui estão nossos cabeçalhos. E como você pode ver aqui nos cabeçalhos na parte inferior, temos essa autorização e aqui está nosso token. Essas são exatamente as informações de que nosso back-end precisa para fornecer dados rápidos e corretos do usuário atual. Então, como você pode ver, está recebendo das placas dentro do módulo funciona corretamente. E preparamos com sucesso nosso serviço para obter uma lista de placas no cliente. 22. Formulário inline: Neste vídeo, quero falar sobre um módulo adicional que geralmente deseja criar ao vivo para o nosso aplicativo. E eu estou falando aqui sobre um formulário em linha. Vamos dar uma olhada no projeto totalmente concluído que estamos implementando. Como você pode ver aqui, estou na página de esportes de barra e aqui acabei de criar um usuário. Portanto, não temos nenhuma placa. E aqui temos a placa de criação. Como você pode ver, isso é apenas um quadrado com alguns textos. Mas quando estou acertando, você pode ver aqui uma entrada sem nenhum espaço reservado, podemos digitar aqui, por exemplo, foo board, e estamos pressionando enter. E depois disso, nosso conselho é criado diretamente. Aqui. Vemos esse cartão novamente, e isso é essencialmente um exemplo de um formulário embutido. Então, temos aqui um quadrado com o texto. Então estamos clicando aqui e ativando um modo de edição onde basta digitar algo e pressionar Enter. Portanto, a solução mais fácil aqui seria simplesmente criar esse componente e jogá-lo dentro de nossas placas. Mas então vamos pular em uma única placa. Aqui à esquerda, temos exatamente o mesmo. Você pode ver aqui o título do nosso quadro que estou acessando aqui e estamos entrando no modo de edição. Aqui vemos o título do nosso quadro, mas agora podemos alterá-lo para que possamos atualizá-lo e clicar em Enter e data da web, o título do nosso quadro, exatamente o mesmo que temos aqui com a lista. Este é apenas um tempo de texto escondido aqui e estamos recebendo aqui não apenas uma entrada, mas também um botão, pelo menos. E como você pode ver, os estilos são diferentes em cada caso, mas não faz muito sentido criar componentes adicionais para cada caso, como criar um onboard, atualizar o nome do quadro, criando uma tarefa, criando uma coluna e assim por diante. Porque também dentro da nossa coluna podemos adicionar a tarefa e esta também é uma empresa em linha. É por isso que uma abordagem realmente sábia seria criar um único componente que possa cobrir todas as nossas necessidades. Então, quais casos temos? Em primeiro lugar, em qualquer caso, temos algumas marcações. Em seguida, temos um estado de edição quando apenas clicamos no elemento. Mas, como você pode ver, a marcação pode ser completamente diferente. Mas o que é diferente não é a marcação, é apenas estilizá-la, na verdade, se verificarmos aqui, como você pode ver, esta é uma fonte embutida que eu criei e simplesmente anexamos aqui o formulário Criar Tarefa. A ideia principal é que todas essas classes estejam disponíveis globalmente e podemos simplesmente alterá-las com CSS. Dentro foram fornecidos em coisas diferentes. Por exemplo, podemos primeiro digitar algum texto que será mostrado aqui, como, por exemplo, no atual. Mas também podemos mostrar aqui esse texto como o nome do nosso quadro. Agora estamos escondidos aqui, Editar e talvez queiramos propagar esse texto no formulário de edição. Mas aqui com uma tarefa, não precisamos fazer isso. Mas também aqui temos um caso em que temos no botão Carrinho e não apenas uma entrada. Portanto, todos esses casos devem estar dentro desse único componente para funcionar sem problemas. Então, vamos tentar agora criar esse componente. E esse componente é super compartilhável. É por isso que eu quero embalá-lo dentro do AB srand. E aqui queremos criar os módulos de pastas. Aqui você pode perguntar, ok, mas estamos falando sobre componente. Sim, você está totalmente certo, mas não pode usar componentes sem módulo. Você pode registrar o componente dentro de algum módulo ou injetar módulo e o módulo de injeção é muito melhor porque você pode definir quais componentes deseja permitir fora e quais não é. É aqui que normalmente, quando queremos compartilhar um componente, eu recomendo que você crie um módulo para isso. É aqui que temos módulos e podemos criar uma nova pasta que será em linha. E esse é exatamente o formulário para todos esses casos. Agora vamos pular para dentro e criar aqui formulário inline dot module.js. E aqui dentro devemos exportar nossa classe, que é o módulo de formulário inline. Agora na parte superior de um para injetar nosso módulo NG, assim como fizemos anteriormente. E aqui queremos entradas internas para adicionar nosso módulo comum. O próximo passo é criar nossos componentes. Então, aqui teremos a pasta de componentes, e aqui dentro teremos nosso formulário embutido com dois arquivos. Em primeiro lugar, no componente de ponto de forma ao vivo, ponto ts, e em segundo lugar, componente de ponto de formulário embutido ponto HTML. Agora vamos tentar dentro de alguns textos, por exemplo, em forma de linha. E vamos pular para o nosso interior a partir daqui, especialista, nosso componente de formulário inline de classe. Agora, aqui no topo, devemos definir nosso componente. No interior, podemos fornecer um seletor, e esses seletores serão apenas de forma embutida. E aqui também precisaremos fornecer um modelo TRL. Este é o componente de formulário embutido HTML. Portanto, nosso componente básico está pronto quando massa agora é registrada dentro do módulo. Então aqui, antes de tudo, nossas declarações, teremos aqui o componente de formulário embutido. E em segundo lugar, e é super importante são os especialistas porque aqui queremos permitir o uso desse componente fora. É assim que estamos adicionando componente de formulário em linha dentro da matriz de especialistas. Agora vamos voltar para dentro do nosso componente e definir algumas entradas como anteriormente neste conjunto. Em primeiro lugar, queremos fornecer um título para o nosso formulário em linha. É por isso que aqui temos um título de entrada e isso é uma string e, por padrão, é uma string vazia. Mas é importante distinguir entre o título do formulário. Isso é o que queremos mudar e apenas os textos que estamos mostrando porque precisamos coisas diferentes em casos diferentes. Por exemplo, você deseja executar o texto padrão, mas quando está oculto em nosso telefone, deseja renderizar outro texto. E isso é essencialmente título, mas agora também precisamos aqui no texto padrão, isso é o que estamos renderizando quando não estamos ativados em nossa empresa. Aqui, vamos criar um texto padrão, e isso é uma string. E aqui eu quero fazer uma reviravolta muito boa. Eu quero escrever aqui, não defini-lo. E isso é essencialmente o que eu recomendo que você faça muito se você começar a implementar algo ou mesmo para produção, quando você não tem certeza de que tem alguns dados, é muito melhor definir não definiu-o do que apenas indefini-lo ou apenas uma string vazia. Nesse caso, as pessoas podem ver diretamente que o valor não está lá e não está quebrado. Também temos um caso quando queremos mostrar um botão, é aqui que devemos criar mais uma entrada, tem botão e é booleano. E, por padrão, será falso, o que significa, mas não renderize o botão. Se tivermos um botão, queremos alterar o texto desse botão. É aqui que aqui estará nossa entrada com o texto do botão e é uma string. E, por padrão, eles querem configurá-lo para enviar porque esse é o tipo de texto mais popular. Depois disso, às vezes também queremos fornecer um espaço reservado para nossa contribuição. É aqui que entra com o marcador de lugar de entrada, e esta é uma string e, por padrão, será uma string vazia. E a última coisa que precisamos é um tipo de entrada porque temos um caso em que somos tendência de massa e não uma entrada, mas uma área de texto. É aqui que eu quero escrever a entrada com o tipo de entrada, e isso é apenas uma string. Poderíamos criar um enum aqui, mas vou deixá-lo como uma string. Por padrão, podemos escrever que isso é apenas uma entrada de string. E no momento em que quisermos escrever a área de texto, forneceremos aqui uma área de texto de string. Agora, aqui também devemos definir uma saída. Esses são os valores que queremos propagar depois de enviar um formulário. Isso é por aqui, vamos definir um nome infinito de saída que ele manipula enviar. E esse é o novo emissor de eventos. E aqui há um ponto importante. Devemos inseri-lo do núcleo angular e não do nó e, em seguida, dizer adicionar novo emissor de eventos. Queremos fornecer esse tipo de dados que queremos recuperar. E será uma string porque a forma substantiva, temos apenas uma única string que queremos devolver. Também aqui precisamos que a propriedade local para manipular seja editada por padrão, precisamos editar para definir como false e, em seguida, ativamos a edição, definimos como true. Aqui está a edição será booleana e, por padrão , será falsa. E por último, mas não menos importante, aqui queremos criar uma forma reativa. É aqui que eu quero fornecer um insight construtor privado se b e este é o grupo de formulários e já criamos um formulário reativo anteriormente para nosso registro. É aqui que usaremos exatamente o mesmo, mas vamos criar aqui um formulário. E aqui podemos escrever esse grupo de pontos FB. Devemos prover dentro de nossos campos. E no nosso caso, temos apenas um título. E aqui podemos dizer que isso é uma string vazia. E, na verdade, aqui eu cometi um erro. Se b não for um grupo firme, na verdade é o construtor de formulários. Então, aqui precisamos de outra contribuição. Agora vamos escrever um pouco de mercado para que você entenda a lógica Beta. Então, aqui eu quero pular dentro do HTML e não precisamos desse texto. Agora, aqui, em primeiro lugar, quero criar um div, e esse div será nosso div padrão com alguma marcação. É por isso que aqui precisamos de uma aula que possamos usá-las globalmente e mais, certo, para nossas necessidades. Então, aqui podemos escrever um contêiner de formulário embutido. Mais uma vez, não estamos escrevendo nenhum estilo para nosso contêiner de formulário embutido. Cada caso de uso deve criar seus próprios estilos. Também aqui eu quero criar outra classe também para estilizar se estiver no modo de edição, é aqui que vou criar na classe G. E aqui estou fornecendo um objeto, copo de uísque em linha , recipiente de traço. Então, o mesmo nome, edição de traço. Aqui estamos fornecendo o valor da edição que acabamos de criar. A ideia principal é que recebemos classes suficientes para que outros desenvolvedores usem esse componente e o estilizem adequadamente para cada estado. E a última coisa aqui é, claro, um clique. Queremos ativar nossa edição. Então vamos criar aqui uma nova função, ativar a edição e não precisar fornecer nada aqui. Agora vamos definir essa função. Então, dentro do nosso arquivo aqui na parte inferior, podemos criar a edição ativa e o que isso ativou e está fazendo isso. Em primeiro lugar, defina este ponto está editando como verdadeiro, mas não é tudo. Temos um caso em que queremos ver o valor que queremos mudar. Por exemplo, temos um formulário de edição como o nome divertido do quadro. E para isso, fornecemos dentro deste título de entrada. Mas como você pode ver em nosso título firme está vazio, o que está correto. Mas, no nosso caso, quando estamos pulando para a edição, queremos definir nosso título. É por isso que o que podemos escrever aqui se tivermos um título. Então, se tivermos this.title, então queremos colocá-lo dentro do nosso formulário. E para isso, podemos escrever esse valor de ponto em forma de ponto. E lá dentro, recebemos um objeto com o título, esse título. Então, o que esta linha está fazendo, se a ativarmos na edição e fornecermos um título dentro dela, atualizaremos nosso valor do formulário com o valor da afinação da função. Agora vamos voltar ao nosso HTML. Então, dentro de uma div com o Festival one para criar uma div que mostraremos quando não estivermos na fase de edição. E isso é apenas um texto com alguma classe que podemos estilizar. Este é o meu aqui, aula div. Aqui estaremos o texto do formulário embutido. E aqui queremos mostrar a este DFF apenas um. Não estamos no editor e afirmamos é assim aqui, o NADH está editando. Em seguida, mostramos esse div e dentro de um para renderizar nosso texto padrão que estamos recebendo na entrada. E depois disso, estamos criando nosso formulário, assim como fizemos no registro interno. Portanto, é uma forma reativa e bem definida nosso grupo de formulários. Então, aqui podemos fornecer nosso grupo de formulários. Este é o nosso formulário e também teremos aqui o NG Submit. E devemos criar a função onsubmit. Mas vamos terminar com este formulário aqui. Em primeiro lugar, queremos renderizar essa forma apenas uma barra no estágio de edição. É por isso que a GE está editando. E também vamos querer fornecer uma classe para estilizar e nós apenas o nomeamos de forma inline. Vamos voltar agora para dentro deste arquivo e criar aqui nossa função onsubmit. E aqui está a parte complicada. Poderíamos abrir um formulário, não fornecer um valor e, em seguida, pressionar enter. E não é isso que queremos emitir. Não faz sentido encontrar uma corda vazia. Então, aqui queremos verificar isso. Se tivermos essa forma de ponto, valor de ponto, título , somente, então queremos emiti-lo. E para uma carne, temos esse identificador de ponto enviar um meio, e dentro estamos fornecendo esse título de ponto de valor firme, o que na verdade significa que se estamos enviando este formulário e tivermos uma entrada vazia, queremos imediato o que queremos fazer depois que queremos fechar nossos ouvidos estado de edição, É por isso que editar é igual a falso. E também queremos redefinir nossa empresa para o estado inicial. É por isso que essa redefinição de ponto de forma de ponto e essa funcionalidade que estamos obtendo do Angular fora da caixa. Agora, vamos voltar ao nosso HTML. Aqui temos um formulário. Agora devemos definir uma entrada. Então, aqui vamos criar uma entrada com um texto de tipo. E estamos chegando aqui dentro do nome do controle do formulário. E quando nesta forma reativa de flores, aqui temos nosso nome, o título também desejará criar aqui uma classe para estilizar. Então, aqui entrada do formulário de entrada da classe. Também queremos fornecer aqui nosso espaço reservado e estamos obtendo isso a partir da entrada. Portanto, é um marcador de entrada e queremos renderizar essa entrada. Somente aquele que forneceu o tipo correto dentro. Aqui estará NG IV com tipo de entrada, onde nosso tipo de entrada é igual a entrada. E agora queremos fazer exatamente a mesma área de texto de largura. Portanto, temos aqui no exterior e queremos fechar diretamente nossa área de texto. E agora, lá dentro, queremos verificar esse NG IV. Então, aqui nosso tipo de entrada é igual a textarea, então vamos randy. Mas também devemos fornecer aqui um nome de controle de formulário, e isso também será um título. E também devemos fornecer aqui uma aula. E neste caso, a classe será a mesma entrada do formulário de entrada e depois de como ela se estende sobre a máscara, crie um botão para enviar. É aqui que aqui no botão e dentro teremos nosso texto, texto botão que estamos obtendo da entrada. E queremos renderizar esse botão somente se tivermos uma entrada adequada. Então, se tivermos um botão input has, então vamos renderizá-lo. Então aqui queremos o tipo submit, e aqui queremos desativá-lo se for inválido, é aqui que ele está desativado e podemos usar o formulário dot invalid. E depois disso, também queremos adicionar uma classe para estilizá-la. E aqui estará o botão de formulário embutido. E, na verdade, com estes o formulário de entrada está completamente pronto. Então, o que estamos fazendo aqui, temos uma div, temos aqui ativar a edição. Temos aqui diferentes classes para cada elemento aqui foram renderizadas em nosso texto padrão e aqui está nosso formulário com entrada ou textarea e botão, se precisarmos. Então, no próximo vídeo, tentaremos usar nossa empresa interna no caso de uso da criação da placa. 23. Implementação de criação de um conselho: No vídeo anterior, preparamos com sucesso nosso formulário interno, mas não está claro como o usaremos com o recém-criado com todos os valores possíveis dentro. Neste vídeo, vamos querer usá-lo, mas não temos nada dentro da nossa página de painéis. Esta é a maneira de colocar dentro da nossa forma interior. Também devemos gerar nossa página de painéis. E aqui temos principalmente marcação on-line porque já temos acesso aos nossos quadros, porque já criamos o método get board e o assinamos para obter nossos quadros. Então, vamos começar com nossa marcação aqui, podemos remover o mundo dos esportes. E antes de tudo, no topo, eu quero escrever acima porque, na verdade, neste vídeo, não vamos implementar nossa barra superior, mas não devemos esquecer que precisamos implementá-la mais tarde. E aqui podemos começar nossa marcação. Então, primeiro de tudo, temos aqui quadros, contêiner de páginas. Agora vamos fechar essa div e dentro teremos mais uma div com a barra lateral esquerda da classe home. Aqui estamos fechando nossa div. E, na verdade, aqui estamos criando nossa barra lateral à esquerda e dentro teremos links para nossas diferentes páginas. É por isso que aqui temos um link de roteador e queremos fornecer aqui um link nas placas de barra. Depois disso, também precisaremos adicionar uma classe aqui, opção de menu lateral de quadros. Também aqui queremos halite o link quando é uma rota inativa e um Angular para isso, temos um atributo especial que é chamado de link de roteador ativo. E, na verdade, é uma diretiva. E então dito, nós podemos fornecer o que a classe put deseja obter. No nosso caso, queremos selecionar uma opção de menu lateral dos quadros de aula. Vamos fechar nosso a aqui e por dentro. Vamos tentar textos. São pranchas também. Vamos definir aqui mais um link que será o lar. É por isso que vou copiar e colar completamente pois um link de roteador aqui será cortado. Link de roteador da mesma classe ativo. Aqui podemos escrever não placas, mas em casa, mas também aqui queremos escrever opções ativas de link de roteador por isso, porque na verdade aqui nós roteamos a barra de link e cortamos em cada link de roteador. É por isso que esse link de roteador ativo sempre destacará esse elemento que queremos evitar. É por isso que devemos fornecer opções ativas de link de roteador. E aqui dentro estamos fornecendo um objeto com o campo exato verdadeiro. Nesse caso, destacaremos esse loop lean on e teremos malha completa na barra. E, na verdade, da nossa perspectiva, não faz muito sentido criar esses dois links diferentes. Porque quando estamos trancados, mas não conseguimos acessar nossa casa, o que significa que seremos redirecionados diretamente para nossa página de painéis. Mas essa é a marcação que estamos obtendo do projeto. Então, simplesmente implementamos o que temos depois da nossa barra lateral. Devemos criar uma parte principal com nosso contêiner para as placas, é aqui que aqui estará o contêiner da seção de placas da classe div . Agora vamos fechar aqui div e dentro queremos criar mais uma div. Aqui teremos aulas div em meus quadros. Vamos fechar essa div e dentro dela queremos criar mais uma classe com um cabeçalho. Este é o caminho aqui, classe div, meu cabeçalho da seção Boards e por dentro devemos criar mais uma classe. E será o cabeçalho da página das placas de vidro, o nome e, por dentro, tentaremos. Minhas pranchas. Depois do nosso cabeçalho, queremos renderizar nossa lista. Este é o caminho aqui. Teremos uma lista de blocos do quadro div porque teremos aqui cada quadro como um bloco. Aqui podemos fechar nossa div e dentro dessa div, queremos renderizar nosso formulário embutido. Vou terminar em um segundo porque, por enquanto, quero terminar nossa marcação. E depois de formarmos o grupo um em linha para renderizar todos os nossos blocos, que são placas. E para isso, escreveremos nosso gráfico aqui, então um link de roteador. E aqui queremos fornecer um link para cada placa. É aqui que temos um parâmetro dinâmico. Então, aqui podemos fornecer uma matriz com placas de barra. E o segundo parâmetro que colocamos aqui, ponto do quadro de vírgulas. Nesse caso, geraremos o link correto do roteador para cada placa. Mas, para obter acesso ao quadro aqui, devemos escrever e G for loop. Este é o caminho aqui no G4 e estamos percorrendo nossas placas. Então aqui vamos deixar o conselho, e aqui também sentiremos falta da nossa aula. Então, aqui devemos ter o bloco do quadro e vamos fechar este a. Agora, dentro do nosso link a, queremos fornecer um div com nome dos detalhes do bloco do quadro de classe. Vamos fechar essa div e renderizar dentro do nome. Será azulejo entediado e eles marcarão está totalmente pronto. Vamos verificar se está funcionando. Na verdade, tenho aqui uma seta porque eles usaram a propriedade não corretamente. Aqui, devemos colocar colchetes duplos e não colchetes simples. Vamos verificar novamente. Temos uma narrativa de que não temos painéis de propriedades, e isso é totalmente válido dentro do nosso script de tipos. Estamos recebendo nossas placas, mas simplesmente temos aqui o registro do console com Dan, salve-as. E, na verdade, devemos fazer desta forma aqui no topo, podemos criar propriedades de placas. Será a interface da nossa placa que já temos. Este é um array e, por padrão teremos uma lista vazia de nossos quadros. Agora, aqui, em vez do nosso registro do console, podemos simplesmente atribuir aos nossos quadros, nossos quadros que estamos obtendo do nosso serviço. Vamos verificar novamente. Como você pode ver agora, não temos nenhum erro, mas temos uma placa de erro. O bloco não existe. E é por isso que eu gosto tanto do TypeScript. Foi simplesmente um erro de digitação, mas não o depuramos em tempo de execução. Simplesmente temos uma validação do TypeScript. Então aqui deve estar o título, e agora não temos nenhum erro. Você não deveria ser válido. Vamos verificar isso. Estou recarregando a página e na verdade, ela está olhando de alguma forma. Temos aqui nosso aplicativo para bar. Ainda não o implementamos. Aqui à esquerda, temos um link de painéis e um link inicial. Então, os links estão lá. E aqui está o nosso conteúdo principal com meus quadros em relevo que criaremos um segundo e nosso primeiro quadro com o link correto. E como você pode ver aqui na parte inferior, é porta de barra, id de barra, o que significa que nosso URL também está funcionando. Mas eu tenho um pequeno erro de digitação na marcação. Como você pode ver, nossa barra lateral não parece tão boa porque aqui dentro de uma barra lateral esquerda da classe div, perdi o contêiner de palavras, então deve ser o lado esquerdo da casa, mas o contêiner, como você pode ver agora, nossa barra lateral é muito maior e parece melhor. Então, como você pode ver, buscamos com sucesso nossas placas com esse código dentro de nosso componente com nosso serviço. Salvamos essas informações na propriedade de nossos conselhos e foi renderizada nossa lista de painéis. E, na verdade, aqui dentro da nossa rede, podemos ver que temos uma solicitação no host local para 1001 placas sem caminho. E estamos recebendo nossa única placa que temos. E agora é hora de falar sobre a empresa do interior. Então, como vamos usá-lo aqui dentro do nosso HTML. E para isso, quero abrir nossa forma interior aqui à direita para que possamos entender o que temos dentro de nosso componente. Então, aqui temos muitas entradas. Então, o que devemos fornecer para esse uso específico, na verdade, aqui estamos certos de que temos nosso formulário de traço embutido. Vamos fechar aqui. E agora, antes de tudo, por dentro, quero dar uma aula. E a ideia principal é que essa é a classe pai que podemos estilizar porque queremos aplicar estilos exclusivos ao nosso componente. E só para lembrá-lo aqui, temos aulas como o interior do contêiner, interior do texto e da música. A ideia é que essa classe mais essa classe substituam qualquer CSS. E essa é exatamente a ideia. É aqui que estamos fornecendo algumas aulas, por exemplo, criar formulário de quadro. Agora, todos esses clusters internos serão mais simples aninhados dentro do nosso CSS. A segunda coisa que precisamos aqui é o texto padrão. E esses são os textos que veremos no cartão de antemão. E aqui temos nossos textos padrão, criar um novo quadro. E a última coisa que devemos fornecer aqui é lidar com o envio. Isso é o que estamos obtendo do nosso formulário. Aqui. Podemos escrever, por exemplo, criar quadro e estamos chegando aqui evento. Então, o que fez esse evento, só para lembrá-lo aqui, temos um identificador de envio e é uma string. Este é o nosso título e não precisamos aqui ter título do botão, texto do botão, espaço reservado, tipo de entrada, só porque esta é a principal empresa interna padrão. Agora vamos verificar se está funcionando onde pular aqui dentro do console e morrer diretamente tem um erro. Não temos um método de criação de placa, então vamos criá-lo agora aqui. Este é um método em que estamos obtendo uma string. Então, podemos dizer que aqui estamos recebendo um título, é uma corda e, de volta, retornaremos vazios, o que não significa nada. E lista aqui que eu quero consultar nosso título, que foram criados dentro de nossa forma interior. Agora estamos chegando aqui e o argumento restrito do evento de tipo não é atribuível para permitir uma string. E, na verdade, pode ser muito complicado para você depurar porque você pode pensar, ok, estou fornecendo aqui algo diferente. Mas o problema não está nisso. O problema é que dentro deste módulo, não injetamos dentro do nosso módulo de formulário interno. É aqui que aqui dentro do módulo de placas, devemos importar nosso módulo compartilhado e ele estará alinhado para o módulo. E a ideia principal é que estamos invertidos aqui em um módulo, mas por dentro temos um componente de id especialista. É por isso que agora podemos usar esse componente explorado no interior do nosso componente. Vamos verificar isso. Como você pode ver, não temos mais esse erro. Temos algo diferente e aqui não podemos nos vincular ao grupo de formulários, pois não é uma propriedade conhecida do formulário, é por isso que devemos fazer. Devemos colocar formas reativas dentro do nosso módulo de formulário em linha. É por isso que eu quero pular dentro do módulo de formulário embutido. E aqui dentro das entradas, eu quero escrever um módulo de formulários reativos. Agora não devemos receber esse erro. Vamos verificar isso. Como você pode ver, tudo é verde e estamos prontos para começar. Vamos verificá-los em um navegador onde recarregar a página e pronto, esse é o nosso elemento. E pode ser muito difícil para você entender o que está acontecendo aqui porque não escrevemos nenhum CSS e o CSS já estava preparado rapidamente. Então, vamos inspecionar esse elemento. O que temos aqui? Como você pode ver, este é um formulário interno e este é o nosso formulário de criação de quadro de classe. Vamos verificar isso. O que temos dentro de nosso projeto e nossos estilos. Não dissemos estilos de origem e aqui muitos estilos e estamos interessados agora em criar formulário de quadro. Vamos abri-lo, e esse é o nosso CSS. Isso é exatamente o que vemos aqui. Este é o formulário de criação de placa. Este é nosso pai. O mais importante é que dentro da forma interior, temos estilos diferentes. Por exemplo, aqui está o contêiner de formulário inline da classe div e como estamos estilizando, estamos usando aqui nossa classe pai que temos aqui. Isso é criar formulário de quadro e , em seguida, recipiente de formulário embutido. E isso é o que você pode ver aqui. Sempre prefixe aqui, tudo para o interior de classes com o formulário de criação de quadro, que é nosso formulário pai, apenas para esse uso específico. Então é assim que estamos tornando nosso interior super flexível. Ele contém 0 CSS dentro e simplesmente definimos todo o nosso CSS externo para cada caso. É por isso que aqui definimos, ok, temos o interior do contêiner, você deve exibir flex, alinhar itens e justificar o conteúdo. Então, se precisarmos estilizar em linha a partir de textos, por exemplo, neste caso, não estilizamos, mas também poderíamos apenas aqui, criar formulário de quadro, formulário embutido, texto e estilizar esse elemento. Então foi assim que criamos nossa incrível forma interna, que é super compartilhável para cada caso. Agora vamos verificar se está realmente funcionando. Portanto, temos aqui nosso texto padrão para criar um novo quadro. Podemos clicar nele, e agora temos nossa opinião e podemos escrever algo aqui. E eles já veem aqui um erro. Como você pode ver aqui, temos entrada com uma entrada de formulário de entrada de classe, mas isso é o que estamos estilizando e onde estilizar a entrada de formulário inline, o que na verdade significa que cometemos um erro de digitação lá. Vamos voltar para dentro do nosso componente, componente de forma interna. E aqui temos nossa entrada e aqui precisamos alterar nossa entrada de formulário de entrada para entrada de formulário em linha. E como você pode ver, estamos tendo exatamente o mesmo problema aqui na área de texto. Deve ser uma entrada de formulário embutida. Vamos verificar novamente. Estou recarregando a página onde está escondida no botão, e agora temos uma entrada com o estilo correto. Agora posso pagar algo como foo e clicar em Enter e nosso formulário é fechado com sucesso. Vemos criar novos quadros novamente. E dentro do console, vemos que nosso título é exatamente nossa saída dentro do componente da placa. Mas o que estamos perdendo aqui completamente é criar uma placa no cliente e no servidor. E agora eu quero fazer o contrário. Quero começar com o front-end e terminar com o Pi. E então você pode ver como estamos fazendo isso na ordem inversa. Então Festival aqui temos nosso componente Create board inside. Portanto, a ideia é que aqui usaremos nosso serviço de diretoria. Este é o meu serviço dentro do nosso conselho, devemos criar um novo método. Por exemplo, vamos chamá-lo de ponto de criação. Então, o que estamos recebendo aqui, simplesmente chegamos aqui no título e é string e vice-versa , obteremos um observável com o Board criado, o que significa que será uma interface entediada. E agora o que teremos dentro, em primeiro lugar, podemos copiar e colar o URL porque será exatamente o mesmo. É slash boards e estamos fazendo uma solicitação postal. É aqui que podemos dizer que estamos retornando esse HTTP e não obtemos, mas postamos. E por dentro. Em primeiro lugar, devemos fornecer um URL. E em segundo lugar, forneceremos aqui um objeto com o título do campo. E, na verdade, esse é o nosso corpo. E para o nosso conselho, basta fornecer o título. Porque no backend com set apenas duas coisas. Isso é título e ID do usuário. E o ID do usuário, nosso back-end deve entender por si só, porque estamos fornecendo um token com nossa solicitação e somos autenticados. O principal problema é que estamos contornando a digitação. Devemos fornecer uma visão ou uma postagem. Estamos recuperando nossa interface de placa. E, nesse caso, criamos com sucesso o método Create Board. E como você pode ver todos os nossos métodos de API, vou olhar exatamente da mesma forma. Isso é simplesmente URL e, em seguida, postagem HTTP é derrubada, precisamos. Agora vamos usar o método service dentro do nosso componente. Então, vamos pular para trás. E aqui está nosso quadro Criar. E aqui queremos chamá-la de ponto de serviço da palavra. E aqui Create Point. E por dentro estamos fornecendo exatamente o título que obtivemos aqui da nossa forma interior. E depois disso, estamos escrevendo dot subscribe e aqui estamos criando o quadro de volta. O que queremos fazer com esse ponto? Nós simplesmente queremos mudar nossa taxa dessas placas. É por aqui que vou escrever esses quadros de pontos iguais. E aqui estamos espalhando nossos quadros de pontos e então eles querem colocar nosso quadro criado. Então, essencialmente, estamos criando aqui em sua matriz, onde dentro colocamos todos os nossos campos da matriz antiga e, em seguida, são criados o quadro. Então, nossa frente e isso totalmente preparado. Agora, devemos pular para o backend e criar tudo lá. No back-end. Não é tão difícil porque todos nós criamos um modelo para o quadro e podemos usá-lo. Nós só precisamos pular e disse irmandade S. E aqui criando sua solicitação de API. Aqui podemos copiar, colar , obter completamente, e será postado em quadros de barra. Aqui, devemos usar o middleware do sistema operacional porque essa é uma solicitação autenticada. E aqui estamos usando o ponto controlador da placa, por exemplo, criar placa. E agora devemos criar esse método dentro do nosso controlador. Então, vamos pular de volta para dentro do controle da nossa placa. E aqui queremos criar exatamente o mesmo, mas será uma solicitação de postagem para criar um registro. É por isso que vou copiar e colar isso completamente e renomeá-lo. Então, aqui temos nosso quadro Criar e estamos recebendo aqui nossa resposta de solicitação. E em seguida, e temos dentro tentar pegar aqui. Em primeiro lugar, dentro de onde o frango para pedido usa que isso é totalmente bom. E depois disso, queremos criar um novo quadro. É aqui que vou remover essa linha. Então, aqui vou escrever que estamos criando nosso novo quadro e, para isso, estamos usando seu modelo entediado e depois dissemos: Devemos fornecer um objeto válido. Aqui. Em primeiro lugar, estamos fornecendo um título do quadro de solicitações, o título do ponto. E o segundo é o usuário AD e realmente usar em relação à tomada em massa de nossa solicitação, de nosso middleware. Então, aqui teremos o pedido dot USA, dot underscore ID. E, na verdade, podemos usar ID de sublinhado ou um D, não importa. Temos os dois disponíveis. Portanto, essa linha não salvará nada no banco de dados. Simplesmente criamos aqui uma instância do nosso modelo. E depois disso, queremos salvar esse registro no banco de dados. É por isso que aqui podemos experimentar o quadro salvo e estamos usando aqui um peso aqui, e você comprou dot save. Nesse caso, estamos salvando esse registro e recuperando nosso quadro salvo. E como você pode ver, este é um documento do Word. Então, depois disso, podemos responder com nosso quadro salvo. Então, mais uma vez, temos uma solicitação de postagem, temos uma ação Criar quadro aqui. Estamos verificando se estamos trancados. Depois disso, estamos usando nosso modelo de quadro para criar um novo quadro com o título que fornecemos e usar 3D que não fornecemos. Mas Deus, do nosso usuário bloqueado e salvamos esse novo ponto dentro do banco de dados. Recuperamos nosso quadro salvo e estamos respondendo com essa API. Vamos verificar se está funcionando. Eu não tenho nenhum erro aqui dentro do back-end. Então, vamos entrar no cliente aqui. Eu quero clicar criar um novo quadro e estou digitando algo e pressionando Enter. E como você pode ver diretamente aqui, temos nossa nova diretoria. Vamos verificar nossa rede. E, na verdade, dentro da rede, temos o pedido do nosso conselho. E este é um post sobre pontos de barra de torta rasgada. E o que é mais importante aqui dentro da pré-visualização, esta é a nossa resposta. Esta é uma ID de usuário do título. Isso é exatamente o que foi salvo dentro do banco de dados, que realmente significa que se eu recarregar a página aqui, estamos recebendo duas placas agora porque essas informações são todas salvas dentro do banco de dados. E aqui dentro da nossa rede, estamos recebendo nossas placas. E como você pode ver na prévia, já estamos recebendo dois quadros e não um, o que significa que terminamos totalmente com nossa página de painéis. Em primeiro lugar, seja renderizado aqui na barra lateral, mas não fizemos nada com isso. Também usamos aqui nossa forma interna, que é super compartilhável. E criamos nosso serviço, que está falando com nossa API, para criar um novo quadro a partir desta página. 24. Adicionar barra e saída superior: No vídeo anterior, terminamos nossa página de painéis, mas esquecemos de implementar nossa barra superior. E, na verdade, este é o TBA em cada página para um usuário conectado, que na verdade significa não apenas a página dos meus quadros, mas também uma única página do quadro, é por isso que devemos criá-lo como um módulo compartilhável. Então, eu quero ir para o nosso aplicativo de origem do cliente compartilhado. E aqui temos nossos módulos e empresa interna. E, na verdade, aqui eu quero copiar e colar este formulário em linha completamente e renomeá-lo para a nossa língua. Mas agora dentro da massa muda tudo. Em primeiro lugar, vamos começar pelo nosso módulo. Então aqui temos um módulo de barra superior e dentro com não temos nenhum módulo de formulário reativo, simplesmente teremos alguma marcação e o botão de logout. Aqui podemos remover essa entrada e devemos alterar nosso componente também. Mas antes de tudo, vamos mudar o nome da turma. Deve ser o nosso módulo de barra superior. Agora vamos entrar em nossos componentes. E aqui não temos empresa no interior, temos nossa barra superior e temos dois arquivos dentro. Primeiro de tudo, será top bar dot component dot HTML. E aqui está o nosso componente de ponto da barra superior, pontos ts. Agora vamos mudar a marcação. Quero remover tudo na barra superior direita mais simples. Agora vamos pular para o nosso arquivo ts e remover tudo do nosso componente. Agora quero renomear nosso seletor para a barra superior apenas para deixar claro onde ele pertence. Na verdade, temos apenas um único Toba dentro do nosso aplicativo. Poderíamos simplesmente escrever aqui Tampa, mas como é compartilhável para nós, vou escrever aqui em cima, mas apenas neste único lugar, aqui temos nosso URL de modelo. Esta é a barra superior e nome do nosso componente é componente de beliche superior. Agora eu posso remover os símbolos e apenas viver aqui nossa entrada de componente. Agora vamos voltar para dentro de um módulo. Agora não temos esse componente de formulário embutido, mas queremos declarar aqui nosso componente de barra superior e componente TBA especializado porque queremos usá-lo fora. Portanto, nosso módulo agora está totalmente pronto. Sim, não implementamos nenhuma lógica interna, mas ainda não podemos vinculá-la. E nós queremos pular e dito módulo de placas e dentro de nossas entradas podemos adicionar aqui módulo de barra superior. Agora aqui dentro de nossas placas de componentes, placas, HTML na parte superior. Em vez desse texto, podemos simplesmente escrever a barra superior AP e fechá-la aqui. Vamos verificar se está funcionando. Não temos nenhum erro aqui. Vou recarregar a página. E aqui no topo você pode ver a barra superior dos textos, o que na verdade significa que vinculamos com sucesso nosso módulo e componente à nossa página de quadros. Agora vamos tentar comercializar nossa barra de ferramentas. É aqui que eu estou voltando para dentro do nosso componente Tombow HTML. Aqui, vamos escrever. Então, primeiro de tudo, temos aqui div com placas navbar de classe. Vamos fechar essa div lá dentro. Teremos mais um div, div, navbar, lado esquerdo. Vamos fechar essa div e , em primeiro lugar, teremos um link para nossa casa. É por isso que um link de roteador. Aqui estará nossa barra, e aqui estará o ícone da barra de navegação da classe. Vamos fechar nosso a e dentro devemos fornecer uma nova imagem. Então, aqui estarão as imagens dos recursos de barra de origem slash home dot SVG. Depois disso, teremos mais um link de roteador. É por isso que vou copiar e colar completamente e ele está indo em quadros de barra. E será Naropa eigenspace, ícone de placas navbar. E por dentro temos outro arquivo SVG. É slash assets slash boards, como você pode ver agora, quando estou recarregando a página, temos dois ícones legais, um para o link da página inicial e outro para nossos quadros. Mas como você pode ver isso aqui, os trilhos são inválidos. Nós não os temos porque, na verdade, devemos pular dentro do nosso módulo de barra superior. E aqui, importe o módulo de rota. Vamos salvar isso e recarregar a página. E como você pode ver agora, isso realmente vincula, em primeiro lugar, página inicial e aqui os quadros de barra. Agora vamos continuar com nossa marcação. Depois do nosso lado esquerdo, temos o lado direito. Aqui. Queremos fornecer nossa imagem com ácidos de barra de origem, logotipo de barra Trello, ponto branco SVG. E aqui está nossa barra de navegação de classe. Mais tempo depois de uma imagem, temos um div com a classe navbar lado direito. Vamos chamar isso de t. E por dentro queremos criar um vestido de acompanhamento de link, este é y. Aqui estará a classe div, o ícone da barra de navegação, a barra de navegação , o ícone de logout. E aqui dentro eu quero simplesmente escrever texto log gout. Vamos verificar se está funcionando. Aqui temos nossos links à esquerda, temos a imagem do trailer no centro e temos um botão como o link de logout à direita. Mas não anexamos nenhuma lógica aqui. Portanto, nossa barra superior está essencialmente totalmente pronta. Implementamos tudo, mas precisamos agora implementar nosso logout. implementação do logout é muito simples. Só precisamos remover nosso token do armazenamento local, limpar CurrentUser dentro de nossa memória e redirecioná-lo ou usá-lo para a página inicial. Isso é o que queremos fazer aqui. Queremos anexar um evento de clique. Então, aqui vamos clicar com o botão direito. E o que estamos fazendo, estamos chamando nosso método de logout. E o número deve criar esse logout dentro do nosso componente. Então, o que queremos fazer lá dentro? Na verdade, quero armazenar nossa lógica de logotipos em nosso serviço porque isso está relacionado à autenticação e eles não querem escrever essa lógica diretamente aqui. Isto é y. O que devemos fazer, devemos injetar nosso serviço de horas, que é nosso provedor de serviços dentro desse componente. E agora aqui podemos usar nosso logout de ponto de saída. E, na verdade, não temos esse método. Devemos criá-lo, mas não é tudo, mas também depois disso redirecionar o usuário para a página inicial porque não estamos mais logados. E para isso devemos injetar aqui roteador. Então eu posso aderir roteador e será nossa seca. Depois do cólon é nosso serviço. Podemos escrever aqui este ponto do roteador navegar por URL e simplesmente queremos redirecionar o usuário para nossa página inicial. Então, estamos quase prontos. Só precisamos implementar nosso método de logout aqui dentro de nossa classe de serviço. Então aqui na parte inferior, vou escrever logout com não preciso de nada aqui. Nós simplesmente queremos remover nosso token. Então, aqui podemos escrever o item de remoção de ponto de armazenamento local e foram fornecidos dentro do destino. Isso é suficiente, mas não limpamos nossa memória. E, na verdade, esses usuários atuais ainda têm um usuário atual válido. Isso não é bom. Devemos configurá-lo para agora. É por isso que esse ponto atual do usuário ponto. Em seguida, somos fornecidos dentro agora e, com esse revestimento único, todos os nossos componentes serão notificados de que não estamos mais presos. Vamos verificar se está funcionando. Eu não tenho nenhum erro aqui. Não precisamos implementar nada no back-end. Agora vamos simplesmente clicar aqui logout. E como você pode ver, boom, estou diretamente na página inicial e podemos verificar se não estamos presos. Na verdade, foi chamado de salto aqui dentro do armazenamento local do aplicativo. Eu não tenho meu token. É por isso que, quando estou recarregando a página, recebo 401 não autorizado, o que significa que implementamos com sucesso nossa barra superior e funcionalidade de logout. 25. Criar módulo de placa: No vídeo anterior, concluímos com sucesso a implementação da nossa página de conselhos. Neste vídeo, estamos começando a implementar nossa página de quadro único. E estamos focados aqui apenas em criar nosso módulo e componente básicos. É por isso que eu quero entrar no conjunto de origem. E aqui eu quero criar uma nova pasta com o novo módulo. E na verdade você pode dizer, Ok, mas por que não embalamos nossa placa de componente dentro do módulo de placas e sim, você pode fazer isso, mas eu quero dividi-lo porque a lógica dentro desses dois módulos é bastante diferente. Ainda precisamos pagar muito dentro do nosso módulo de placa. Aqui é y. Vamos criar aqui uma nova pasta chamada board. E por dentro, queremos criar nosso quadro ponto module.js. Além disso, vamos criar diretamente aqui nossa pasta de componentes e pasta mu dentro da qual é chamada board. E aqui precisamos de dois novos arquivos. Em primeiro lugar, board dot component dot ts e, em segundo lugar, board dot component dot HTML. Agora vamos criar tendências dentro do HTML, palavra fervida, e vamos criar nosso componente. Então, aqui podemos exportar nossa nova classe, e ela é chamada de componente de placa. E no topo remasterizou um decorador de componentes. Por dentro, queremos fornecer nosso seletor e podemos simplesmente dizer aqui que selecionamos o quadro e também devemos fornecer aqui um URL de modelo que é derramado em HTML componente, nosso componente de placa é totalmente preparado. Devemos saber criar nosso módulo. Então, aqui queremos exportar uma nova classe, que é chamada de molécula de placa. E queremos adicionar no topo do decorador e do módulo GI e fornecer informações, pelo menos, a lista de entradas. E aqui teremos, antes de tudo, módulo comum também agora podemos criar nossas declarações e fornecer insights, os componentes do nosso conselho que acabamos de criar. Então, queremos se registrar aqui em sua rota. É aqui que aqui no topo podemos criar uma nova propriedade chamada rotas. E são nossos gritos, que são uma matriz. E por dentro, devemos fornecer um novo objeto com caminho de campo. E aqui teremos a barra de placas de URL, e aqui temos o ID da placa de dois pontos. O que significa esse ID de placa? Isso significa que temos um parâmetro dinâmico, o que significa que aqui temos um ID de placa e é diferente para cada placa. Depois disso, devemos fornecer aqui um componente e, no nosso caso, será o componente da nossa placa. Também aqui eu quero usar a palavra serviço. É por isso que aqui podemos escrever, podemos ativar. Este é um array, e aqui está o nosso serviço necessário. Por que estamos fazendo isso? Porque esse URL é apenas para usuários conectados. Se não estivermos logados, não queremos acessar esse URL. E agora devemos registrar essas rotas dentro de nossas entradas. Então, aqui podemos colocar o módulo de rota ponto para criança, e aqui estamos fornecendo informações sobre nossas rotas. E por último, mas não menos importante, devemos registrar esse módulo dentro do nosso módulo de aplicativo. Então, aqui dentro de nossas entradas, podemos simplesmente escrever o módulo da placa, e este é o nosso novo módulo, que é inserido aqui na parte superior. Vamos verificar se está funcionando. Podemos pular agora dentro do nosso navegador, abrir nossas ferramentas de desenvolvimento. Aqui podemos clicar em nosso primeiro quadro. E como você pode ver agora, não temos nenhum erro. Vemos aqui no quadro de palavras superior e, em seguida, o URL que vemos slash boards, slash e eles D deste quadro específico. O que precisamos fazer agora é obter um único quadro para essa página específica. Por que isso? Porque, na verdade, nem sempre saltamos da página dos quadros para o nosso único quadro. E você pode dizer, Ok, bem, na página de painéis, temos todos os nossos quadros. Mas, novamente, quando estamos nesta única página e recarregamos a página, não temos nenhuma informação importante, que significa que devemos obter esse anúncio do nosso URL e obter esse quadro específico com o CD. Também informações adicionais posteriormente, como colunas ou tarefas. É por isso que quero abrir nosso aplicativo, serviços compartilhados, placas, níveis de serviço, e a venda será definida anteriormente, aqui estamos escrevendo todos os nossos pedidos para o corante, que estão relacionados aos nossos quadros. É por isso que aqui podemos criar um novo método que é chamado de ficar entediado. E então, para obter uma placa, devemos fornecer um ID de placa, que é uma string, e, de volta, obteremos um observável com nossa interface de placa. Agora, aqui dentro, devemos preparar nosso URL. Então, aqui vamos usar o ambiente Doherty Pi URL plus, e aqui queremos concatenar nossas placas mais AD. É por isso que faz muito sentido usar strings ECMO ScriptSig aqui e injetar dentro desse ambiente URL de DPI. Então temos aqui slash, boards, slash, e aqui está um AD como argumento. E, na verdade, não é um AD, nasce e AD. Portanto, esse é o URL que queremos buscar no back-end. E agora devemos retornar nossa solicitação deste ponto http.get. E estamos fornecendo informações privilegiadas para obter nosso reino de urina que queremos buscar. Mas, novamente, aqui estamos voltando observar objetos e devemos especificar que estamos recuperando nossa interface de placa. Agora vamos tentar buscar esse URL. É por isso que devemos voltar para dentro do módulo da placa, componentes, componente da placa. E aqui dentro eu quero criar um novo método fetch data, e esse método retornará void. E por dentro, queremos usar esse método que acabamos de criar para buscar nosso quadro pelo AD. É aqui que devemos fornecer um construtor e aqui estará serviço de placas privadas que encerramos este serviço de placas. E dentro de nossos dados de busca, podemos escrever esse ponto de serviço de quadro de pontos, ficar entediado. Estamos fornecendo o ID do painel de ideias, mas ainda não temos um D neste componente. E, na verdade, devemos armazenar esse ID da placa a partir do URL, porque o usaremos muito dentro desse componente. Mas se escrevermos aqui o ID da placa é igual a string, então chegaremos aqui uma placa estreita que eles cavam não tem inicializador e não está definida no construtor. E, na verdade, não queremos chegar aqui indefinidamente porque não será confortável trabalhar mais tarde. O AD da placa é obrigatório para o nosso componente. E para obter o perímetro da nossa URL, devemos injetar aqui a rota. Então, aqui estará a mortalha privada. Aqui queremos usar a rota ativada. Agora, aqui dentro, queremos tentar ler essa seca ativada. Então, aqui eu quero obter o ID da placa como um parâmetro e estamos usando aqui esta cobertura de pontos, pontos, instantâneo, mapa de parâmetros de pontos aqui será o ID da placa. E é assim que você normalmente obtém parâmetros do URL dentro do Angular. Mas, como você pode ver, é isso que estamos recebendo de volta. Estamos ficando tensos agora, isso é totalmente razoável porque o Angular pode ter certeza de que esse parâmetro está sempre lá. É por isso que podemos escrever aqui, porque realmente queremos salvar apenas uma string. Podemos verificar e lançar um erro se ele não estiver lá. É por isso que aqui podemos escrever. Se não tivermos nossa placa AD, então lançaremos uma flecha. Aqui será lançado um novo erro, por exemplo, não pode ficar entediado AD do URL. E depois disso, simplesmente escrevemos esse ID de placa igual a Id de placa. E como você pode ver neste caso onde entrar dentro da string, porque verificamos aqui para TypeScript que não é agora. E se for agora, então estamos lançando um erro. Isso é realmente o melhor que podemos fazer para obter uma string neste componente. Porque não será confortável verificar todos os lugares em que estamos obtendo esse parâmetro. E agora, aqui dentro de uma boa prancha, podemos fornecer uma visão. Este quadro de pontos AD. Depois disso, podemos escrever dot subscribe e estamos recebendo volta nosso quadro e podemos atribuí-lo e salvar em algum lugar. Mas pelo menos por enquanto, eu só quero registrar o console do nosso quadro Comma board, mas não chamamos isso de busca de dados em algum lugar. É por isso que aqui devemos escrever implementos nele. E agora, depois do nosso construtor, podemos em junho nele e dentro dele podemos chamar esses dados de busca. E, na verdade, toda vez em cada componente em que preciso buscar alguns dados, prefiro criar um método adicional para isso, que é chamado de buscar dados. E não apenas jogue essa lógica dentro e junte-se a ela apenas para torná-la mais limpa. Como você pode ver quando estamos pulando para o navegador, estamos fazendo agora uma solicitação em nossa barra de API, barra, barra e esse ID específico do parâmetro momma, que realmente significa que temos sucesso implementado no cliente ou quando você comprou o módulo e até mesmo buscou nossa placa no back-end. Obviamente, não implementamos uma parte de back-end e faremos isso no próximo vídeo. 26. Obter um único tabuleiro: No vídeo anterior, implementamos com sucesso a parte front-end de nosso componente de placa e módulo de porta. Mas agora, no back-end, queremos implementar a obtenção de uma única placa. Este é exatamente o pedido que está quebrado aqui. E acho que implementamos muitas coisas juntos e você já não sabia como fazer isso. É por isso que eu recomendo que você o implemente por conta própria. Como sempre digo, tenha três níveis diferentes para o nível número um da UE, basta pausar o vídeo aqui e fazer você mesmo. No final, você deve obter aqui nosso quadro do back-end, nível número dois, vamos falar sobre isso. Então, o que precisamos implementar? Em primeiro lugar, quero abrir aqui nosso servidor de origem do servidor. E aqui devemos fornecer em sua solicitação e ela será gerada em slash, api slash boards e depois Boyd AD, e deve ser um parâmetro dinâmico. Deve ser protegido contra a seca. Dentro do nosso controlador de placas, devemos criar uma nova ação. Agora estamos pulando aqui dentro dos controladores fervidos, e simplesmente fazemos exatamente o mesmo, como esquecemos as placas. Mas aqui Groupon para encontrar uma única placa com o d desta placa a partir do URL. Então, se você quiser fazer um nível para pausar o vídeo aqui, e se você quiser fazer isso juntos, vamos começar. Em primeiro lugar, precisamos voltar para dentro nossos níveis de servidor aqui e criar um novo URL de API. Então, aqui teremos apt-get slushy pie slash boards e aqui arriscar a identificação da placa de cólon. Agora queremos criar um novo método. É por isso que vou pular para dentro das portas dos controladores e aqui ficamos entediados. Eles querem copiá-los completamente porque serão muito parecidos. Então aqui eu copio colado, fico entediado, e eles querem nomear esse método, ficar entediado. E aqui estamos recebendo a resposta da solicitação e a seguir, e estamos verificando se estamos presos. Agora, aqui, em vez de encontrar, todas as placas vão querer usar find one para encontrar apenas uma única placa. E, na verdade, ainda melhor, podemos usar aqui find by ID. É também um método que é possível e dentro do vermis basta fornecer uma identificação desse esporte. É por isso que podemos remover um objeto e mais simples aqui, solicitar dot params dot board Id. E de volta aqui, estamos recebendo nossa placa e simplesmente enviamos essa sacola para dentro de nossa API. Agora vamos verificar se usamos nosso método corretamente aqui, e aqui está o controlador da placa dot get boards. Isso não está correto. Deveria ficar entediado. Não temos nenhum erro aqui dentro de nossa API e implementamos com sucesso o processo de sair do quadro. Vamos verificar isso. Estou recarregando a página, mas não tenho um erro. Aqui. Estamos recebendo nosso conselho por d, e aqui estão as informações do banco de dados. Temos um título em D e um ID de usuário. 27. Adicionar fluxo de placa: No vídeo anterior, implementamos com sucesso a medição de nossa placa única a partir da API. Neste vídeo, quero compartilhar minha ideia como usaremos esse quadro e o salvaremos. E, na verdade, pode ser um pouco complicado. Por que isso? Porque, na verdade, aqui dentro do cliente, temos nosso componente de placa e simplesmente podemos armazená-lo em uma propriedade aqui. Isso é totalmente bom. Nós podemos fazer isso. Mas depois teremos um modelo e é aí que as coisas serão diferentes. Só para mencionar, temos aqui uma página com o quadro e depois batemos em uma tarefa para abrir essa tarefa dentro do modelo, o principal problema é quando recarregamos a página, queremos voltar para essa tarefa específica, o que significa que queremos ter em nosso URL slash board slash board ID slash tasks slash task ID. Em seguida, recarregamos a página e buscamos primeiro nosso quadro, depois talvez todas as colunas, todas as tarefas. E queremos resolver essa tarefa dentro do modelo, mas isso tem um meio? Estamos salvando, por exemplo, nossa placa aqui dentro do componente da placa, mas não podemos realmente usar essas informações dentro do nosso componente de tarefa. Por que isso? Porque mais tarde registraremos nosso componente de tarefa aqui como o componente filho desse caminho. E não podemos realmente acessar de forma alguma alguns dados que foram armazenados dentro desse componente do quadro da criança. Qual é a solução para esse problema? Devemos usar um serviço. Como podemos fazer isso? Em primeiro lugar, dentro de um quadro, quero criar uma nova pasta chamada serviços. E aqui podemos criar um serviço de ponto de placa, ponto ds. Aqui. Não devemos misturar nosso serviço de diretoria aqui com nosso serviço de conselhos, que tem placas de serviços compartilhados. Esse serviço serve apenas para buscar dados do back-end. Se quisermos obter nossas pranchas, usamos boas pranchas, entediados, criamos pranchas e assim por diante. Mas o que estamos fazendo dentro do quadro, esse é um tipo de estado para esta página específica, o que significa que aqui vamos armazenar nossas colunas do quadro, tarefas, tudo o que temos nesta página, e, em seguida, todos os componentes desta página podem usar o serviço para obter essas informações por meio de fluxos. É por isso que aqui queremos criar nossa classe e será um serviço entediado. E aqui no topo não devemos esquecer de usar um injetável. O que eu quero fazer agora aqui, exatamente o mesmo que fizemos com nosso usuário atual. Só para lembrá-lo, nós tínhamos aqui, nosso serviço. Aqui no topo, criamos esse fluxo de usuários atual que podemos usar em todo o nosso aplicativo. Queremos fazer exatamente o mesmo. Agora aqui, queremos criar aqui O tabuleiro era mais alto e isso é um fluxo e isso está no seu assunto de comportamento. E estamos chegando aqui em qualquer interface de placa agora. E aqui dentro estamos colocando agora só porque, por padrão, não teremos placa. Ainda não fomos buscá-lo. E depois de buscarmos esse quadro, podemos configurá-lo e atualizar o fluxo. É assim que aqui devemos criar um novo método, disse o conselho. E dentro do útero deve fornecer nossa prancha, que é a interface da nossa placa, e isso é vazio. E aqui o que queremos fazer, bom chamar esse ponto Stoller de dardos seguida, porque queremos atualizar um fluxo e retirar dentro do nosso tabuleiro. Agora não devemos esquecer de registrar nosso serviço de diretoria dentro de um módulo. Então, aqui devemos criar nossos provedores e estamos escrevendo nosso serviço de diretoria dentro. E agora podemos usá-lo diretamente dentro da nossa placa de componentes. Portanto, não queremos criar aqui um quadro de propriedades. Queremos realmente injetar aqui dentro de nossa nova propriedade do construtor. E será um serviço entediado do serviço do conselho. E como você pode ver, essa é a diferença que temos aqui, tanto os serviços, o serviço de placas quanto o serviço de diretoria. E isso é uma grande diferença. Em primeiro lugar, esse é um serviço para trabalhar com o eBay. O segundo serviço é mais parecido com um estado. E o que podemos fazer agora com buscar dados após a assinatura, podemos escrever e dizer este serviço de placa, quadro de pontos. E somos fornecidos dentro do nosso quadro. Neste caso, estamos armazenando isso dentro do fluxo. E agora podemos usar essas informações não apenas dentro de nosso componente de placa, mas depois também dentro de nosso componente de tarefa. E isso é extremamente flexível e a melhor solução que posso imaginar para compartilhar dados entre duas rodadas. E só para verificar se está funcionando, quero criar aqui no fluxo superior para o quadro. Então, na verdade, aqui temos um fluxo de placa e sabemos que esse é um observável da interface da placa. Então, estamos mostrando aqui que devemos obter uma prancha. Não há outra possibilidade. E para evitar esse erro de script de tipo sem inicializador, escreveremos esse código diretamente no construtor. Isso é totalmente bom. Então, aqui podemos escrever este quadro de pontos com dólares iguais, e aqui queremos usar o ponto de serviço armazenado. E aqui temos nossa corda, que é o dólar do tabuleiro. E você pode dizer, Ok, por que não usamos isso diretamente? Porque aqui dentro do stream de placas, podemos entrar agora nosso componente sem precisar de null. Nós simplesmente queremos trabalhar com nosso componente quando a placa não é agora, é por isso que o que podemos escrever aqui, podemos escrever pipe e filtrar o resultado. Então, aqui é só filtrar Boolean eliminará. Agora, a partir daqui, não chegaremos aqui nada se for agora, vamos apenas atualizar nosso quadro. Se conseguirmos um quadro, e agora pudermos pular dentro do nosso arquivo HTML e renderizar aqui o fluxo do nosso quadro apenas para testar, é por isso que o dólar do conselho. E aqui estamos usando um único canal para renderizar essas informações. Vamos verificar isso. Estou recarregando a página e obtendo objeto, objeto porque essencialmente temos adjacente e devemos passá-lo com o tubo Jason. Vamos verificar isso de novo. Estamos chegando aqui nosso conselho, e como você pode ver, esta é a nossa informação do nosso conselho que foi pré-buscada. Isto é Título, usuário, ID do usuário. Então, essencialmente, a ideia é que esse serviço tenha informações dentro dele, mas não precisamos armazenar essas informações alguma forma dentro de nosso componente de placa. Simplesmente usamos fluxos do serviço e os usamos dentro de cada componente onde precisamos, por exemplo, escreveremos exatamente o mesmo código dentro nosso componente de tarefa, se precisarmos o acesso para o nosso pássaro, por exemplo. O que é mais importante, podemos mapear dados assim, o que é muito conveniente. 28. Criar serviço de soquete: Neste vídeo, estamos iniciando uma parte interessante de nossa aplicação e configurando nossa conexão de camada de soquete. E só para lembrá-lo, nós já configuramos isso. Então, Quetta, você está no back-end. Então, aqui dentro do nosso código, podemos abrir o teste do servidor de fonte de serviço. E aqui no topo temos o novo servidor IR, e aqui temos IR na conexão. E aqui está nossa conexão de log do console, o que na verdade significa que a configuramos com sucesso. Então, entre no back-end e agora devemos implementá-lo no cliente. E para isso, usaremos exatamente a mesma biblioteca que estamos usando no back-end. Só para lembrá-lo aqui, usamos soquete. Este é o seu aqui dentro do console, eu quero pular dentro da pasta do cliente. E aqui eu quero instalar um novo pacote que é chamado socket Datta your dash client. E esse é exatamente o mesmo pacote da mesma equipe, mas é para configurar nosso cliente. E esse pacote não tem nada a ver com angular. Isso é apenas um JavaScript simples. Então, o que queremos fazer agora? Em primeiro lugar, dentro do aplicativo de origem de nossos clientes , serviços compartilhados do Insight, quero criar um novo serviço e será nosso serviço trabalhar com soquete. Este é o caminho aqui. Vamos chamar seu soquete, ponto ts do serviço DOD. E agora, por dentro, devemos criar nossa classe que é chamada de serviço de soquete. E, obviamente, não devemos esquecer injetável aqui no topo. Então, o que queremos criar aqui, queremos criar uma função que gere para nós uma nova conexão. É por isso que aqui podemos escrever a conexão do soquete SetTab. E aqui estamos recebendo nosso usuário atual. Por que usá-lo atualmente porque eles realmente querem enviar alguns dados privados por meio da conexão do soquete. Por que isso? Porque, na verdade , usaremos socket. Você está na página do fórum, que significa que nosso usuário está registrado. Mas por dentro, mergulhe nos iogues, não temos um sistema como o GET, como usamos para autenticação. Não temos cabeçalhos HTTP lá e não podemos anexar nosso token ao nosso soquete. Mas há uma maneira de passar nosso token usando socket. Essa é a maneira de tornar isso possível. Queremos configurar essa conexão para nosso usuário atual. E podemos então lançar o token do CurrentUser dentro de nossa conexão de soquete com cada solicitação. Então, como eu disse aqui, estamos recebendo como argumento o usuário atual e essa interface de usuário atual. E de volta estamos ficando vazios. Agora, aqui dentro, queremos usar nosso íon. E, na verdade, devo inserir aqui na parte superior ou no seu tambor. E aqui temos nosso cliente de E/S de soquete. Agora, aqui dentro do pronto-socorro, posso fornecer um URL onde queremos nos conectar. E, na verdade, aqui podemos apenas tentar HTTP e nossa porta do servidor. Não queremos usar isso porque para isso, temos variáveis de ambiente, o que na verdade significa que queremos entrar no ambiente de origem dos clientes, sim, e aqui, como temos nossa API Euro, queremos criar um URL de socket. É aqui que podemos criar URL de sockets, e este é o http localhost. Aqui temos 4.001 e não precisamos colocar aqui a barra oito pi porque configuramos nossa conexão de camada de soquete diretamente em nosso servidor. E você pode dizer, tudo bem, mas poderíamos reutilizar essa API como uma única propriedade para URL de API e E/S de soquete. Sim, poderíamos, mas eu recomendo que você o divida em duas propriedades diferentes. Nesse caso, é mais fácil dividi-lo posteriormente se você quiser mover sua camada de soquete para outro servidor web. Agora, dentro do nosso serviço de soquete, podemos usar nosso ambiente. É assim aqui, ponto do ambiente, temos soquetes, URL. Isso é exatamente o que devemos dar dentro para fora ou sua conexão. E excelente. Agora, além disso, quero fornecer o token do nosso usuário atual porque na verdade, configuramos conexão da camada de soquete apenas para o usuário de login, o que significa que nunca temos um caso em que não temos esse token. Aqui é o caminho, podemos escrever horas de campo e, em seguida, o lado que estamos fornecendo falando, que é o token de ponto do usuário atual. E, na verdade, aqui como segundo argumento, estamos fornecendo um objeto com nosso campo e esse campo externo dentro do soquete IO é exatamente para autenticar um usuário. E o que estamos recebendo de volta é que o resultado do nosso AR é essa conexão de soquete. É aqui que eu quero escrever esse soquete igual a IR. E aqui devemos criar essa propriedade , dentro do soquete. E como você pode ver, essas são nossas duas entradas. Isso não está correto. Queremos importar o soquete do cliente Socket Layer, ou ele está indefinido porque , por padrão, não temos um soquete. E então, em algum momento, nós o configuramos usando a conexão do soquete de configuração. Além disso, além da nossa função de configuração, quero criar a função de desconexão, o que na verdade significa que em algum momento nosso usuário será bloqueado e queremos desconectá-lo do nosso conexão de soquete. É aqui que vamos criar uma função adicional de desconexão. E isso é muito simples. O que queremos chamar aqui, queremos escrever esse soquete de ponto. E aqui temos um método que é chamado de desconexão. E como você pode ver aqui, eu não recebo um preenchimento automático porque na verdade, esse soquete pode ser indefinido. E há duas variações possíveis de como podemos corrigi-lo. Em primeiro lugar, aqui eu posso apenas colocar um ponto de interrogação e pronto. Mas eu não quero escrever o código assim. Eu realmente quero notificar um desenvolvedor que, se não tivermos soquete, teremos um problema. Na verdade, não podemos usar desconexão antes de configurar nossa conexão. Se não tivermos esse soquete de ponto, então queremos jogar e estreitar. Então, aqui será lançado um novo erro. E, por exemplo, aqui a conexão do soquete não está estabelecida. Portanto, nosso serviço básico de soquetes foi criado com sucesso. Agora, em algum momento, precisamos implementar a configuração da conexão do soquete e eles realmente querem fazer isso dentro do nosso módulo de aplicativo. Por que isso? Porque toda vez que somos autenticados e Berlim, agora que temos CurrentUser, gostaria de configurar uma conexão. É aqui que podemos entrar no componente do nosso aplicativo. E aqui temos um próximo. E só para lembrá-lo, aqui estamos recebendo o usuário atual toda vez que iniciamos nosso aplicativo. E aqui estamos definindo o usuário atual e podemos, antes disso, configurar uma conexão. É aqui que podemos escrever privado e temos um serviço de soquete, e este é o nosso serviço de soquete. Agora, aqui, antes que possamos escrever que temos aqui esses pontos, serviço de soquete, ponto, conexão de soquete de configuração. E, na verdade, aqui estamos recebendo nosso usuário atual e podemos entregá-lo por dentro. Vamos salvar isso e verificar se está funcionando, como você pode ver aqui com não tem erros e depois pular para o navegador. E aqui está vermelho, estamos recebendo um erro. Nenhum provedor de serviço de soquete encerrou isso porque criamos nosso serviço de soquete, mas não injetamos dentro de um módulo. E aqui estamos usando o serviço de soquete dentro do nosso componente de aplicativo, o que significa que faz sentido injetar esse módulo dentro de nossos provedores. É por isso que aqui podemos escrever serviço de soquete e estamos prontos para ir. Vamos verificar isso. Estou recarregando a página e estamos recebendo outro erro. Então, o que quer que estejamos recebendo, estamos fazendo esse pedido no socket a yarn. Você pode ver isso aqui, mas estamos recebendo um erro. Temos um curso, o que significa política de origem cruzada. Porque aqui com não tem controle de acesso permitir cabeçalho de origem no recurso solicitado. E isso é realmente completamente correto e devemos nos informar dentro do Serum por que isso está acontecendo, porque nosso servidor não permite conexões de outro host e com certeza usará aqui outro host, este é o host local para 1200. É por isso que devemos entrar em uma fonte de servidor. E aqui temos nossas camadas de servidor, e aqui devemos configurar nosso servidor IIS de forma um pouco diferente. Então, aqui como o segundo parâmetro, podemos fornecer algumas opções e estamos procurando a opção que é chamada de núcleos. E por dentro podemos definir a estrela de origem e realmente começar significa que estamos permitindo conexões de qualquer host. E no projeto ferroviário, você pode escrever aqui apenas um host do seu domínio. Mas, para nossos propósitos, estrela de origem é totalmente válida. Vamos verificar se está funcionando. Estou muito feliz agora com a página e não temos nenhum erro. Agora, podemos pular para dentro da rede, e aqui, como você pode ver, temos conexões WebSocket. Então, aqui estamos entrando em centenas. E se você puder ver em seu navegador algo assim, significa que sua solicitação da conexão do soquete é essa. E, na verdade, agora podemos entrar em nosso console de back-end. E aqui podemos ver conectar três vezes porque toda vez que eu recarrego a página, há uma nova conexão estabelecida, que na verdade significa que criamos com sucesso uma conexão de soquete no cliente. Agora, a única pergunta é: o que há com a desconexão? Criamos uma desconexão, mas não podemos usá-la onde quisermos. Na verdade, gostaria de usá-lo dentro do logout. É aqui que podemos entrar em nosso aplicativo, Serviços de Saúde e aqui serviço de resultados. E aqui temos nosso logout. E aqui nós primeiro removemos nossa fala, depois quando nulo e nosso usuário atual. E aqui podemos usar o soquete para desconectar nossa conexão porque sabemos que como a usamos não está mais travada. Não precisamos dessa conexão de soquete. Aqui está dentro do construtor, podemos injetar nosso novo serviço de soquete, e este é o nosso serviço de soquete. Agora, aqui na parte inferior do nosso logout, podemos escrever essa desconexão de ponto de serviço de soquete e desconectaremos nosso usuário atual e fecharemos nossa conexão de soquete. 29. Juntar-se e sair do tabuleiro: Neste vídeo, quero mostrar como podemos usar soquetes no exemplo de conexão à nossa placa e desconectá-los à placa. O que isso significa? Na verdade, insira o soquete IO. Nós temos esse thin que é chamado de salas, o que na verdade significa quando não apenas notificamos nosso back-end com alguma mensagem de soquete ou outro cliente quando eles definem todos os clientes que estão conectados a quarto. E, na verdade, quando estamos falando sobre pranchas dentro do trailer, faz muito sentido. Nós realmente queremos notificar apenas os usuários que se juntaram a esse quadro específico. O que significa, por exemplo, que temos dois usuários diferentes. Um usuário abriu o quadro, cheio. Formulário de quadro aberto do segundo usuário. Agora, o primeiro usuário criou uma tarefa e devemos notificar um segundo usuário sobre a criação dessa tarefa porque ele está conectado a esta sala ou a este quadro. É aqui que, neste vídeo, implementaremos como podemos nos juntar ao nosso conselho e deixar nosso conselho. E para isso, precisamos criar um novo método dentro do nosso serviço de soquete. É por isso que quero abrir nossos níveis de serviço de circuito aqui, criar um novo método chamado emmet. Por que precisamos desse método, na verdade, o próprio soquete de insights. Temos esses pontos, soquete, ponto e encontro, e podemos fornecer apenas uma corda como foo. Será nossa mensagem de emissão. E aqui podemos fornecer algumas informações, por exemplo, string Ambar. É assim que normalmente podemos usar soquetes dentro de nosso aplicativo, mas eu quero envolvê-lo em um método adicional por dois motivos. Em primeiro lugar, queremos isolar uma biblioteca e criar um invólucro. Nesse caso, sempre podemos jogar fora esse uso, por exemplo, socket para o seu cliente e usar alguma outra biblioteca. Em segundo lugar, aqui eu quero validar que foram conectados ao soquete de um fio. É assim, aqui está nossa imagem e estamos chegando aqui, primeiro lugar, o nome do nosso evento, é apenas uma string. E se você não conhece o IO interno do soquete, estamos sempre emitindo apenas com strings exclusivas, que estamos ouvindo em outros clientes ou dentro de nosso back-end. E a segunda aqui será uma mensagem aqui que escreverei qualquer desperdício, qualquer, porque é uma mensagem que podemos fornecer uma string e nenhum objeto ou qualquer dado que gostemos. E aqui estamos conseguindo um vazio, mas queremos fazer por dentro. Em primeiro lugar, vou copiar e colar esta linha para verificar a conexão do soquete. Porque se não tivermos uma conexão de soquete, não podemos usar carne. Depois disso. Podemos simplesmente usar esse commit de ponto de soquete e fomos fornecidos dentro da vírgula do nome do evento. E aqui está nossa mensagem. Portanto, nossa função de imagem está pronta e agora podemos usá-la. E, na verdade, eu quero usá-lo diretamente dentro de nossos componentes de placa de aplicativo, componente de placa, componentes ts. E aqui temos o método init de junho. E, na verdade, é um bom lugar para colocar apenas aqui a junção do usuário, que na verdade significa que toda vez que esse componente é carregado, significa que os usos saltaram para esse específico rota e devemos nos juntar ao usuário se ele mudou a rota e queremos sair desta sala ou desta placa. Portanto, desconecte um usuário dessa sala específica. É por isso que podemos escrever aqui. Em primeiro lugar, devemos injetar aqui nosso serviço de soquete. Este é y, aqui estará o serviço de soquete, e este é o nosso serviço de soquete. Agora, aqui podemos usar esse método e escrever esse ponto de serviço de soquete de ponto. E aqui temos nossa imagem e devemos fornecer uma visão primeiro do nome do nosso evento e, em segundo lugar, alguns dados. Então, essencialmente, o que queremos escrever aqui, algo como entrar em quadros. E aqui nossa mensagem será, por exemplo, um objeto com o ID da placa. E aqui estamos fornecendo o ID da placa desse URL específico. Este é o ID do conselho. Já temos essas informações. Por que eu empacotei essas informações dentro do objeto. Porque esvaziar, se por algum motivo quisermos colocar aqui mais informações com o objeto, podemos fazê-lo diretamente. Se tivermos aqui, uma string deve refletir todos esses lugares, da string ao objeto. E como você pode ver aqui, podemos emitir qualquer tensão. Podemos escrever aqui para. Está tudo bem, mas teremos muitos eventos de socket diferentes e queremos organizá-los de alguma forma. É por isso que aqui eu prefiro usar quadros, que é um plural de alguma entidade, como quadros ou talvez colunas ou tarefas. E aqui temos o que aconteceu? Por exemplo, nós nos juntamos, isso é apenas um começo. Mais tarde, podemos fazer algo como sucesso conjunto se estiver em um processo síncrono, o que na verdade significa que, por enquanto, os pássaros se juntam está bem. O que não está bem é que estamos escrevendo aqui uma string onde está bem no TypeScript e devemos usar inúmeras. E, na verdade, inúmeras são apenas algumas constantes dentro de uma única propriedade. É por isso que aqui à direita, quero abrir nossa pasta compartilhada, e aqui temos tipos. Aqui. Quero criar eventos de soquete ponto em m ponto ts. Aqui. Agora podemos exportar nosso enum, que é o ENM da ONU de soquete, e este é apenas um objeto aqui, podemos escrever placas de campo juntando iguais, e aqui estamos escrevendo placas de junção. Então, primeiro de tudo, aqui temos um estilo de código. Segundo Luba não desenhado aqui, uma corda. Bem aqui, eventos de soquete na cadeia de m dot boards, neste caso, em todos os lugares onde usando a mesma string, mas nunca vamos escrevê-lo incorretamente porque estamos usando aqui Justin unum, que é uma variável e não uma string simples. Então, o que essa linha faz, ela emite para o nosso back-end em uma nova mensagem de E/S de soquete. Aqui foram fornecidas algumas strings e alguns dados. Por que estamos fornecendo exatamente esses dados, porque queremos que o back-end se junte ao nosso usuário atual. Portanto, nossa conexão de soquete atual com a placa específica. E isso é suficiente para que nosso back-end reaja por isso. Agora, é hora de implementá-lo no back-end, é aqui que devemos abrir a fonte de nossos servidores. E aqui temos nosso teste de servidor. E aqui na parte inferior temos nossa própria conexão. Isso é totalmente bom. Agora, lá dentro, podemos remover esse log do console e queremos reagir com nosso ponto de soquete ligado, em alguns eventos e realmente ouvir o que estamos esperando. Estamos esperando o Boards juntos. Mas aqui temos exatamente o mesmo problema dentro do back-end e não queremos escrever apenas strings simples. Queremos também organizá-los no enum. E, na verdade, vamos duplicar exatamente todo o arquivo de nossos eventos de soquete no cliente e na calda. E você pode dizer, ok, isso é inútil. Podemos criar apenas um único arquivo. Você poderia, mas potencialmente você pode dividir seu cliente e servidor em diferentes repositórios e seguida, você pode compartilhar qualquer coisa entre eles. É por isso que eu realmente quero isolar nosso cliente e nosso back-end. Então, o que queremos fazer aqui dentro de nossos tipos, podemos criar exatamente o mesmo. Será que nossos eventos de soquete não enumeram pontos ts. E agora dentro eles poderão ser colocados exatamente o mesmo código que temos no cliente. O que eu quero fazer agora aqui, em vez de pássaros se juntarem, eu posso escrever eventos de soquete em m dot boards churn. E como você pode ver que essa entrada é de tipos de eventos de soquete. Então é assim que assinamos nosso evento do cliente com socket, a língua, mas de onde estamos obtendo nosso socket, este é o nosso primeiro parâmetro aqui. Como você pode ver, isso é socket e aqui temos socket dot on, mas aqui devemos fornecer dois argumentos. Em primeiro lugar, é o nosso evento e, em segundo lugar, é o nosso Kohlberg. Então, o que estamos obtendo aqui normalmente obtemos alguns dados, é que normalmente obtemos alguns dados, e esses são exatamente os dados que fornecemos do cliente. Poderíamos escrever aqui alguma lógica, mas não queremos, porque na verdade escrevemos tudo o que está relacionado às nossas placas dentro do controle. E faz muito sentido escrever todo o nosso código de E/S de soquete também dentro do controlador. Nós realmente não nos importamos se é Socket Layer ou Justice GTP. Podemos isolar todo esse código dentro de nossos controladores. É aqui que podemos usar o ponto controlador de nossa placa, por exemplo, entrar no quadro. Isso é o que queremos implementar. E agora, em primeiro lugar, quero dar mais do que o soquete e depois os dados. E nós iremos em todos os casos quando estivermos trabalhando com o Socket Layer e forneceremos essas informações. Isso é muito parecido com o que estamos fazendo com nosso Express. Aqui. Estamos usando controle de natalidade ou criando quadro. E, na verdade, é assim que damos diretamente uma resposta interna à solicitação. E a seguir, por que estamos fazendo isso. Na verdade, quando estamos fornecendo tudo dentro, podemos usar o que quisermos. Se precisarmos de um “vocês”, podemos usar um fio quando for andar de bicicleta. Podemos usar essas informações se precisarmos de alguns dados do evento, também podemos usá-los. E agora só precisamos implementar nossa junta. É por isso que eu quero entrar em nossos esportes de controle. E aqui na parte inferior, devemos criar uma nova função. Aqui temos cones especializados, Joan Board, e estamos chegando aqui, em primeiro lugar, Iowa, que é um servidor. Na verdade, temos aqui muito inverso. É por isso que você precisa ser cauteloso, mas precisamos aqui inserir nosso servidor a partir do soquete IO. Isso é importante. É aqui que estamos recebendo um fio e é nosso servidor como um tipo. Depois disso, temos nosso soquete. E o soquete também vem do soquete IO. E por último, mas não menos importante, aqui estão nossos dados. E, na verdade, sabemos que por dentro, estamos fornecendo o ID da placa, que é uma string, e isso é informação suficiente para nós. Então é assim que uma função típica dentro do controlador se parecerá quando estivermos trabalhando com Socket Layer. E agora o que queremos fazer lá dentro, queremos apenas escrever socket dot join. Aqui, estamos fornecendo o ID do quadro de pontos de dados. E é isso, é apenas uma única linha. Então, o que esse código faz, então Wed mostrado nesta conexão de soquete atual. Então, nosso usuário atual para este ID de placa, e isso é apenas uma string, nada mais. Mas, na verdade, quando estamos escrevendo join e alguns foo, simplesmente dizemos ao socket para juntar o socket atual a esta sala com este nome, mas não temos salas em nosso aplicativo, temos placas, mas a ideia é exatamente o mesmo, onde juntar nossos usuários ao quadro e, em seguida, eles receberão nossas mensagens para esse quadro específico. Agora há quem queira testar se nosso código está funcionando. É por isso que aqui eu só quero escrever servidor de log do console, junção de soquete. E aqui vou escrever o AD do quadro de pontos de dados de vírgula neste caso. Mas agora, quando vemos esse log do console, isso significa que o emitiu com sucesso nossa mensagem do cliente ou do back-end. E nosso back-end reagiu à mensagem e juntou nosso usuário a esta sala. Aqui é você, vamos pular dentro nosso back-end e recarregar a página. E como você pode ver, não temos nenhum erro. E, na verdade, nosso código com esse componente de placa e essa imagem será acionado porque nosso componente foi renderizado. E agora podemos entrar no console e você pode ver o circuito de serviço ou sua entrada. E aqui está o d do nosso conselho. É aqui que estamos unindo nosso soquete atual. E como você pode ver dentro do navegador, esse é exatamente o d do nosso quadro. E agora queremos fazer exatamente a mesma coisa com a vida e a alimentação. E na verdade o que eles queriam fazer, eu quero criar aqui um método adicional, isso inicializar ouvintes e na verdade, todos os meus ouvintes gostam de assinaturas, por exemplo, eu sempre empacoto isso método adicional. Esse é o mesmo nome em como, por exemplo, buscar dados. Nesse caso, eles não contêm muitas informações em junho. É aqui que eu quero escrever, inicializar ouvintes e me inscrever aqui ao vivo em uma página. E, na verdade, podemos fazer isso se estivermos usando um aplicativo de seca e tivermos aqui uma seca, mas não um roteador. É por aqui que devemos usar o roteador e esse é o nosso trabalho. E agora aqui podemos escrever uma assinatura para viver em uma página. E aqui podemos escrever esses eventos pontuais do roteador de pontos. E aqui nós nos inscrevemos. E, na verdade, assinamos, teremos aqui acesso a cada evento que é acionado por um roteador. E o que queremos escrever aqui, se evento, instância daqui temos início de navegação. E o início da navegação é o começo da mudança em nossa rota. E, na verdade, se isso estiver acontecendo, então aqui eu quero console log deixando uma página. Então, mais uma vez, aqui estamos usando eventos de seca para assinar todos os eventos de seca. E estamos obtendo acesso ao Subscribe a todos os eventos agora aqui para verificar o evento específico em que estamos usando a instância de e estamos fornecendo aqui a pilha de navegação. E aqui está o nosso log do console, onde realmente queremos emitir uma mensagem de soquete e essa mensagem estará ao vivo em uma placa. Em seguida, precisamos desconectar um usuário dessa placa específica. Vamos verificar isso. Estou recarregando a página e temos um limite que esqueci de colocar uma vírgula aqui no topo. Então, vamos colocá-lo agora e recarregar a página. E como você pode ver, não temos nenhum erro, mas não podemos pular para outra página onde eles possam tentar fazer aqui. Eu posso simplesmente voltar atrás e estamos saindo da página porque aqui estamos agora na página de quadros de barra. E aqui está este log do console, que na verdade significa que esse log do console será acionado toda vez que estivermos vivendo uma página. Mas, na verdade, aqui eu não quero usar sockets service summit. Em vez disso, quero escrever aqui este quadro de folhas de pontos de serviço de conselho. E, na verdade, você pode perguntar, mas por que, por que não escrever aqui em meio à resposta aqui, não é no LinkedIn que queremos fazer dentro de um serviço de conselho quando estamos saindo da página. E, na verdade, aqui dentro do serviço ao mar, temos o fluxo do tabuleiro e também devemos configurá-lo para agora, quando deixamos o tabuleiro, este é o caminho aqui. Vamos criar nosso método de placa de folhas e só temos aqui um vazio agora dentro. Primeiro de tudo, whoop, quero definir este quadro ao lado de agora, o que na verdade significa que não temos mais um quadro. E depois disso, queremos conhecer essa mensagem que sairá do quadro. É por isso que devemos abrir nossos tipos compartilhados. E aqui estão os eventos de soquete. Aqui temos a rotatividade de placas. Agora podemos copiar e colar esta mensagem e nomeá-la como placas ao vivo. E isso está entediado. Sair. Agora vou copiar e colar esta linha. E agora aqui podemos usar nosso serviço de soquete. Mas para isso VM deve injetá-lo aqui dentro do construtor. Então, aqui temos nosso serviço de soquete, e este é um serviço de soquete e estamos usando exatamente como fizemos anteriormente. O que eu quero escrever aqui é este serviço de soquete de pontos ponto m it e foram fornecidos dentro do nome do nosso evento. E, neste caso, serão nossos eventos de soquete E e M dot boards ao vivo. E, na verdade, aqui devemos fornecer o que o conselho devemos viver. Aqui está faltando um ID de placa, que deve ser uma string, e devemos fornecer a partir do nosso componente. Aqui eu quero colocar o ID do conselho. Agora precisamos atualizar nosso componente. Então, aqui temos nosso componente de placa, e aqui dentro do live board, vou escrever esse ID de porta de ponto. Então, agora só precisamos implementar exatamente o mesmo no servidor que fizemos com a união, mas precisamos usar ao vivo. É aqui que vamos pular de volta em silos, servidores, fonte, servidor, sim. E aqui temos nossa conexão e o gigante dos portos. O que eu preciso fazer agora, eu quero atualizar os eventos de soquete neles no back-end, e também serão portas de saída. E aqui estou eu pranchas ao vivo. Agora, aqui podemos copiar e colar essas linhas completamente e registrar mais um soquete, não para placas agitadas, Mas para placas de pontos ao vivo adivinhando que ele tem alguns dados. E aqui queremos usar o controlador de portas, não entrar na placa, mas sair da placa. E devemos criar agora esse pod ao vivo dentro do nosso controlador. E, na verdade, aqui será exatamente o mesmo. É por isso que vou copiar e colar esse método completamente e apenas nomeá-lo nascido ao vivo aqui, estamos obtendo nosso IR como soquete anterior aos dados internos anteriores, temos nosso ID de placa. Agora, aqui dentro do registro do console, podemos escrever nosso quintal para sair. E aqui está a placa de dados AD e em vez de junta de soquete, onde bem aqui, soquete folha escura, e com esta única linha para onde estamos movendo nosso soquete atual desta sala específica, o que significa que não receberei nenhum evento deste quadro. Vamos verificar se está funcionando. Estou recarregando a página e estamos lá dentro. Agora aqui estou eu, saco escondido e devemos despachar a seção para o nosso back-end. Vamos verificar isso como você pode ver aqui. Em primeiro lugar, tínhamos aqui o soquete ao lado e com entrar nesta sala específica. E então, quando eu revidar, temos uma folha desta sala. E é exatamente assim que um cliente e implorando estão trabalhando juntos quando estamos usando E/S de soquete. 30. Autenticação no socket.io: Neste vídeo, precisamos terminar de trabalhar na autenticação agora um soquete de insights do usuário. Mas antes de tudo, queremos resolver um grande problema. Como você pode ver aqui, estou logado e estou na página do quadro. Mas o que acontecerá se eu fizer logout? Então, eu simplesmente quero entrar no aplicativo, remover nosso token e recarregar a página. Agora estou diretamente na página inicial. Isso é totalmente válido. Mas então, em algum momento, eu quero me autenticar novamente. Estou acessando aqui login e depois cole aqui f2 em gmail.com. E nossa senha, estou acertando aqui a mesma média. E como você pode ver, não temos nenhum erro, mas depois do mesmo salto para o primogênito e estamos recebendo um erro, conexão do soquete não é estabelecida por que isso está acontecendo. Na verdade, temos nossa conexão de soquete de inicialização dentro de nosso aplicativo de origem, componente de aplicativo ts, esse código. Então, após a página Lord, estamos buscando o usuário atual e aqui estamos configurando a conexão do soquete, mas não estamos bloqueados no início. É por isso que viemos aqui e definimos nosso usuário atual agora, então travamos com sucesso. E só para lembrá-lo, é isso que está acontecendo, onde dentro de nossos componentes fazem login. Aqui está o nosso onsubmit aqui, onde assinar o login e estamos sentados aqui conversando e usuário atual, isso é totalmente bom, mas não atualizamos nosso soquete. Portanto, nossa conexão de camada de soquete não existe após o registro ou após o login e não vive quando recarregaremos a página, essa conexão de soquete será estabelecida. Novamente, isso obviamente não está correto e devemos estabelecer essa conexão após o login ou após o registro. E isso é extremamente fácil de fazer. O que devemos fazer aqui, podemos simplesmente injetar dentro de nossa nova propriedade de construtor, e será nosso serviço de soquete, que é nosso serviço de soquete. Agora, aqui podemos usar esse método. Então, por exemplo, depois de um determinado token, podemos escrever esses pontos de serviço de soquete ponto. E aqui temos a conexão do soquete SetTab aqui, pois eles têm acesso a um usuário atual e simplesmente o jogamos dentro de nossa conexão de soquete de configuração. E devemos fazer exatamente o mesmo dentro do nosso registro. Então, primeiro de tudo, estamos injetando nosso serviço de soquete. Portanto, o serviço de soquete privado é o serviço de soquete. E agora, depois disso, podemos usar esse método dentro do nosso sucesso. Então, depois de definir o token, é esse serviço de soquete de pontos, conexão de soquete de configuração de pontos com o usuário atual. Nesse caso, ele funcionará corretamente. Eu quero remover estão falando mais uma vez, pulei ou página de login e agora tente fazer o login. Então, aqui está completo em gmail.com e nossa senha, eu estou clicando em dizer maldade, e depois pular para a primeira parte. E não temos nenhum erro no momento porque configuramos com sucesso nossa conexão de soquete logo após travarmos. Mas não fazemos nada com nossa autenticação dentro do soquete IO, e é exatamente isso que queremos fazer. Então, o que está acontecendo dentro da nossa conexão de soquete de configuração? Aqui somos jogados dentro do nosso token de usuário atual. Isso é totalmente bom. De frente e de lado, fizemos tudo o que precisávamos. Mas agora devemos pular dentro de um servidor e analisá-lo de acordo. Para isso, o boom deve pular dentro de nossos níveis de servidor. E aqui está sua própria conexão. E, na verdade, antes de nossa própria conexão, passe a escrever aqui, ponto use. Aqui teremos nossa função e será nosso middleware. E depois disso, temos nossa própria conexão, o que na verdade significa que é exatamente a mesma coisa, como nosso middleware aqui segue em frente para autenticar nossa solicitação e saber que estamos presos porque nossa conexão de soquete só está disponível para usuários logados. É aqui que estamos escrevendo IOUs e por dentro devemos fornecer a função. E aqui será uma função assíncrona só porque queremos buscar nosso CurrentUser do banco de dados. E aqui estamos, em primeiro lugar, obtendo nosso socket, que é socket, e estamos obtendo, e a próxima função, porque é uma função síncrona que queremos escrever aqui, try and catch. Então, primeiro de tudo, devemos tentar diretamente e onde, cozinha e erro e o que vamos acontecer dentro da captura. Queremos simplesmente escrever aqui seguir e lançar uma nova era com, por exemplo, nosso erro de autenticação. E aqui está uma coisa super importante que você deve se lembrar. Não temos nenhum erro dentro do soquete. Eles não estão lá. Não propagamos nenhum erro de volta para o cliente, que na verdade significa que, se estamos recebendo algum erro, por exemplo no back-end, simplesmente queremos enviar uma mensagem para o cliente específico. Podemos enviar um estreito que acabamos de lançar dentro de um objeto pode ser uma mensagem de erro com algum código de erro ou o que você preferir. E é importante lembrar. Portanto, o Socket Layer não está funcionando exatamente da mesma maneira, como deveriam ser erros? E agora, a primeira coisa que queremos fazer em nossa tentativa é começar a falar a partir do pedido. E aqui podemos escrever socket dot, handshake, dot, house, dot token. E será exatamente o que passamos. E, na verdade, aqui estamos recebendo o token é qualquer, e eles não querem isso, porque na verdade aqui eu quero obter uma string. É por isso que aqui eu posso escrever colchetes redondos e apenas escrever a tensão S. E se não obtivermos esse token, então eu quero usar aqui uma string vazia. Por que estou fazendo isso? Porque aqui queremos usar Jason verify, para verificar nosso token. E, nesse caso, não queremos que seja indefinido. É. Podemos verificar isso quando for uma string. Este é o caminho aqui. Agora podemos tentar analisar o que estamos falando usando o token da web JSON. Então, aqui no topo, podemos importar GPS do nosso pacote JSON Web Token. Agora podemos voltar ao nosso código aqui, usá-lo. Então, aqui teremos o ponto JWT e aqui verificamos. E agora, por dentro, devemos passar antes de tudo, nosso alvo. Mas só para lembrá-lo, dentro de um token, temos o espaço do portador e, em seguida, nosso token, é aqui que eu quero dividi-lo por espaço e pegar o segundo argumento. E depois disso, devemos fornecer aqui um segredo. E só para lembrá-lo de qual é o segredo que vem da nossa configuração. E isso é o que estamos usando para analisar nosso token JSON. E é isso que estamos recebendo de volta. Estamos conseguindo aqui um lote de cordas ou DVT PE. Mas aqui nós realmente queremos contar o que estamos recebendo de volta. Aqui. Estamos recebendo, como sempre, nosso objeto, dizemos D, que é string. E em segundo lugar, estamos recebendo um e-mail que também é uma string. Nesse caso, estamos obtendo os dados corretos aqui e agora podemos obter um usuário exatamente como fizemos dentro do nosso middleware Auth. E para isso, devemos inserir um usuário aqui no topo. Então, estamos usando agora um modelo de usuário exatamente como fizemos anteriormente. Então, usamos apenas modelos de barra slash user. E agora aqui podemos fazer um pedido. Então, aqui queremos recuperar nosso usuário, e aqui queremos fazer uma solicitação ao banco de dados com o usuário ponto. E aqui está o nosso bom Tchau. Aqui podemos fazer find by ID porque temos ID de ponto de dados de insight NAD. E se não tivermos nosso utilizável, queremos lançar um erro. Então, aqui, se não encontramos um usuário, significa que não estamos trancados aqui. Simplesmente executamos return next e somos jogados dentro do erro de autenticação da nova era, assim como fizemos dentro de nossa captura. E depois disso, queremos anotar esse usuário dentro do nosso soquete. Na verdade, socket é a nossa instância, e podemos escrever dentro das informações adicionais, assim como fizemos anteriormente com a solicitação. Nesse caso, mais tarde, em cada controlador, podemos acessar esse usuário atual. Este é o caminho aqui, socket dot user é igual a usuário que encontramos. E como você pode ver aqui, obtemos diretamente uma propriedade de erro que o usuário não existe no tipo socket e devemos fazer exatamente o mesmo que fizemos com a solicitação SAML. Só para lembrá-lo, criamos uma solicitação expressa, na qual estendemos nossa solicitação para colocar o usuário dentro. E agora queremos fazer exatamente o mesmo, mas com nosso soquete. Este é o caminho aqui. Vamos criar socket dot interface dot ds. E aqui dentro queremos criar uma nova interface, e ela é chamada de socket. E aqui queremos usar estende de soquete, soquete. Na verdade, aqui eu tenho um nome bastante estranho porque essa não é uma entrada válida do soquete. Este é o caminho aqui. Eu quero importar o soquete como soquete ou o seu soquete. E estou fazendo isso do socket ou só porque não podemos ter exatamente o mesmo nome. Então aqui Gabão para exportar nosso soquete e aqui estavam soquete importante, isso é inválido. É aqui que queremos renomear nossa entrada do soquete IO e, depois disso estendido de nosso soquete, soquete. E queremos adicionar aqui nosso usuário. E nem sempre é feito dessa maneira aqui há um ponto de interrogação, e este é um documento de usuário que também devemos importar aqui na parte superior de nossa interface de usuário, Nossas interfaces de soquete lá. Agora podemos voltar para dentro do nosso servidor e usá-lo em vez do simples. Então, só para lembrá-lo, aqui temos um soquete de entrada do soquete IO. Isso não é mais válido. Aqui Woburn para inverter nosso soquete, e aqui está o nosso tipo slash socket. Vamos verificar se está funcionando. Estou rolando aqui até o final, e não temos mais nenhum erro aqui. O usuário do soquete é totalmente válido e é um documento do usuário ou indefinido. Agora vamos verificar se nosso código está funcionando. Então, eu estou pulando aqui dentro do console e não temos nenhum erro, então está funcionando. Agora, o que eu quero fazer, eu quero pular dentro de nossas placas controladoras. Aqui estamos fazendo parte do conselho. Então, aqui, em vez de placa de dados AT, eu posso console log aqui um usuário da mãe, um soquete. E, na verdade, aqui o usuário do ponto do soquete é obviamente inválido porque aqui não usamos a interface correta. Este é o y aqui no topo. Não precisamos usar o soquete do soquete IO, mas devemos importar nossa interface de soquete que acabamos criar a partir de nossa interface de soquete de barra de tipos. Aqui não temos um erro. Vamos entrar no console e verificar se está funcionando. E para isso, basta recarregar esta página e não temos nenhum erro. Agora vamos dar uma olhada dentro do console. Isso você pode ver que não há nenhuma mensagem aqui, o que significa que esquecemos algo. E o que esquecemos está dentro do sayo use para escrever a seguir, que na verdade significa que depois dessa linha, nosso código não está chegando a lugar nenhum. Este é y aqui, mas devo escrever a seguir e, nesse caso, deve funcionar. Vamos verificar novamente. Aqui estou recarregando a página. Entraremos em nosso back-end e, como você pode ver, aqui estão nossas informações. Então Socket Layer para se juntar e estamos chegando aqui nosso usuário, e aqui estamos obtendo dois logs de console porque toda vez que você atualiza a página, estamos recebendo esse soquete IO para se juntar porque isso abusos acontecendo. Estamos verificando nosso usuário, estamos obtendo isso do banco de dados. Agora, ele está disponível para nós dentro do nosso controlador. Então, com esse código, obtivemos com sucesso nosso usuário da solicitação. E agora, em cada ação dentro do controlador através de um circuito, um fio, temos esse usuário disponível rapidamente. 31. Conseguir colunas: Neste vídeo, começamos com a implementação de nossas colunas. E eu acho que é uma boa tarefa que você tente implementá-la sozinho. Então, o que queremos implementar? Um top? Temos nosso conselho e já estamos cotados em nosso cliente e o implementamos no back-end e no cliente. Agora devemos implementar colunas. Por que precisamos de colunas? Isso realmente coloca dentro de um quadro onde armazenaremos tarefas e nossos usuários podem criar colunas dentro do quadro, o que na verdade significa que a coluna deve pertencer aos usuários. Portanto, devemos ter o uso interno 3D, mas também o quadro AT, porque nossa coluna não pode existir sem uma placa e este é y. Aqui estão três níveis de dificuldades para você. Em primeiro lugar, se você quiser o nível mais difícil, basta pausar o vídeo agora e implementar no festival de back-end um modelo para a coluna, depois digitar para a coluna e, em seguida, um método get para obter uma lista de as colunas dentro do nosso quadro se você quiser experimentá-lo no segundo nível. Com minha orientação, aqui estão algumas dicas, pois o conjunto dentro nossos tipos de serviços deve ser criado exatamente como fizemos com a placa. Devemos criar aqui coluna e precisamos aqui de uma interface para a coluna e também de uma interface para o documento da coluna. Portanto, será muito parecido com o nosso conselho. Depois disso, dentro do nosso servidor, queremos criar uma nova rota. E aqui teremos placas de API apt-get, placa AT assim como aqui, colunas de barra. E será uma solicitação GET para obter todas as colunas dessa porta específica. E nós realmente precisamos dessa quantidade dentro da nossa rota. Em outro caso, não sabemos para qual quadro devemos obter nossas colunas. Para isso, devemos implementar em seu controlador, que é o controlador de colunas, e devemos implementar dentro do método, obter colunas, assim como temos aqui dentro. Fique entediado. E eles fizeram, é que queremos obter todas as nossas colunas até este ponto AD do banco de dados. Então, se você quiser experimentar você mesmo, basta pausar o vídeo agora. E agora a variante mais fácil, vamos implementá-la juntos. E estamos começando aqui. Em primeiro lugar, dos nossos tipos. Aqui queremos criar um novo tipo, que será a coluna dot interface ab.js. E, na verdade, eu quero copiar e colar completamente nosso quadro porque será super parecido. Então, aqui temos nossa interface e coluna de dados. E o que precisamos dentro da nossa coluna? Em primeiro lugar, precisamos de algum nome, o que significa que o título é totalmente válido, também terá aqui criado em e atualizado em. E temos aqui UserID porque é o conjunto. Talvez precisemos de informações sobre quem criou essa coluna específica. E depois disso, queremos ter uma referência ao nosso conselho. É aqui que temos um quadro AT. E é o mesmo ID de objeto de tipos de esquema, assim como temos aqui no topo para nosso usuário. E agora aqui, em vez de nosso documento do quadro, queremos criar nosso documento de coluna e estamos estendidos aqui documento e nossa interface de coluna que acabamos de criar. E agora é hora de criar nosso modelo. Então aqui temos o modelo Bohr, agora precisamos de um modelo de coluna. Então, aqui temos uma placa de lágrimas. Agora precisamos criar aqui a coluna Ts. E, na verdade, vou copiar e colar tudo do nosso quadro porque é super parecido. Então, o que temos aqui, estamos construindo aqui um esquema de coluna, e aqui estamos usando o documento do quadro NADH, mas em vez disso o documento de coluna que acabamos de criar aqui, o documento do quadro na parte superior podemos remover. Aqui, sabemos que temos nosso título, temos nosso uso 3D, é obrigatório. E o último aqui será o ID do nosso quadro, que é um ID de objeto de tipo, e também é obrigatório, e é nosso modelo de documento de coluna de tipo e o nome é coluna. E aqui temos nosso esquema de colunas. Então, como você pode ver, é muito parecido com o nosso quadro. E, na verdade, muitos modelos que você criará em seus aplicativos futuros serão realmente parecidos com isso. Então, criamos com sucesso nosso tipo e nosso modelo. Agora, precisamos gerar e usar dentro de nossos níveis de serviço. E aqui eu quero copiar e colar esta linha com um Id de placa de placas Pi. E aqui temos um get exatamente nesta rota colunas de barra porque, como eu disse, queremos obter nossas colunas para este ponto específico. E aqui devemos usar nosso middleware porque essa solicitação é apenas para usuários conectados. E aqui não precisamos usar o controlador da nossa placa, queremos um novo controlador aqui, controlador de colunas, e aqui podemos nomeá-lo, por exemplo, obter colunas, mas não temos controlador de colunas alto. Então aqui eu quero copiar o controlador da placa de colagem aqui na parte superior e apenas nomeá-lo controlador de duas colunas De controladores de barra colunas de barra. E nosso último passo aqui será criar um novo controlador, que é chamado de colunas. E isso é controlador para gerenciar todas as nossas ações para as colunas. Então, aqui estamos criando nossas colunas pontos ts. E aqui eu quero apenas copiar e colar um método de nossas placas porque é super semelhante e são boas placas. Então, vamos pular de volta para dentro das escadas de nossas colunas e colar esse método aqui. Primeiro de tudo, não é ficar entediado, mas obter colunas. E precisamos aqui são expressas interface de solicitação porque queremos verificar o usuário atual. E aqui precisamos da nossa próxima função. E também devemos contribuir aqui sobre a resposta do expresso. E aqui, como sempre, estamos verificando o CurrentUser. Estamos jogando por 01 se não estiver lá. Mas agora aqui devemos usar modelo não entediado, mas em vez disso coluna o modelo. Então, vamos inserir aqui o modelo de coluna superior a partir do qual acabamos de criar. E aqui estamos escrevendo modelos de barra coluna de barra. E agora estamos esperando para fazer uma solicitação para encontrar o modelo de coluna. Mas em vez de encontrar nossas colunas, aqui obteremos uma matriz por ID de usuário. Queremos encontrá-los pelo nosso conselho AD. Nesse caso, obteremos colunas de azar para esse quadro específico. E obtemos essas informações do ponto de solicitação, ponto de parâmetros, e aqui temos o ID da placa. Então, de volta aqui, estamos obtendo uma matriz de nossas colunas e simplesmente queremos responder ao cliente com essa matriz. E, na verdade, terminamos. Vamos verificar se está funcionando. Estou pulando para o back-end. Não há erros. Então agora eu quero fazer uma solicitação get, e aqui eu tenho nossa API, mas em vez de slash api slash boards, eu quero ter aqui slash e depois NAD. É por isso que do nosso aplicativo, eu quero copiar o d do nosso quadro para colar aqui dentro do carteiro. Estamos fazendo uma solicitação GET e vamos clicar em Enviar. Como você pode ver, onde eu recebo uma mensagem onde não autorizado, o que significa antes de tudo, eu devo fazer o login. Este é meu usuário, estou logado e aqui estou recebendo um token. Vamos copiar e colar essa perseguição e tentar mais uma vez. Aqui está uma solicitação GET para um ponto sem base. Aqui está o AD e eles perderam aqui as colunas de barra. Esta é uma solicitação get, e aqui está nosso cabeçalho. Isso é cerveja. E então vou colocar meu token que estou pressionando agora enviar e estamos recebendo nossa resposta, que é uma matriz vazia. E, na verdade, está completamente correto porque não criamos nenhuma coluna dentro do nosso banco de dados. Mas para torná-lo seguro e limpo, vamos criá-los a partir do console para que possamos verificar se está realmente funcionando para deficientes, pule dentro do console e tente docker exec menos 18 MongoDB, Mongo , assim como fizemos anteriormente para o nosso conselho. Agora, aqui devemos usar nosso banco de dados L Trello. Trailer tão útil e agora quero inserir um registro dentro de nossa coleção de colunas. É por isso que aqui podemos escrever colunas de pontos db, inserir pontos, e aqui dentro queremos lançar primeiro no título, por exemplo, primeira coluna. Portanto, aqui devemos fornecer um ID de usuário, e aqui devemos escrever a data é um objeto com alguma string dentro que devemos retirar da solicitação. E por último aqui estará nosso quadro AT, e também é um ID de objeto e dentro da string. Então aborreça o D. Nós já sabemos, podemos apenas pegá-lo aqui do carteiro e eles vão colocá-lo aqui. Mas nosso usuário AT, podemos verificar dentro do nosso back-end. Como você pode ver aqui, ainda tenho esse log do console com nosso usuário. E aqui está o D do meu usuário com o qual estou preso. Aqui dentro do nosso ID de usuário, vou colar o hash do meu usuário. Vamos apertar Enter. E como você pode ver onde inserir um. Agora podemos verificar se está correto. Então db dot columns, dot find e apenas colchetes redondos. E como você pode ver, aqui está nossa resposta. Então, vamos verificar agora no Postman, se estiver funcionando, estou clicando aqui enviar novamente, e estamos entrando na matriz, um único objeto. Aqui está nosso ID de usuário e título do AD Boyd AD, o que na verdade significa que criamos com sucesso nosso modelo de coluna e a primeira solicitação para obter todas as colunas para esse vínculo específico. 32. Crie coluna com websockets: No vídeo anterior, criamos com sucesso um método para obter uma lista de nossas colunas para o quadro. Neste vídeo, vamos nos concentrar na parte de back-end da criação de nossa coluna. E não faremos isso da maneira típica, porque não usaremos aqui o HTTP. Vamos criá-lo com socket por precisamos criar colunas com socket? Porque, na verdade, esse é o caso em que Woburn notifica todas as outras pessoas que estão olhando em nosso quadro atual sobre a criação da nova coluna. Nesse caso, todos os usuários com essa única placa aberta verão diretamente nossa parte nucleada. Então, como devemos fazer isso? E estamos começando aqui dentro de um servidor de origem. Na verdade, eles já sabiam como estamos fazendo as coisas. Temos aqui sua própria conexão e aqui está nossa tomada. Aqui devemos refletir em sua tomada. Por que isso? Porque, na verdade, vamos acionar, criar uma coluna suficiente em um dos clientes, que na verdade significa aplicativo interno ou angular. No próximo vídeo, criaremos um pod de frontend com o formulário para criar uma coluna. E então emitiremos um evento para nosso soquete IO. É por isso que aqui devemos assinar isso em meio a. Nosso primeiro passo será criar aqui um novo evento. E, na verdade, aqui eu quero criar três eventos enquanto isso, porque temos uma operação assíncrona, começamos a criar uma coluna, então temos sucesso e fracasso. E eles disseram que não podemos realmente obter erros do soquete IO. É por isso que faz muito sentido organizar todos os nossos eventos como sucesso e fracasso do Start. E no caso de entrar no conselho, não precisamos disso. Só precisamos de um único evento porque, essencialmente, isso não está em uma operação síncrona com não temos sucesso aqui, mas temos isso com criar outra coluna. Este é o caminho aqui, Vamos chamá-lo de grau de colunas. E isso é uma string, e podemos chamá-la de colunas dois pontos, e então criar isso. Você pode ver que estou usando a mesma notação como aqui no topo, temos uma entidade e é plural, e então nosso verbo, o que estamos fazendo agora aqui podemos copiar e colar esta linha duas vezes porque devemos criar aqui, colunas criam sucesso e colunas criam falha. Aqui à direita, teremos colunas que criem sucesso com o CamelCase e aqui a coluna crie falha. Portanto, nossos eventos estão prontos e agora podemos abrir nossos níveis de servidor. E aqui queremos escrever mais um soquete. Então, aqui nós queremos reagir agora que os eventos de soquete neles não. E aqui temos a nota das colunas, e há um segundo parâmetro com o qual estamos obtendo alguns dados, nem me importo com os dados. Agora, aqui dentro, queremos usar nosso controle de colunas e também somos os criados, mas não tínhamos nenhuma informação de soquete dentro. É aqui que queremos criar um novo método chamado Create column. E estamos passando por dentro exatamente o mesmo que fizemos aqui dentro do live board, por exemplo, é um seu soquete coma dados comuns, neste caso, em todos os lugares onde escrever o código e todos os parâmetros em da mesma forma. É por isso que é mais fácil entender nossa aplicação. Agora, é hora de criar essa seção dentro do controlador. É aqui que vamos voltar para dentro das colunas dos nossos controladores. Aqui temos colunas. E, na verdade, vamos escrever aqui do zero nosso novo método. Então aqui temos nossa constante e é criar coluna. E esta é uma função assíncrona e dentro de onde obter exatamente todas as coisas como obtivemos anteriormente. Então, antes de tudo, é um fio e é soro. Em segundo lugar, temos aqui nosso soquete, o soquete e o último são os dados. Então, a questão é quais dados obteremos para criar uma coluna? E precisamos de duas coisas. Primeiro de tudo e nome da coluna. E em segundo lugar, nosso ID do conselho. Essa é a informação que já escrevemos dentro do nosso modelo. É por isso que aqui temos o corpo D e é uma corda. E em segundo lugar, temos aqui o título. Também é uma corda. E só para lembrá-lo no momento em que vocês são nossas duas entradas aqui, soquete, você deve saber como inseri-lo a partir de tipos interface de soquete, não do soquete IO, porque devemos use uma propriedade de usuário dentro dessa interface. E agora dentro temos try-catch, como sempre, porque estamos fazendo aqui uma operação assíncrona e dentro da gaiola, o que queremos fazer com não temos acesso ao próximo, mas podemos emitir ouvir algo que você, por exemplo, aqui eu quero escrever socket Datta meet e nós somos jogados dentro de nossos eventos de soquete E e M ponto, e aqui está a falha, então as colunas criam falha. E em segundo lugar, aqui eu quero dar uma mensagem de volta. Mas o principal problema é que essa Sarah é desconhecida e isso é completamente normal porque estamos presos, não podemos saber o que é Sarah. É por isso que, se precisarmos ler uma mensagem do erro, devemos tentar algo assim. Então, aqui queremos ler nossa mensagem de erro e podemos verificar se nossa flecha deve ser um exemplo de uma época. Nesse caso, podemos ler aqui a mensagem de erro. E outro caso em que simplesmente queremos stringificar nosso erro aqui como o segundo parâmetro, podemos fornecer uma visão de nossa mensagem de erro, que será uma string. Nesse caso, este é o melhor pai possível e, digamos, o TypeScript. Você pode trabalhar com erro desconhecido dentro do catch. Mas aqui está o problema. Escreveremos essa única linha em cada ação quando estivermos recebendo um erro e quisermos ler uma mensagem e a usaremos dentro de cada imagem dentro do catch. É por isso que eu quero mover esse código para ajudá-la. E ainda não temos nossos ajudantes. É por isso que a fonte de insights. Vamos criar ajudantes ponto ds e apoiar esse método dentro. Aqui eu posso criar um novo método que é obter mensagem de erro. E estamos chegando aqui nosso erro e é desconhecido. Então isso é exatamente o que estamos recebendo em catch butt back. Queremos pegar uma corda. Agora, posso copiar e colar esta linha completamente e colá-la aqui. Não preciso aqui de uma mensagem constante. Podemos simplesmente retornar essa única linha. Como você pode ver, é assim que parece. Estamos chegando aqui erro desconhecido, onde instância de erro de frango e mensagem de erro bem escrita ou era de string. E agora, aqui dentro das escadas da nossa coluna, podemos importar esse método. É por isso que aqui podemos desestruturar, receber mensagem de erro e é de nossos ajudantes. E agora aqui, em vez dessa linha, podemos escrever aqui, obter mensagem de erro e fomos fornecidos dentro de nossa era. E agora esse ajudante é super utilizável rapidamente. Agora precisamos escrever nosso código dentro da tribo. Então, primeiro de tudo, devemos verificar se burlington ou não. Estamos fazendo isso apenas para o TypeScript porque eles realmente estavam bloqueados aqui por causa das IOUs e nosso middleware interno que construímos anteriormente. Mas aqui devemos verificar se put não tem um usuário de ponto de soquete. E só para lembrá-lo dessa interface de soquete deve ser nossa interface e não de íon de soquete. Aqui dentro, podemos emitir exatamente as mesmas coisas. Então aqui está o soquete e a carne e foram fornecidos dentro de um soquete. As colunas ENM de eventos criam falha. Aqui dentro, podemos simplesmente escrever a string que o usuário não está autorizado. Então, o que esta linha está fazendo, estamos emitindo uma mensagem para o nosso soquete, o que na verdade significa que temos um cliente e esse cliente envia uma mensagem, por favor, crie uma coluna. E então, aqui dentro da gaiola, aqui dentro do CIF emitirá apenas para um único cliente que nos enviar uma mensagem, esta mensagem de volta. E esse cliente pode ouvir essa mensagem e fazer algo de acordo. E depois de nos encontrarmos, podemos simplesmente ligar aqui de volta sem querer fazer nada. Mas se tivermos um usuário de soquete, podemos criar nossa coluna. Então, aqui vamos tentar que temos uma nova coluna e, para criá-la, devemos usar um novo modelo de coluna. Na verdade, mundo do modelo de coluna com o invertido aqui no topo. Então, podemos usá-lo aqui. Então, para criar uma coluna, o modelo, devemos fornecer uma visão, antes de tudo, um título e é um título de ponto de dados. Em segundo lugar, queremos fornecer aqui ID da placa e é theta dot board AT. Esta é toda a informação do nosso evento. E por último, mas não menos importante, é o nosso ID de usuário. É inflamação do socket dot user dot ID. Então, aqui criamos com sucesso um novo número de coluna, devemos salvá-lo no banco de dados. Aqui é você. Vamos voltar nossa coluna salva porque queremos chegar aqui NAD também. E estamos aguardando nossa nova coluna que foi criada ponto save. Estamos esperando para salvá-lo no banco de dados. E depois disso, queremos enviar essas informações não apenas para o nosso soquete. Queremos notificar todas as pessoas, todos os nossos clientes que estão inscritos em nosso conselho. O que realmente significa que estamos enviando esta mensagem, não apenas vector socket, estamos enviando essa mensagem para muitas pessoas. E podemos escrever esse código com socket aqui assim. Portanto, não é o soquete ponto dois e k dentro, estamos fornecendo o ponto de ponto de dados AD. E só para lembrá-lo aqui antes de placas internas onde escrevemos código de junção com John Boyd, escrevemos aqui, junção de soquete, dados, ID de porta. Aqui. Agora temos uma sala com um d da nossa prancha. E agora aqui podemos encontrar alguns dados para todos os usuários que estão dentro desta sala com o I2. Aqui está nossa placa de dados AT ponto m meet e foram fornecidos dentro de nossos eventos de soquete ENM, e neste caso, será um sucesso. Esta coluna cria sucesso. Aqui também queremos fornecer todas as informações da nossa coluna salva. E, na verdade, é o mesmo que usar HTTP, mas essas informações serão propagadas para todos os nossos usuários simultaneamente se eles estiverem inscritos nesse quadro específico. Agora, aqui, sem nenhuma lógica de cliente difícil, quero testar se está funcionando. Este é o y aqui, por exemplo, depois do nosso i2, eu quero escrever uma coluna salva no log do console para que possamos verificar se estamos vindo para cá. Agora, depois disso, eu quero pular dentro nossos clientes fonte, aplicativo, placa , componentes, placa HTML aqui, eu só quero testar para criar um botão foi clicado. Então, clicaremos no botão e aqui temos uma função de teste. Agora, quando clicarmos no botão, quero conhecer este evento. É assim que aqui temos nossa função de teste e, por dentro, quero escrever este ponto de serviço de soquete e carne e foram fornecidos dentro do nosso evento. E no nosso caso são colunas criadas e há um segundo parâmetro que devemos fornecer aqui um objeto com pour the tea, que será esse ID de placa. E em segundo lugar, o título, por exemplo, para esta única linha, deve dizer ao nosso back-end que queremos criar essa coluna específica para essa parte. Agora podemos pular para o back-end e verificar se está funcionando. Como você pode ver, não temos nenhum erro na API. Agora vamos abrir um navegador e recarregar a página. E estamos aqui em nossa página de quadro único. Aqui tem um botão. E, na verdade, esqueci de escrever o texto dentro do botão. Então, vamos escrever aqui teste para que possamos pelo menos ver um botão e clicar no botão uma vez. Agora vamos pular para dentro, acenou. E, na verdade, aqui estamos recebendo a coluna da última mensagem salva, o que significa que nosso back-end recebeu nossa solicitação. E isso está acontecendo em nossos níveis de serviço com esse código em que estamos inscritos na nota da coluna. E então do lado onde Colin, nosso controlador de colunas cria coluna e dentro dessa função, em primeiro lugar, estamos verificando se estamos presos. Depois disso, estamos gerando uma nova coluna com esses dados que obtivemos do evento. Em seguida, salvamos esta coluna e enviamos a mensagem a todos os nossos usuários que estão inscritos neste ponto. Vamos testar esse código profundamente no próximo vídeo. Mas, como você pode ver, aqui está minha coluna salva bloqueada constante. E isso é exatamente o que estamos vendo aqui dentro do log do console, o que na verdade significa que implementamos com sucesso nosso trabalho entre o soquete no cliente e o soquete no back-end. E em relação à criação de nossas colunas. 33. Conseguir colunas: No vídeo anterior, preparamos com sucesso o substantivo backend, criamos um fora da nossa coluna. Mas antes de implementarmos o formulário embutido para criar uma coluna no cliente, devemos pelo menos criar nossa página de quadros porque, por enquanto, ela está completamente vazia e também renderiza nossas colunas. É por isso que a primeira coisa que quero fazer é criar em nosso cliente a interface para o cone, porque ainda não a temos. É por isso que devemos defender conjuntos, fontes e tipos compartilhados de aplicativos. E aqui devemos criar interface de coluna Ts. E vamos conhecer aqui nossa nova interface, que é uma interface de coluna. E por dentro, em primeiro lugar, estamos recebendo NAD, que é uma corda. Em segundo lugar, no título, que é uma string. E por último criei, que é uma string. E, na verdade, também estamos recebendo aqui a cabeça atualizada, que também é uma string. Nosso próximo passo é criar um serviço com o método para obter todas as colunas para esse quadro específico. E, na verdade, aqui não temos esse serviço. Temos apenas o serviço Boards, que é um serviço sem estado apenas com métodos como obter placas, ficar entediado, criar placa e assim por diante. Devemos fazer exatamente o mesmo. Mas para colunas, é por isso que aqui eu quero criar colunas, pontos de serviço. E como você pode ver onde no AP compartilhado e não no quadro. Agora aqui, em primeiro lugar, o traço de biomassa injetável e segundo loop um para exportar nossa classe, que será nosso serviço de colunas. Agora, por dentro, devemos apresentá-lo ao cliente, pois faremos solicitações para obter uma lista de nossas colunas. Este é o caminho aqui. Em primeiro lugar, devemos escrever um construtor. E aqui temos um HTTP, que é um cliente HTTP. Isso é suficiente. Nobu deve criar o método get columns, que nos entregará na forma de colunas do back-end e no back-end já criamos esse método. É aqui que aqui, em primeiro lugar, devemos obter aqui um ID do conselho. Este é um identificador exclusivo para obter uma lista de colunas para esse quadro específico. E de volta estamos recebendo uma matriz de nossas colunas, obviamente como observável, porque é sempre do HTTP onde obter observáveis, é aqui que observável da interface da coluna e não se esqueça que é um matriz. Agora, aqui dentro, estamos fazendo exatamente o mesmo que fizemos a bordo. Então, se você não quiser redigitar tudo, você pode simplesmente copiar e colar, por exemplo, ficar entediado e pronto. O código é muito parecido. Então, aqui, em primeiro lugar, queremos criar um URL, e aqui queremos mesclar antes de tudo, nossa barra de URL da API do DOD do ambiente. Aqui temos nossas placas slash n. Aqui queremos injetar colunas de barra de ID da placa. E depois disso, só precisamos fazer uma solicitação HTTP GET. É por isso que aqui eu quero retornar este http.get e devemos fornecer isso de volta para obter nosso array de interface de coluna. E aqui dentro, estamos fornecendo nosso URL. E com esse código, obteremos nossas colunas para um quadro específico. E agora é hora de usar o serviço dentro do nosso componente. Mas, para isso, precisamos pular dentro nossa placa de aplicativos, molécula de placa. E a entrada aqui dentro dos provedores está ao seu serviço e será nosso serviço de colunas. Agora, aqui podemos pular para dentro dos componentes, placa, componente da placa e buscar esses dados aqui. Agora, aqui dentro de nossos dados de busca, queremos buscar nossas colunas. Mas para esse construtor interno, devemos injetar esse serviço. E foi o serviço de colunas, que é o serviço de colunas que acabamos de criar. Agora, aqui podemos pular dentro de nossos dados de busca e usar aqui this.com service get columns. Esse é exatamente o método que acabamos de criar. E aqui dentro estamos fornecendo agora, neste momento, já temos essa informação. Mas aqui queremos fazer exatamente o mesmo, mas não queremos salvar essas colunas diretamente aqui no componente. Já criamos nosso serviço de diretoria para isso. Lá dentro, podemos salvar todas essas informações. É por isso que aqui podemos escrever, Assinar e estamos recebendo de volta nossas colunas. E o que queremos fazer com as colunas, precisamos aqui no seu método, este serviço de quadro, DOD, por exemplo, definir colunas. E lá dentro lançaremos nossa lista de colunas. E agora só precisamos implementar essas colunas de conjunto de métodos. É aqui que vamos abrir dentro do Boards Services, nosso serviço de diretoria. E estamos fazendo exatamente o mesmo que fizemos aqui. Dissemos conselho. Então, aqui estão as colunas definidas. Estamos recebendo nossa matriz de colunas, que é uma matriz de interface de coluna. Aqui estamos obtendo um grande vazio e precisamos aqui de um novo fluxo de dados. É aqui que posso copiar, colar nosso fluxo de chefe e chamá-lo de fluxo de coluna. Nesse caso, cada local do nosso aplicativo, se estivermos usando este quadro, pode se inscrever e obter a lista das colunas que temos agora. E, na verdade, isso será um assunto de comportamento da matriz de interface de coluna. E não precisamos fornecer aqui agora porque, por padrão, podemos simplesmente fornecer aqui um array vazio. E agora, dentro do nosso método set columns, podemos simplesmente chamar esse ponto de colunas de ponto a seguir. E estamos fornecendo insights são colunas pré-buscadas. Agora vamos voltar ao nosso componente e eliminar esse fluxo. É por isso que aqui no topo, já temos esse quadro, dólar, que é um fluxo. E agora devemos criar colunas. Dollar, que é uma string para nossas colunas, e é um observável para array de interface de coluna. E agora aqui podemos escrever diretamente após esse ponto, essas colunas de pontos. E aqui estamos usando este ponto de serviço do conselho. E aqui temos nossas colunas. Não precisamos aqui do filtro de tubulação booleano porque isso é simplesmente uma matriz. Está vazio ou mais antigo, o campo com nossas colunas, a ideia principal é que não temos fluxos e podemos usá-los diretamente dentro do HTML. Mas aqui eu quero mostrar uma variante ainda melhor, porque na verdade aqui já temos dois streams depois. Teremos mais uma para tarefas, o que significa que temos três fontes diferentes de dados e queremos renderizar nossa página quando todas as fontes de dados forem preenchidas. É por isso que podemos reescrever esse código de forma um pouco diferente. Podemos escrever aqui esses dados pontuais com mais alto. E esta é uma notação especial que estou usando. Essa é uma variante super popular, como você pode gerenciar seus dados para seu componente. Normalmente, você tem uma página com muitas fontes de dados e deseja combiná-las em um único fluxo. E então você pode executar a página inteira somente quando preencher todos os fluxos. E nós cumpriremos o fluxo com os dados quando estivermos colocando você em seus dados. É aqui que eu quero escrever as últimas combinações e foram fornecidas dentro uma série de streams e festivais. Aqui podemos copiar esta linha com o fluxo de placas e colá-la aqui. E depois disso, pegamos essas colunas de serviço de porta e também as colamos aqui. Obviamente, devemos direto aqui, vírgula, porque esses são dois fluxos diferentes. A ideia principal é que estamos combinando os fluxos. E aqui nós queremos fazer isso com pipe e map, porque na verdade estamos obtendo isso como uma matriz e morrer quer um objeto aqui, este é y. Aqui dentro do mapa, podemos diretamente a estrutura, em primeiro lugar, uma placa e aqui a ordem é importante. Em segundo lugar, temos aqui colunas. E depois disso, queremos retornar os dados em outro formato como um objeto. E aqui estamos voltando primeiro a bordo e em segundo lugar, nossas colunas. Então, o que essa coisa está fazendo por nós. Então, estamos obtendo aqui dados, o que na verdade significa que não precisamos de dois fluxos aqui. Agora podemos criar aqui e usar dados de fluxo. E esses são os dados completos da nossa placa de componentes. Agora estamos dizendo aqui que isso é um observável do objeto. E antes de tudo, temos aqui uma placa, que é uma interface de placa. E em segundo lugar, estamos obtendo aqui nossas colunas, que é uma matriz de interface de coluna. E agora podemos remover o dólar do conselho e o dólar das colunas, não precisamos mais deles. O ponto principal é que nossa lógica era buscar dados e definir esses dados dentro do serviço de palavras permanecendo lá. Isso é apenas uma combinação de dois fluxos para mapear esses dados para o nosso componente. Então, agora a questão é como usaremos esses dados dentro do nosso HTML. É aqui que eu quero remover tudo e, na verdade, também remover aqui o teste na parte inferior. Não precisamos disso de jeito nenhum. Agora eu quero escrever um marcador para nossa página. Em primeiro lugar, aqui queremos renderizar a barra superior do nosso aplicativo. Ele já está lá. Depois disso, vamos comandar o quadro. Então, aqui teremos o div class board, e aqui está um truque que estamos usando aqui na GE, mas estamos fornecendo informações sobre o dólar, esta é a nossa última sincronização combinada como dados, e é isso. A ideia principal é que não estamos mais trabalhando com fluxos internos. Estamos trabalhando com dados como uma propriedade local. E isso criará para nós uma propriedade local dentro dessa div. Agora, aqui, em primeiro lugar, queremos criar nosso contêiner de cabeçalho de quadro. Aqui é onde aqui div class board header container. E vamos fechar essa div. Mas vamos executar o último Insight é um formulário em linha para atualizar nosso conselho. É aqui que eu simplesmente escreverei um vínculo de formulário embutido, para que não nos esqueçamos disso. Depois disso, renderizaremos nosso div com as colunas de classe e dentro eu quero fazer e G for loop para cada coluna. Este é y aqui, coluna de classe e depois G4. E aqui podemos escrever a coluna principal das colunas de pontos de dados. Como você pode ver aqui , não precisa nenhum canal assíncrono porque estamos resolvendo nossa propriedade de dados e estamos recebendo esses dados, e esses dados serão atualizados automaticamente se o fluxo de colunas também é atualizado. Aqui, vamos fechar nossa coluna e, em seguida, queremos renderizar o título da coluna da classe div. Agora, lá dentro, vamos nos divertir mais uma. É aqui que aqui na forma de linha para atualizar a coluna. E depois dessa coluna teremos mais uma em forma de linha. Então, aqui teremos um formulário embutido para criar uma coluna. Então, essa é a nossa marcação básica. Na verdade, não renderizamos muito aqui, mas pelo menos estamos renderizando aqui em colunas, o que estamos obtendo de nossos dados. Vamos verificar se está funcionando. Estou pulando para o console e estamos recebendo um erro. epítopo não está disponível para nós, portanto, devemos importá-lo dentro do nosso módulo de placa. Então, aqui dentro das entradas, podemos simplesmente adicionar o módulo da barra superior. Como você pode ver agora, não tenho nenhum erro, então vamos recarregar a página. Na verdade, ele já está lá. Podemos ver nosso belo bar superior. Aqui estão alguns espaços reservados e na verdade, essas já são nossas colunas. E sim, não tínhamos tendência no título apenas para testes, podemos fazer isso muito rápido. Vamos voltar para dentro do nosso quadro, e aqui estará o título da nossa coluna. Então, em vez do formulário embutido para atualizar a coluna, podemos simplesmente renderizar aqui o título do ponto da coluna. Estou recarregando a página aqui, estamos recebendo a primeira coluna e o formulário. Essas são exatamente essas duas colunas que já foram criadas. Em primeiro lugar, dentro do console do MongoDB. E em segundo lugar, na última palestra em que criamos com o evento, nossa nova coluna. E é altamente recomendável que você use o mais recente combinado para combinar dados como esse em todos os seus aplicativos. Isso é extremamente eficiente e escalável. 34. Criar formulário de coluna: Nos vídeos anteriores, tivemos sucesso nas colunas de ID do evento para nosso quadro e agora podemos continuar com Criar formulário para nossa coluna. E só para lembrá-lo, no back-end, já implementamos toda a lógica para criar uma coluna usando socket a yarn, e agora só precisamos implementá-la no cliente. E antes de tudo, quero começar com um pouco de HTML. E, na verdade, aqui já estamos preparados formulário embutido para criar coluna. É exatamente aqui que queremos usar nossa empresa no interior e já a temos. Só precisamos fornecer informações corretas sobre os dados. Aqui vamos fechar nossa forma interior em vez da mensagem. E agora o que precisamos dar aqui? Em primeiro lugar, devemos definir uma aula. E só para lembrá-lo, esta é uma classe pai com estilos que estamos substituindo para nosso formulário embutido para este caso específico aqui, nossa classe será criar formulário de coluna. Depois disso, queremos definir um texto padrão. Isso é o que veremos por padrão, e é o texto, pelo menos também aqui, devemos renderizar um botão para enviar este formulário. É por isso que aqui podemos escrever que queremos sua propriedade button. E é verdade depois disso, queremos fornecer o texto do nosso botão, e esse texto será pelo menos. Então, aqui queremos alterar nosso espaço reservado padrão. É por isso que aqui podemos escrever o marcador de entrada e aqui podemos escrever adicionar nome da coluna. E por último, mas não menos importante, é claro que aqui lidar com o envio. E este é um retorno de chamada em que obteremos um título da nossa coluna que queremos criar. Então, aqui eu quero adicionar um novo método que é chamado Criar coluna e, em seguida, site onde obter nosso título através do evento. E a última coisa que precisamos fazer, precisamos criar essa função de coluna de notas dentro do nosso quadro. Aqui, obteremos um título como uma cepa do nosso fórum no interior. E aqui está o vazio por dentro e eles querem apenas fazer login no console aqui, criar coluna e ver um título. Vamos recarregar a página e verificar como ela funciona. E, na verdade, aqui estamos recebendo uma mensagem. A forma inline não é um elemento conhecido do nosso módulo. É aqui que devemos voltar para dentro do nosso módulo de placa. E aqui dentro das entradas, queremos inserir nosso módulo de formulário embutido. Como você pode ver no navegador, agora temos um novo botão. Pelo menos podemos clicar nesse botão. E vemos agora nossa entrada que é estilizada e nosso botão pelo menos. E, na verdade, se você está se perguntando de onde todos os estilos estão vindo, Assim como ele disse anteriormente, nós estilizamos todos os elementos de formulário inline com nosso caso pai e dinâmico aqui foi criado formulário de coluna. É aqui que você pode ver os estilos criar formulário de coluna e, em seguida, edição de contêiner de formulário embutido. É por isso que nosso formulário é tão compartilhável. E agora vamos verificar se podemos adicionar uma nova coluna. Aqui estou digitando algo, estou acertando pelo menos. E dentro do console podemos ver nossa coluna de crédito e nosso título da coluna, o que na verdade significa que agora aqui podemos emitir um evento para nosso soquete, para nosso back-end, mas eu realmente quero fazer melhor. Quero especificar nossa opinião. É por isso que aqui, nesses tipos compartilhados, temos quadro e coluna, mas quero criar uma entrada. O que isso significa? Assim como tínhamos dentro de nossos tipos de corujas, tínhamos aqui solicitação de login e solicitação de registro, que é essencialmente um corpo de nossa solicitação. Normalmente, queremos nomeá-lo como request ou talvez você queira uma entrada de palavra. É assim que aqui nos tipos compartilhados, podemos criar nossa entrada de coluna ou você também pode chamá-la de solicitação de coluna. Então, digamos que essa seja a interface de entrada de coluna Ts, e esses são os dados que devemos fornecer para o back-end para enviar nosso evento. E aqui queremos especificá-lo dentro de uma interface. Então, em todo o aplicativo, saberemos como criamos sua coluna. Este é o caminho aqui, vamos chamá-lo Interface de entrada de coluna e as principais diferenças, não é calmamente interface, é entrada. É por isso que é um corpo. E aqui temos nosso título, que é uma string. Isso é o que devemos fornecer para o nosso back-end. E em segundo lugar, um ID de placa, que também é string. E agora podemos usar essa interface de entrada dentro do nosso componente de placa. Então aqui, em vez do log do console, podemos criar nossa entrada de coluna e sabemos que o tipo está aqui, entrada de coluna e aqui agora devemos fornecer todos os valores possíveis. No nosso caso, é apenas título. E em segundo lugar, conselho, AD e corpo. Temos dentro desse ID de porta de ponto? E como você pode ver aqui, temos um tipo correto, e agora devemos jogá-lo dentro do nosso soquete IO. Este é o caminho aqui, esta coluna de criação de ponto de serviço de coluna. E, na verdade, aqui não temos o método create column. É por isso que devemos criá-lo. Quero entrar em nossas colunas de serviços compartilhados. E aqui acabamos de obter a coluna. Aqui queremos criar cone. Mas esse método não fará nada com esse GTP. Ele usará nosso soquete IO, e isso é completamente normal, enquanto que no final, todos esses métodos dentro nossos serviços e simplesmente chamamos nossos serviços. Este é o caminho aqui, vamos criar o método create column e estamos recebendo aqui nossa entrada de coluna. É muito bom ter criado uma interface aqui. É aqui que podemos reutilizá-lo e será nossa interface de entrada de coluna e, de volta, seremos anulados. E só para lembrá-lo aqui com HTTP, sempre receba de volta um observável. Mas na camada de soquete, não funcionará assim. Com o soquete, você tem um único fluxo de dados. É aqui que aqui a única coisa que queremos fazer é acionar nossa emissão. Mas para isso, precisamos injetar aqui nosso serviço de soquete, e este é o nosso serviço de soquete que criamos e agora podemos usá-lo dentro desse método. Então este ponto, serviço de soquete ponto e encontro, e devemos fornecer aqui um nome. Então, vamos verificar primeiro, se temos esse nome dentro de nossos tipos compartilhados, temos eventos de soquete e aqui não temos nada. E, na verdade, podemos abrir dentro do back-end esse enum porque tipos internos , mas também têm eventos de soquete. E aqui temos a coluna de criação, sucesso e fracasso, e é exatamente a mesma coisa. É por isso que vou copiar e colar completamente. E agora podemos usá-lo aqui em vez do nome do evento, podemos escrever aqui eventos de soquete ENM não terminam aqui. Queremos acionar a nota da coluna e salvá-la como um parâmetro. Queremos dar nossa entrada na coluna. Isso nos dá mais um benefício escrever nosso código com socket dentro do serviço. Isolamos esse código dentro de um serviço. É por isso que nosso componente não sabe que estamos usando aqui a camada de soquete, por exemplo, simplesmente chamamos aqui coluna de grau de ponto de serviço de coluna, e recebemos dentro de nossa entrada de coluna. Vamos verificar se está funcionando aqui, podemos tentar criar uma nova coluna. Estou apertando Adicionar. E agora, dentro do nosso chamado, podemos ver a coluna salva. E depois de recarregar a página, você pode ver aqui o cone criado, o que significa essencialmente que está funcionando, mas não atualizamos nossa página em tempo real. E, obviamente, queremos atualizar esta página, primeiro lugar para o nosso usuário atual, segundo lugar para todos os outros usuários também. Mas, para isso, precisamos melhorar nosso serviço de soquete. Por que isso? Porque, na verdade, o que precisamos fazer internamente, devemos nos inscrever de uma forma confortável para o nosso sucesso. E só para lembrá-lo, dentro do nosso back-end aqui dentro das colunas do controlador, temos um encontro e, na verdade esses são os seus dois, emitiremos esta mensagem para todos os usuários inscritos. para esta sala específica. É por isso que o que precisamos fazer. Queremos nos inscrever neste evento específico, que será o sucesso da criação de coluna, mas queremos fazê-lo de forma ineficiente. E então disse camada de soquete, não é eficiente. Queremos fazer isso de forma angular. É por isso que devemos abrir dentro do nosso serviço compartilhado, serviço de soquete. E aqui eu quero criar depois de conhecer mais um método e é chamado Listen here. Em primeiro lugar, quero escrever isso lá dentro. E se você não sabe como usar genéricos, a ideia principal aqui é que podemos fornecer qualquer tipo de dados para bond inside listen, e será o que obteremos do soquete IO. Então, aqui estamos fornecendo t e aqui o nome do evento será string. E de volta eu quero ser observável de t. E essa é essencialmente a ideia. Este método nos devolverá um observável. Não é confortável trabalhar com Socket Layer dentro do angular. É por isso que queremos convertê-lo em observável aqui. Em primeiro lugar, é bom verificar se temos soquete IO ou não. É por isso que posso copiar essa condição if aqui, porque se não tivermos soquete e você estiver conectado, não devemos fazer nada. Depois disso. Quero devolver um novo observável. E aqui dentro, devemos fornecer uma função. E aqui temos apenas um único argumento que é um assinante. E agora, por dentro, podemos secá-lo. Soquete ligado. Este é apenas um código simples de íon de soquete. Aqui temos nosso nome de evento, o que significa que estamos assinando no cliente esse nome de evento que passamos como parâmetro. Aqui está nosso segundo parâmetro: estamos obtendo alguns dados e o que queremos fazer, queremos emitir nosso ponto de assinante ao lado dos dados. Então, o que esse código está fazendo? Em primeiro lugar, aqui devemos tentar isso e isso, você pode ver que estamos recebendo um erro. O objeto é possivelmente indefinido. E, na verdade, esse é um problema de TypeScript porque aqui ele não consegue entender que esse código com Eve cobre isso indefinido. O que podemos fazer em vez disso, podemos escrever aqui con socket é igual ao socket. E depois disso, estamos cobrindo esse soquete aqui. E então, em vez deste circuito onde usando apenas soquete e, neste caso quando não obtê-lo no teorema do TypeScript. Então, qual é a ideia dessa função? Vamos usá-lo assim. Então aqui está escute. Em seguida, estamos fornecendo algum tipo de dados, por exemplo, uma string. E depois disso aqui retire e evento, por exemplo, criação de coluna ou coluna cria sucesso. No nosso caso, essa única linha, nos devolverá um observável. É por isso que depois disso podemos escrever, por exemplo, assinar e aqui, e obteremos aqui nossos dados. Você verá como usaremos essa função em um segundo. A ideia principal é que essa função seja rápida e observável. Assinaremos com Socket Layer para esse nome de evento específico. E quando esse evento for acionado, simplesmente atualizaremos nosso observável. Essa é uma maneira angular muito confortável fazer as coisas com o Socket Layer. Agora vamos tentar usar essa função. Quero voltar atrás e dizer que nosso componente de placa, e aqui temos nossos ouvintes inicializados. E aqui está um lugar muito bom para ouvir os eventos. É por isso que aqui eu quero escrever esta lição de ponto de serviço de soquete de ponto. E aqui devemos fornecer o tipo porque é obrigatório. E aqui não forneceremos isso. Estamos recuperando nossa interface de coluna. Isso é o que estamos obtendo após a criação da coluna. E aqui está o nome do nosso evento e queremos nos inscrever aqui no Socrative termina em uma coluna de pontos cria sucesso porque estamos esperando pelo sucesso. E aqui, depois disso, podemos escrever, basta se inscrever e estamos recebendo aqui uma coluna. E aqui podemos apenas registrar essa coluna no console. Então, mais uma vez, o que essa linha está fazendo, ela cria para nós um novo observável e podemos simplesmente usá-lo como um observável. Mais importante ainda, dentro de onde está certo e encaixe. Então, estamos aguardando nossa emissão. Vamos verificar agora se está funcionando aqui, quero criar uma nova coluna e estou acertando pelo menos. E Viola, como você pode ver dentro do console, estamos recebendo nossa coluna. E, na verdade, esse é esse código com o evento de sucesso. E aqui estamos obtendo exatamente nossa coluna que foi salva no banco de dados porque, como você pode ver, aqui está um 80% de nossa coluna salva. E agora podemos fazer algo no cliente para atualizar o loop é muito ambulatorial nossa diretoria, mas não é alto como você pode ver aqui. Eu abri a mesma guia para o mesmo usuário. Mas a diferença é que o soquete aqui é diferente porque toda vez que estamos abrindo uma nova guia, mas estabelecendo uma nova conexão com outro íon de soquete. É por isso que, quando aqui, tentaremos adicionar uma lista. E eu estou apenas batendo aqui, pelo menos estamos chegando aqui esta coluna log do console. Mas, na verdade, aqui também obtemos essa coluna log do console porque essas são duas guias separadas, são dois usuários separados, o que na verdade significa que se dois clientes diferentes serão conectados e abrir este quadro, eles receberão simultaneamente nosso evento sobre a criação de uma nova coluna. E essa é essencialmente a funcionalidade principal que queremos alcançar dentro do íon de soquete. Agora devemos de alguma forma mudar uma lista de nossas colunas. E, na verdade, esse é o caminho aqui. Quero escrever este serviço de quadros de pontos e ter cuidado aqui, não é ruim, não é nosso serviço apátrida com funções, mas nosso serviço de conselho para o cliente. Aqui, devemos criar um novo método chamado Add Column. E podemos simplesmente jogar dentro de nossa coluna, o que significa essencialmente que nosso componente não sabe nada sobre lógica de negócios, como trabalhar com colunas em nosso serviço de conselho sabe disso. É por isso que aqui devemos entrar em nosso serviço de diretoria e podemos criar aqui uma nova função chamada coluna ABC. E aqui estamos entrando em sua coluna de tipo, interface de coluna e vice-versa, estamos sendo anulados porque não nos importamos com o retorno. Só precisamos atualizar nosso stream. E só para lembrá-lo aqui no topo, temos um fluxo de nossas colunas. E agora aqui precisamos atualizar isso de alguma forma. É por isso que o que podemos escrever aqui queremos, antes de tudo, atualizar nossas colunas. Aqui é y. Vamos criar aqui as colunas atualizadas da propriedade. Aqui precisamos antes de tudo, espalhar o que temos agora. E esse é o fluxo da coluna. E aqui temos uma função getValue, e ela apenas lerá o valor do nosso fluxo que temos atualmente. E no final, devemos escrever em sua coluna. Portanto, esse será nosso novo array de colunas atualizado. Como você pode ver, o tipo está correto. Esta é uma matriz de coluna e interface, e agora podemos atualizá-la com essas colunas a seguir. E aqui estamos lançando colunas atualizadas do site. Então, simplesmente criamos em seu array e vamos escrevê-lo dentro do nosso stream. Vamos verificar se está funcionando. Estou recarregando a página. Aqui no final, temos pelo menos o botão e, na verdade parece meio quebrado porque está com o zoom reduzido. Agora, vamos criar uma nova coluna. Estou acessando a lista de edição. E como você pode ver diretamente aqui, vemos nossa nova coluna, que na verdade significa que esse código atualiza nosso fluxo e , em seguida, nosso componente é inscrito no fluxo aqui no topo com isso combinadas mais recentes, essas colunas estão sendo atualizadas. E, em seguida, reenviaremos esse componente automaticamente. Mais uma vez, como tudo isso está funcionando? Em primeiro lugar, estamos chegando aqui nossa empresa no interior. E essa empresa do interior produz para nós apenas o título. Depois disso, criaremos esse objeto com título e Boyd AD e o lançaremos dentro do nosso serviço de coluna. Aqui está nossa coluna de crédito. Aqui estamos conhecendo nosso evento e estamos lançando dentro de nossos dados depois esse back-end recebe esse evento cria para nós a coluna e os meios para todos os usuários nesta sala, neste quadro, a mensagem que criamos com sucesso nossa coluna. E depois disso, cada cliente é inscrito com esse código desde o início até esta coluna. Grande sucesso. E quando isso acontece, estamos chegando aqui, nossa coluna de crédito, e somos dois pontos aqui, mas serviço para adicionar uma coluna. E isso basicamente atualizará um fluxo com as colunas. E nosso componente será finalizado em todos os nossos clientes. 35. Criar uma tarefa básica: No vídeo anterior, terminamos com sucesso a criação de nossas colunas. Neste vídeo, estamos começando a trabalhar em tarefas. E, na verdade, devemos implementar a parte de back-end da criação das tarefas e obter uma lista de tarefas para o nosso conselho. E, na verdade , acho que é uma boa possibilidade para você tentar implementá-lo sozinho. Porque na verdade você já fez pequenas fissuras dentro deste projeto. E agora você está pronto para fazer algo maior. E, na verdade, obter uma lista de tarefas e criar uma tarefa é muito semelhante às nossas colunas, o que significa que você pode usar toda a lógica a partir daí. Então, o que você precisa fazer se quiser implementá-lo sozinho? Em primeiro lugar, aqui estamos falando sobre acenou. Portanto, devemos criar uma nova interface para nossa tarefa, em seguida, o método do controlador de modelo para obter essas tarefas para os meninos e método insert controlá-lo para criar uma tarefa. A questão é: quais campos precisamos dentro da nossa tarefa? E, na verdade, aqui, eu só quero escrever quais campos precisamos. Em primeiro lugar, é um título da descrição da nossa tarefa que não é obrigatório. Ele pode estar vazio e, em seguida, usar 3D para sabermos quem criou esse ID de coluna de tarefa. Portanto, sabemos em qual coluna do nosso conselho devemos cuidar dessa tarefa e da AT adicional a bordo. Nesse caso, será mais fácil para nós obter todas as nossas tarefas por ID específico do conselho. No back-end, você precisa de uma interface e um modelo e, em seguida, registre-se em sua API para obter essas tarefas dentro do quadro. E o método para obter essa lista de tarefas por quadro caído. Além disso, você deve criar um novo método create também dentro do nosso controlador. E será um método com socket yacht porque queremos notificar todos os nossos usuários que estão inscritos neste conselho específico sobre essa nova tarefa. E se você quiser continuar sozinho, basta pausar o vídeo agora e experimentá-lo. Mas se você quiser apenas acompanhar, vamos fazer isso juntos. E há tudo isso dito. Será muito parecido com nossas colunas. É por isso que vou copiar e colar muito. Primeiro de tudo, aqui, eu quero entrar nossos tipos de fonte de servidor. E aqui teremos nosso teste de interface de coluna. E, na verdade, podemos copiar e colar totalmente e criar nossa interface Task Ts. Aqui dentro dos campos musculosos, exatamente como o plano. Em primeiro lugar, temos nosso título criado em atualizá-lo. Nós sempre, aqui está nosso ID de usuário e placa AT isso é totalmente bom. Mas também precisamos aqui para criar uma coluna lady. Neste caso, quando não, sempre que dominar essa tarefa específica. E também precisamos aqui de uma descrição, mas não é obrigatória. É por isso que coloquei aqui um ponto de interrogação. Portanto, nossa interface está ótima. Agora vamos mudar o documento que precisamos criar aqui documento de tarefas, que está estendendo o documento e nossa tarefa que criamos. E como você pode ver aqui, esqueci de renomear nossa coluna para a tarefa. Agora vamos pular e criar nosso modelo. Aqui dentro dos modelos já havia coluna. Também copiarei, colarei tudo e colocarei em nosso novo arquivo, que é o ponto ds da tarefa. Aqui devemos mudar tudo. Festival Aqui temos outro esquema de coluna, mas esquema de tarefas. E aqui não o documento da coluna, mas o nosso documento de tarefa que acabamos de criar aqui no topo, posso remover com segurança o documento da coluna. Aqui temos nosso título. É obrigatório. Isso é totalmente bom. Depois disso, vou colar o título novamente e renomeá-lo para descrição, mas é opcional. É aqui que o requerido não é necessário aqui. Também temos aqui nosso ID de usuário, ID de placa e aqui quero colocar um novo ID de coluna. E isso também é necessário com certeza. E type é o ID do objeto. Está parecendo totalmente bom. Agora, na parte inferior, devemos fornecer aqui nosso documento de tarefa. E aqui está uma tarefa, que é um esquema de tarefas. Nosso modelo está totalmente pronto. Agora precisamos criar uma nova API dentro do nosso servidor. Aqui é y. Vamos voltar para as camadas do servidor de origem do serviço. Aqui temos nossas chamadas de API. E, na verdade, nossa nova chamada de API será muito semelhante a esse código. Aqui estamos obtendo colunas por ID de placa específica. Na verdade, queremos obter todas as nossas tarefas para uma porta específica. É por isso que vou copiar, colar esta linha, colar aqui e renomear. Serão tábuas slushy pie slash. Board é um parâmetro dinâmico, e aqui temos nossas tarefas e aqui também precisaremos de nosso middleware. E aqui precisamos de um novo controlador, que será controlador de tarefas, porque por dentro queremos gerenciar nossas tarefas. E aqui o método receberá tarefas, e esse método deve retornar todas as tarefas para esse quadro específico. Agora é hora de criar um controlador. É por isso que eu vou pular e disse controladores. E eu quero copiar e colar todas as colunas do arquivo só porque é mais fácil alterar e será super parecido. Então, eu estou colando aqui e renomeando duas tarefas, ponto ds. Aqui dentro temos dois métodos, criar coluna e obter coluna. E, na verdade, aqui podemos simplesmente renomear as colunas get para obter tarefas. E aqui estamos deixando tudo como está, solicitando resposta. Em seguida, está tudo bem. Frango para o usuário está bem aqui. Reagendar, tudo é incrível. Agora, aqui não precisamos usar o modelo de coluna, mas, em vez disso, precisamos usar aqui o modelo de tarefas. É aqui que aqui no topo vou inserir o modelo de tarefa. Da tarefa de modelos. Agora, aqui podemos mudar nosso modelo de coluna para o modelo de tarefa. Aqui estamos encontrando por borda diferentes parâmetros de solicitação, ID da placa, e isso é exatamente o que precisamos e é por isso que temos corpo dentro do nosso esquema. Nesse caso, com apenas uma única linha de trabalho encontrando todas as nossas tarefas para esse quadro específico. Então, de volta, estamos recebendo nossa lista de tarefas, e aqui podemos simplesmente enviá-las de volta para nossa API. E com isso, nossa ação para obter a lista de tarefas está totalmente pronta. Agora vamos alterar diretamente essa coluna de criação. E como você pode ver aqui, estamos falando de E/S de soquete, e também será muito semelhante. Em primeiro lugar, temos aqui uma tarefa de criação de método aqui onde obter seu soquete e dados. Então, o que precisamos para obter dados internos? Em primeiro lugar, estamos ficando entediados ou ED, porque devemos notificar todos os usuários dentro desse quadro específico. Isso é totalmente bom. Agora temos aqui a string de título, e a última aqui é o id da coluna. E o id da coluna também é string e deveres obrigatórios. E você pode dizer aqui que não fornecemos uma descrição interna. Seu total está certo em criar, recontar, alterar descrição, descrição que podemos fornecer somente dentro da Atualização. É por isso que está tudo bem. Então, o que estamos fazendo aqui dentro, primeiro queremos ter uma falha para criar nossas tarefas. Mas, para isso, precisamos primeiro atualizar nossos eventos de soquete. É por isso que vou pular nesses tipos de fonte. E aqui temos nossos eventos de soquete, e aqui já temos a nota das colunas e eles querem copiar e colar todas as três ações. Aqui podemos renomeá-lo de colunas para tarefas criadas, e aqui estão as tarefas criadas , depois Tarefas, grande sucesso e tarefas criam, falhando nossos eventos de soquete estão prontos. Podemos voltar para dentro de nossas tarefas e mudar aqui eventos de soquete nelas para tarefas pontuais criar mais pálidas e eles não mudarão diretamente aqui nossa captura, e aqui podemos apenas fornecer tarefas de ponto criar falha. Agora vamos atualizar uma parte interna aqui não temos modelo de coluna, mas modelo de tarefa, já estamos inseridos. Aqui, estamos recebendo títulos a partir dos dados. Isso é bom. ID do conselho. E aqui o usuário do soquete está pronto. Tudo isso é totalmente bom, mas também devemos fornecer aqui alcalinidade da coluna de pontos de dados pode ser. E depois disso aqui estamos salvando não uma nova coluna, mas uma nova tarefa. Aqui. Vamos renomeá-lo para nova tarefa. E aqui podemos simplesmente chamar a nova tarefa dot save e estamos recebendo de volta a tarefa salva. Agora, com essa linha, queremos notificar todos os nossos usuários de que criamos uma nova tarefa. É assim que estamos emitindo esse evento e fazer essas tarefas gera sucesso. E aqui queremos fornecer de volta a tarefa de salvamento. E aqui podemos remover esse log do console. Não precisamos mais disso e criamos totalmente nosso método Create Task. E a última coisa que devemos fazer, devemos nos inscrever para começar a criar a tarefa a partir do cliente. É por isso que devemos pular de volta para dentro da nossa irmandade S. E aqui no fundo temos o soquete ligado. Na verdade, podemos copiar e colar colunas Criar e apenas alterá-lo para o nosso soquete, até mesmo as tarefas de pontos da CNN criam. E aqui estamos obtendo nossos dados e simplesmente precisamos chamar nossa coluna de criação de controlador de tarefas. E aqui você não será criado coluna, mas criar tarefa. E como você pode ver aqui com não importou nossas tarefas controlando. É por isso que no topo, eu quero copiar colar colunas controlador e renomeá-lo para o nosso novo arquivo, que é controlador de tarefas. A partir das tarefas dos controladores, parece que implementamos tudo. Agora vamos pular para dentro do console. Como você pode ver, não temos nenhum erro ao conectar-se ao MongoDB. Api está ouvindo. É por isso que, na verdade, eu só quero copiar e colar o quadro , eu abro o Postman aqui e tentar obter nossa lista de tarefas. Portanto, é slash sports do que colar este ID tarefas de barra e eles escondidos aqui enviar. E como você pode ver de volta, estou recebendo uma matriz vazia, o que é totalmente bom porque ainda não criamos nenhuma tarefa, o que significa que nosso back-end está totalmente preparado. E agora podemos começar com a implementação do lado do cliente. 36. Conseguir tarefas: No vídeo anterior, concluímos com sucesso a preparação nossos modelos de tarefas e a obtenção de tarefas no back-end. Neste vídeo, devemos fazer exatamente o mesmo com o cliente. E eu recomendo que você também faça isso sozinho , porque você já tem muito conhecimento. O que você precisa fazer se quiser fazer isso sozinho? Em primeiro lugar, você precisa pular e disse que fonte dos clientes, aplicativo compartilhado. E aqui temos nossos tipos, temos aqui Boyd e coluna, e agora devemos criar uma nova interface para nossa tarefa. Depois disso, devemos criar um novo serviço para trabalhar com tarefas, sejam elas quadros, colunas. Agora, precisamos de um novo servidor chamado serviço de tarefas. Aqui, o boop receberá as tarefas exatamente da mesma maneira, como se estivéssemos obtendo aqui colunas para o nosso quadro, mas não é tudo. Você também deve atualizar molécula do conselho interno em tais serviços, testes de serviço do conselho. Porque aqui estamos falando sobre stream para board e stream para colunas. Além disso, devemos criar aqui stream para nossas tarefas e, adicionalmente, funcionar que atualizará o stream. E depois disso, você deve simplesmente buscar dados aqui dentro deste último combinado. E é isso. Se você implementar esse ponto por conta própria, você é incrível. Mas se você quiser implementá-lo em conjunto, vamos fazer isso agora. Então, primeiro de tudo, eu vou pular em tais fontes de clientes, aplicativos, tipos compartilhados. E aqui eu quero criar um novo tipo para nossos Task interface Ts. E devemos ter exatamente as mesmas propriedades que tínhamos em nosso back-end. É por isso que aqui podemos exportar nossa nova interface e é a interface Task, o interior. Em primeiro lugar, temos nosso ID, que é uma string. Depois disso, temos nosso título, que é uma string. Também teremos aqui uma descrição, mas não é obrigatória. É por isso que aqui está o ponto de interrogação. Também é uma corda. Também precisamos aqui da nossa coluna eles D, que é a referência para a coluna específica, nosso pai. E precisamos aqui do nosso ID do conselho, e também é uma string. E, na verdade, estamos chegando aqui usura t, que também é uma corda. Portanto, nossa interface de tarefas está completamente pronta. Agora podemos voltar aos serviços compartilhados e criar aqui em seu serviço. E, na verdade, o que eu quero fazer, eu quero copiar e colar o serviço de colunas só porque será super semelhante. Vamos renomear o serviço de colunas para Tarefas, serviço Ts e Como você pode ver aqui é o serviço de tarefas MenuService. O que queremos fazer aqui, queremos mudar o nome. Então aqui temos tarefas, serviço onde o construtor vivo como é, devemos usar aqui http e mais recente. Serviço tão bom. E aqui está um método não obter colunas, mas obter tarefas. E aqui queremos obter nossas tarefas por quadro AT, porque estamos buscando apenas uma vez todas as nossas tarefas para um quadro específico. E aqui estamos obtendo Becker observável do array de interface Task. E aqui está nossa URL. São tarefas de barra de identificação de barra de barra de barra. Aqui está o HTTP GET não cirurgia de interface de coluna , mas matriz de interface de tarefa. Por enquanto, quero remover completamente a coluna de crédito porque não implementaremos a tarefa de criação neste vídeo. É por isso que posso remover essas três entradas na parte superior. Não precisamos deles por enquanto. Agora é hora de atualizar nosso serviço de diretoria. É por isso que vou adicionar serviços do conselho, serviço do conselho. E aqui devemos criar uma nova string. Vou copiar e colar aqui o fluxo da coluna e alterá-lo para o fluxo de tarefas. E este é um comportamento sujeito da matriz da interface Task. E, por padrão, aqui temos uma matriz vazia, que é totalmente rápida. Agora, aqui temos um método, enviar quadros em colunas. Devemos criar um novo método que é chamado de tarefas definidas. E aqui está uma discussão. Estamos recebendo nossas tarefas e é uma matriz, então é uma matriz de interface de tarefas. E agora aqui dentro do nosso fluxo, tarefas com dólar, queremos definir nossas novas tarefas para que estejamos quase terminando. Agora a biomassa salta para dentro do nosso componente, placa, componente da placa. E aqui está o nosso mais recente combinado. E só para lembrá-lo, aqui nos dados, estamos combinando todos os nossos fluxos para buscar dados para o conselho. Isso é o que devemos fazer aqui. Agora, devemos adicionar aqui este serviço de placa, e aqui está em uso tarefas de fluxo. E agora dentro do mapa como o terceiro argumento, devemos tentar tarefas e queremos devolvê-las aqui. Nesse caso, aqui dentro do nosso dólar de dados, teremos não apenas quadros e colunas, mas também tarefas. E se você fez tudo aqui sozinho, você é realmente incrível e está fazendo um bom progresso. E agora a única coisa que devemos fazer aqui, devemos renderizá-los dentro do HTML. Então, vamos abrir o HTML dos componentes da nossa placa. E o que temos aqui é nossa coluna para loop. E por dentro temos um título e não temos mais nada. E depois desse título, queremos renderizar mais um. E aqui precisamos. E, e G for loop para nossas tarefas dentro da coluna. E, na verdade, não podemos fazer isso porque temos apenas esse fluxo para nossas tarefas dentro dos dados, mas não temos tarefas para essa coluna específica e precisamos filtrar esses dados de alguma forma. É por isso que aqui eu quero escrever em G4 e ele será conduzido tarefa de, e aqui eu quero criar uma nova função. Por exemplo, obtenha tarefas por coluna. E, em seguida, devemos fornecer primeiro o id da coluna e, em segundo lugar, todas as nossas tarefas, são tarefas de ponto de dados. E só para lembrá-lo aqui dentro do fluxo de dados, onde entramos em nossas colunas e tarefas do quadro. Este é o caminho aqui dentro dessa função como argumento, podemos simplesmente lançar tarefas de ponto de dados, muitas vezes G4, devemos também aqui uma classe, será tarefa. E aqui dentro, queremos renderizar o título do ponto da tarefa. E agora só precisamos criar essas tarefas infantis por função de coluna. Este é o meu aqui dentro do arquivo OTS. Eu vou criar essa função aqui. Nós, em primeiro lugar, eu recebo o ID da coluna, que é a nossa string. E em segundo lugar, tarefas, e é uma matriz de interface de tarefas. E aqui, de volta, estamos recebendo nosso array de interface de tarefas. Por que isso? Porque, essencialmente, queremos simplesmente obter nosso array com todas as tarefas e filtrar por essa coluna específica. Este é o caminho aqui, o array de interface de tarefas é totalmente bom. E o que queremos fazer por dentro, queremos filtrar nossas tarefas que eram de Deus, é por isso que o filtro de tarefas terá acesso a cada tarefa. E aqui podemos verificar o ponto dois-pontos da tarefa é igual ao nome da nossa coluna que fornecemos como argumento, o que na verdade significa que somos colin para cada coluna que estamos renderizando, essa função obtém tarefas por coluna e renderizaremos aqui em energia para fazer um loop de nossas tarefas. Vamos verificar o som. Temos algum erro? Sim, temos tarefas de propriedade que não existem nas colunas do quadro de tipos, o que significa essencialmente que não atualizamos nossa propriedade de dados. E como você pode ver aqui no topo, estamos definindo que dentro do nosso observável, acabamos de comprar e colunas. Mas aqui também temos nossas tarefas, que é uma matriz de interface de tarefas. Agora, aqui não temos nenhum erro dentro do nosso servidor web e podemos pular para a página e ver todas as nossas colunas, mas não vemos nenhuma tarefa dentro do motivo pelo qual isso está acontecendo, porque na verdade não chamamos nossa busca. E, na verdade, aqui dentro do nosso construtor, devemos injetar nosso serviço de tarefas que acabamos de criar. E é o nosso serviço de tarefas que é compartilhado. E agora devemos entrar em nossos dados de busca, assim como fizemos aqui. Podemos copiar, colar nosso serviço de colunas e renomeá-lo para nosso serviço de tarefas. E aqui não haverá colunas, mas obter tarefas e o interior vale a pena jogar nosso ID do quadro, que é essa parte AD e vice-versa, não estamos recebendo colunas, mas tarefas. E aqui queremos chamar esse serviço de placa não definir colunas, mas definir tarefas. E por dentro estamos jogando em tarefas que buscamos. É por isso que, com esse código, atualizamos nosso fluxo e o fluxo obterá novos dados dentro do nosso HTML. Vamos verificar isso. Vou recarregar a página e estamos recebendo um erro. Como você pode ver agora, estamos em slash boards. E quando estou pulando para a primeira parte, estamos recebendo um erro que não fornecemos para o serviço de tarefas porque, na verdade, sim, devemos injetá-lo dentro do módulo da placa. É aqui que, dentro dos provedores, devemos adicionar adicionalmente nosso serviço de tarefas. Vamos recarregar a página e, como você pode ver agora, não temos nenhum erro. E aqui dentro da rede, devemos ter uma solicitação para nossas tarefas. E aqui está um pedido slushy pie slash boards slash ID slash tasks. E aqui está a prévia com não tem nenhuma tarefa, o que é totalmente bom. Ainda não os criamos, mas obviamente queremos verificar se nosso código está funcionando. É por isso que o que eu quero fazer dentro do console. Quero abrir nosso Mongo, assim como fizemos anteriormente. Agora, eu preciso selecionar nosso banco de dados para usarmos L trailer. E aqui podemos verificar o que temos. Por exemplo, aqui agora podemos escrever painéis de pontos db, dot find. E com isso, veremos todas as placas que temos. Só temos uma única placa. E da mesma forma, podemos escrever db dot, columns, dot find e onde eu entro em nossas colunas. E o que queremos fazer agora, queremos inserir em sua tarefa dentro de uma dessas colunas. É por isso que aqui podemos escrever db dot e temos tarefas dot, insert e dentro estamos lançando um objeto. Então, a primeira pergunta, o que precisamos para fornecer uma visão? E para isso, podemos verificar nossa interface de tarefas. Então, primeiro de tudo, id será gerado externamente, devemos fornecer um título. Então aqui está o título. Por exemplo, minha primeira tarefa após essa promessa fornece uma descrição. Então, digamos que a descrição seja minha descrição. E depois disso, devemos fornecer a coluna carente. E, na verdade, aqui no topo, eu já vejo colunas. É aqui que eu posso simplesmente pegar um AD ou FirstColumn e eles vão jogá-lo aqui. Então será o ID da coluna. E aqui está esse anúncio. E depois disso, eu também devo fornecer um quadro AD Aqui. Também teremos um anúncio de quadro aqui na parte superior e podemos aceitá-lo. E por último, mas não menos importante, é um usuário AT e realmente usa 3D. Eu não vejo aqui no topo, mas eu posso pegar do back-end. E como você pode ver aqui dentro do nosso back-end, ainda temos um log do console com e-mail do nosso ID de usuário e objeto. É por isso que vou copiar e colar a ideia de como um usuário e escrevê-la aqui. Portanto, use re d é igual a esse ID de objeto. Estou apertando Enter, e aqui está nosso primeiro disco. Vamos criar mais uma, por exemplo, minha segunda tarefa, e aqui está minha descrição. Estou apertando Enter e estamos recebendo mais uma tarefa. Agora vamos recarregar a página e o navegador. Como você pode ver aqui, voila, nós temos nossas duas tarefas. Então, como está funcionando aqui é a nossa rede e temos uma solicitação com tarefas de PS para nosso back-end. E aqui estamos filtrando todas as tarefas por esse ID específico do quadro. E então, dentro do nosso código, dentro do nosso quadro, temos esse código que escrevemos para filtrar nossos dados. Então aqui temos uma função get tasks by column onde dentro de onde filtrar todas as nossas tarefas por essa coluna específica AD. É aqui que estamos renderizando apenas tarefas relacionadas a esta coluna, que na verdade significa que implementamos com sucesso no front-end, obtendo nossas tarefas e renderizando eles dentro do nosso componente. 37. Criar formulário de tarefa: Neste vídeo, podemos finalmente implementar ou formar um interior para criar uma nova tarefa. E, na verdade, já estamos preparados tudo o que precisamos no back-end. Só precisamos implementá-lo no cliente. Então, vamos começar com nosso fórum. Isso é pelo que eles querem fazer. Eu quero começar, definir o HTML do nosso componente do quadro. Aqui, há uma diferença para renderizar na tarefa? E depois disso, no final, queremos renderizar nosso formulário embutido. Vamos tendência aqui componente de formulário inline. E vamos fechar aqui. E agora, por dentro, quando deve fornecer alguns valores. Em primeiro lugar, é a aula. Esta é a nossa classe de padrões que substitui todos os estilos e é Criar Formulário de Tarefa. Depois disso, também devemos fornecer o texto padrão. Será adicionar um cartão, mas também terá um botão aqui. Portanto, o botão aqui deve ser verdadeiro e devemos fornecer um texto. É aqui que aqui estará o texto do botão e ele está no momento. Também queremos fornecer aqui nosso espaço reservado de entrada e inserir um título para este atual e por último, mas não menos importante, é o nosso método de envio de identificador que devemos criar. Vamos dar um nome, criar tarefas, assim como fizemos com nossa coluna e o insight que queremos antes de tudo dar a qualquer evento. Este será o título da tarefa criativa, mas também precisaremos aqui de nossa coluna, porque nosso back-end deve saber em qual coluna estamos criando essa tarefa. E se você quiser perguntar por que recebemos aqui apenas colunas e não Boyd AD. Temos uma placa 3D dentro desse componente interno. É por isso que não precisamos fazer isso. Agora, vamos criar esse método. Vou pular para a nossa prancha e, na verdade, devemos fazer exatamente o mesmo. O que fizemos foi criar uma coluna. Mas aqui está uma pergunta. Temos aqui a interface de entrada da coluna. É assim que parece e agora precisamos criar nossa interface de entrada de tarefas. Então, todas as nossas coisas são escritas da mesma maneira e isso é evitado que devemos enviar para criar uma tarefa. É aqui que podemos chamá-lo também de interface de entrada de tarefa Ts e o que queremos escrever dentro? Essa é a nossa interface, que é uma interface de entrada de tarefas. E o interior, em primeiro lugar, boom deve fornecer um título. É obrigatório e é uma string. Segundo loop, estamos fornecendo aqui nosso ID de coluna, que também é uma string. E por último, mas não menos importante, é o nosso AD fervido, e também é uma corda. E agora temos uma boa contribuição e podemos voltar para o nosso quadro. E agora eu quero copiar e colar esta coluna de criação porque ela será exatamente a mesma, mas para a tarefa. Então, aqui precisamos renomeá-lo para criar uma tarefa. Aqui estamos obtendo não apenas o título, mas também o ID da coluna porque o fornecemos a partir do nosso HTML. E agora aqui podemos alterar o nome da da coluna para a entrada da tarefa. E nossa interface aqui será a interface de entrada de tarefas que acabamos de criar. E como você pode ver onde estou perdendo aqui, nosso ID de coluna. É aqui que devemos adicioná-lo a partir do argumento. E aqui não precisamos chamar um serviço de cone. Devemos coagir nosso serviço de tarefas. E só para lembrá-lo de que este é nosso serviço sem estado, onde estamos escrevendo nossa solicitação HTTP e nosso soquete IO. E esse método deve ser chamado de create task, e estamos lançando dentro de nossa entrada de tarefas. Mas esse método ainda não existe. Devemos criá-lo. É por isso que vamos voltar atrás e dizer que são serviços compartilhados de aplicativos de origem, e aqui está nosso serviço de tarefas. Mas o que eles querem fazer, eu quero copiar e colar o método create column, porque na verdade isso será exatamente o mesmo. Eu copio a coluna de criação colada e eles querem colá-la aqui dentro do serviço de tarefas. Mas esse método será chamado de criar tarefa. E estamos recebendo como argumento nossa entrada de tarefa e bem escrita, sabemos que tipo será a interface de entrada da tarefa. Aqui também queremos chamar um soquete IO porque ele está funcionando da mesma maneira. Temos uma operação assíncrona e iniciamos o sucesso e o fracasso. Então começamos a criar uma tarefa, notificaremos com o nosso back-end. Em seguida, Bacon cria uma tarefa de faceta e, em seguida, o back-end notifica todas as pessoas que estão inscritas em nosso conselho sobre a nova tarefa. É aqui que, na verdade, devemos atualizar nossos eventos de soquete neles. Quero abri-lo aqui à direita e, além disso, abrir o enum dentro de um servidor porque já escrevemos dentro de nossos eventos. Esses três novos eventos, tarefas, criam sucesso e fracasso. E agora podemos colá-los aqui para usar no cliente. Depois disso, podemos voltar ao nosso serviço de tarefas e alterar o nome aqui. E serão criadas tarefas do Departamento de Defesa. E há um parâmetro aqui. Recebemos uma entrada de tarefa, o que na verdade significa que depois de preencher nosso formulário interno aqui, enviaremos nosso soquete, sua imagem para nosso back-end e nosso bacon já está preparado para criar nossa tarefa e o sucesso da carne de volta para todos os nossos usuários. Vamos verificar isso. É realmente assim que podemos pular em nossos controladores de origem de servidor, e aqui está nosso controlador de tarefas. E como você pode ver, nós temos aqui criar método de tarefa, e aqui estamos criando uma nova tarefa e, em seguida, notificando com esta linha todos os nossos clientes, o que na verdade significa que devemos apenas assinar esses mudanças dentro do nosso cliente. É aqui que eu estou pulando de volta para dentro de nossos componentes de placa ts. E só para lembrá-lo, aqui temos nossos ouvintes de inicialização e aqui temos um ouvinte para que nossa coluna crie sucesso. Agora, fazemos exatamente o mesmo para nossa tarefa, grande sucesso. Então, aqui teremos nossa interface de tarefas, e aqui o tipo será DOD. As tarefas geram sucesso. E o que essa interface de tarefas está fazendo dessa maneira, estamos recuperando a interface de tarefas porque é genérica. E agora especificamos ou k, Esta lição nos devolveu nossa interface de tarefas. É aqui que devemos criar um novo método na tarefa dentro da palavra serviço. E estamos fornecendo aqui nossa tarefa que obtivemos do back-end. E a última coisa que queremos fazer é adicionar esse método ao nosso serviço. Vamos abrir nosso serviço de diretoria. E aqui temos na coluna. E como todos vocês fizeram o stent, eu quero copiar e colar e fazer exatamente o mesmo. Aqui temos um método de tarefa e estamos chegando aqui quando você cria uma tarefa, e é uma interface de tarefas. Aqui, precisamos fazer uma série de tarefas atualizadas. Então, aqui estamos obtendo isso do que não fluxo de colunas, mas fluxo de tarefas, então obtemos valor. E aqui no final, queremos escrever nossa nova tarefa. E depois disso, devemos atualizar nossa cepa novamente. Aqui está o fluxo de tarefas e aqui estão as tarefas atualizadas. E com esse código, atualizaremos nosso fluxo com sucesso e todos os nossos componentes inscritos nesse fluxo serão encerrados automaticamente. Vamos verificar se está funcionando. Não temos nenhum erro aqui. E agora eu quero abrir duas guias aqui. E eles querem que os dois clientes entrem no mesmo quadro. E, como você pode ver, aqui está o nosso log do console. E eles querem experimentar o corte aqui. Então, aqui está nosso formulário embutido e vamos chamá-lo, criou um recurso de tarefa. Agora estou pressionando Enter e, como você pode ver diretamente aqui nesta guia, esse elemento aparece. Então, como está funcionando, na verdade, preenchemos nossa empresa no interior. Enviamos nossa imagem para o back-end. Back-end, entendi, criou uma nova tarefa e notificou todas as pessoas, todos os nossos clientes que estão inscritos neste conselho sobre essa mudança. E com essa escuta, atualizamos sobre a recusa de nossa gama de tarefas e esse componente foi finalizado. A parte mais interessante aqui é outra guia e outro usuário, este é outro cliente com outro soquete AD. E como você pode ver aqui, também temos nosso recurso Criar tarefa porque agora todos os nossos clientes estão sincronizados. E você pode dizer, tudo bem, mas seu destino, você precisa apenas de um único navegador. Realmente não importa. É apenas uma conexão de soquete diferente para o seu servidor. Se você tiver apenas dois computadores e seu projeto for implantado na produção, ele funcionará exatamente da mesma maneira. Por exemplo, aqui eu posso simplesmente criar uma nova tarefa. Por exemplo, foo, eu estou batendo aqui no cartão e, em seguida, obtendo exatamente a mesma informação sem Pedro lote em outra guia, o que realmente significa que nosso recurso estava criando tarefas é completamente acabado. 38. Atualizar o nome do cartão: Neste vídeo, implementaremos mais um recurso ausente e é uma forma de atualização do nome do nosso conselho. E como você pode ver aqui, temos um quadro de formulário embutido de espaço reservado, e aqui devemos usar nosso formulário interno. E, na verdade, este é o nosso primeiro vídeo que, juntos, implementaremos todo o backend e cliente em apenas um único vídeo. E, na verdade, toda a lógica será exatamente a mesma que já fizemos anteriormente, porque construímos uma arquitetura agradável e agora podemos criar facilmente novos recursos. Então, do que se trata esse recurso, teremos aqui e depois a minha empresa e estamos obtendo dela um título. Mais importante ainda, em primeiro lugar, devemos colocar nosso título do conselho em assinar este formulário sobre nosso sucesso de atualização, mas não queremos usar o GTP aqui. Uau, quero usar Socket IO por isso, porque todos os nossos clientes devem ser notificados se o pronto-socorro, neste ponto, mudamos o nome da placa. É aqui que o soquete ou sua carne, como sempre. E então, em nosso backend, precisamos pegar esse evento e atualizar nosso nome. E, na verdade, podemos criar um método para atualizar todo o quadro, mas vamos atualizar por enquanto no título da camada. Então, vamos tentar fazer isso agora. Para isso, quero entrar no nosso código e começar. Primeiro de tudo foi o nosso servidor. E para este evento de boom de registro de massa e soquete de uso aqui dentro de nosso Socrativo e xenônio. E já temos aqui pranchas, cadeias de folhas e portos e, na verdade, colocamos o desejo exatamente da mesma forma que fizemos com as colunas. E aqui temos colunas criadas, por exemplo, e elas querem copiar e colar todas as três. Porque, na verdade, aqui, por exemplo, depois que os painéis estiverem no ar, queremos escrever quadros e aqui haverá atualização. É aqui que podemos alterá-lo diretamente para atualizações das placas de atualização da placa sucesso das atualizações das placas de atualização da placa e falha na atualização das placas. E agora aqui à direita, devemos fazer exatamente o mesmo. Aqui estarão os quadros e as atualizações. Após o sucesso da atualização desta placa e a falha na atualização das placas. Portanto, nosso evento de soquete foi criado com sucesso e agora devemos registrá-lo dentro de nosso soquete IO. Isso é por vamos voltar para dentro ou um serviço, sim. E aqui na parte inferior temos nossa tomada. Aqui devemos registrar e usar socket ton. Para isso, podemos simplesmente copiar, colar, por exemplo, criar tarefas e escrever aqui, não criar, mas reagir na atualização de quadros de pontos que acabamos de criar. Então, estamos aguardando a atualização dos painéis de eventos do nosso cliente. E aqui não queremos usar o controlador de tarefas, mas o controlador da placa aqui não cria tarefa, mas placa de atualização. E, na verdade, por dentro, estamos passando ou seus dados de soquete, assim como fizemos anteriormente. Agora, vamos criar esse método de atualização do quadro para esses pagamentos entrem em nossas placas de controle. E aqui já temos esse método create board, mas isso não é o que queremos porque esse método é com um sapato TP. É por isso que, na verdade, queremos algo como quadro ao vivo, por exemplo. É por isso que vou copiar e colar esse método porque todas as opções serão semelhantes e podemos nomear esse método de atualização de placa. E sabemos que aqui estamos obtendo nossa tomada IR e depois nossos dados. E a questão é quais dados precisamos para atualizar um conselho certeza precisamos saber no título do conselho que queríamos fornecer. E em segundo lugar, a ideia do conselho que queremos atualizar. É aqui que nosso corpo está totalmente bem. E, na verdade, aqui eu não quero escrever um título, eu quero escrever campos. E aqui vamos passar a string do título. Por que temos essa notação? Neste caso aqui, podemos facilmente adicionar um novo campo que queremos atualizar dentro do nosso quadro. Por exemplo, se mais tarde tivermos uma descrição, podemos simplesmente jogá-la aqui, mas por enquanto temos apenas um título. Agora, aqui podemos remover esse log do console, não precisamos dele e também folha de soquete. Então, a questão é o que vamos escrever aqui? Em primeiro lugar, devemos escrever aqui try-catch só porque podemos obter um erro. Este é o caminho aqui, vamos criar, tentar pegar. E aqui estamos entrando, pegando um erro. E se tivermos um erro, só queremos escrever socket and meat. E aqui estão nossos eventos de soquete em um ponto. E já criamos nossa falha de atualização de placas. E o que queremos fornecer insights é nossa mensagem de erro get. E só para lembrá-lo, este é o nosso ajudante que transformará uma flecha. Esse é o meu interior. Podemos simplesmente fornecer nosso erro desconhecido. Agora vamos criar nossa tribo. Então Festival aqui queremos verificar se um usuário válido, este é y. Vamos verificar se não temos um usuário ponto de soquete e, em seguida, seguir em frente para emitir exatamente o mesmo erro. Então, aqui vamos tentar o soquete, os eventos do soquete, a falha de atualização das placas ENM. E aqui, em vez de receber mensagem de erro, podemos simplesmente escrever que o usuário não está autorizado. Além disso, não devemos esquecer aqui de escrever um retorno. Nesse caso, vamos parar de fazer qualquer coisa. Porque depois disso, se quisermos escrever nossa lógica, isso é atualização do quadro. E, na verdade, é extremamente fácil, mas devemos tornar esse método síncrono porque queremos usá-lo no Kuwait por dentro. Agora, aqui dentro do que eu quero fazer, eu quero recuperar nosso quadro atualizado. E para atualizar uma placa, devemos usar aqui um peso e acessamos aqui nosso modelo de trabalho. E podemos usar localizar por ID e atualizar. E, na verdade, esse é um método incrível do Mongoose. Neste caso, estamos apenas fornecendo NAT e, no nosso caso, é um ID de placa de ponto de dados. E aqui está nossa atualização. E, na verdade, atualizar é exatamente o que queremos atualizar dentro de nossa entidade. É aqui que podemos apenas experimentar os campos de pontos do quadro e este é um objeto. E o último são as opções. Aqui, eu quero fornecer uma opção para você. Essa opção é muito importante porque, nesse caso, recuperaremos nosso quadro atualizado. Além disso, como você pode ver aqui, eu cometi um erro. Não é um campo de pontos de placa, são campos de pontos de dados. Agora não temos nenhum erro e podemos responder com essa porta. E para isso, podemos simplesmente usar socket and meet. Aqui está o nosso soquete até mesmo os viu. E temos aqui o sucesso. Então, os conselhos atualizam o sucesso Queremos fornecer como o segundo parâmetro são atualizados placa. Nesse caso, todos os nossos clientes serão notificados sobre este evento após este cupom para notificar todos os nossos clientes inscritos neste fórum sobre nossa mudança. É aqui que podemos escrever ir ponto t2, e aqui queremos notificar todos os clientes dentro de nossa sala. É aqui que teremos dados, dot board Id dot e nos encontraremos exatamente como escrevemos anteriormente. E aqui dentro podemos usar nossos eventos de soquete em m ponto. E aqui temos um sucesso na atualização do conselho. E há um segundo parâmetro que queremos escrever aqui, porta atualizada. Nesse caso, os usuários do Oliver serão notificados para que o conselho sido atualizado e eles saberão quais campos precisam alterar. Nossa parte de back-end está completamente pronta. Agora devemos implementar uma parte do cliente. É aqui que vamos voltar para dentro nosso aplicativo de origem do cliente. E aqui eu quero entrar em primeiro lugar no Shared Services, Board service. Por que isso? Porque, na verdade, aqui estamos lançando nossos eventos para o back-end. E, na verdade, antes de escrevermos aqui, assim como o gato GTP e a proposta exigente. Mas no nosso caso agora, devemos emitir um evento de soquete. É por isso que o que queremos criar aqui é a placa de atualização de método. Queremos fornecer aqui. Em primeiro lugar, nosso conselho AD, esta é uma string e, em segundo lugar, campos que queremos atualizar. Como você pode ver, temos parâmetros exatamente como no back-end. Aqui campos é intitulado, que é uma string, e de volta com não precisa obter nada porque simplesmente usamos aqui soquete IO, mas para usá-lo aqui, mas deve injetado dentro do construtor. É aqui que estamos recebendo nosso serviço de soquete, que é nosso serviço de soquete. Agora, dentro da nossa placa de atualização, podemos usar este serviço de soquete de ponto, ponto e carne. E aqui devemos fornecer nosso evento de soquete. Mas aqui está o problema. Ainda não o registramos dentro do nosso cliente. Aqui, não temos essas cordas. É aqui que aqui na parte inferior, eu quero abrir nossos eventos de soquete de servidor neles. E aqui eu quero copiar e colar esses poros, atualizar o sucesso e o fracasso. E agora só queremos colá-los aqui dentro do nosso cliente. Então, agora não dissemos ao nosso cliente as cordas e podemos emiti-las. É por isso que aqui podemos simplesmente escrever eventos de soquete em m ponto e aqui temos uma atualização da placa. Este é o início da nossa atualização em protesto. E o segundo parâmetro aqui segue em frente para fornecer nossa vírgula de ID de placa, nossos campos. Portanto, temos exatamente o mesmo data lake que preparamos em nosso back-end. E agora, de qualquer parte do nosso aplicativo, podemos usar esse serviço de conselho compartilhado. Use esse método de atualização do quadro para enviar uma reunião. Agora é hora de adicionar nosso formulário, que ainda não criamos. É por isso que vamos voltar para dentro do nosso aplicativo. Componentes da placa, placa, componentes da placa HTML. E como você pode ver aqui no topo dentro do contêiner do cabeçalho do quadro, temos esse quadro de formulário embutido de espaço reservado. E exatamente aqui, queremos escrever um formulário embutido para atualizar o título do nosso conselho. Este é o caminho aqui, vamos escrever nosso formulário de traço embutido que queremos usar, e vamos fechá-lo aqui. Agora, em primeiro lugar, o útero interno deve fornecer a classe para obter o estilo correto. E neste caso aqui, será adicionado fórum do conselho. Depois disso, também queremos fornecer nosso texto padrão. E aqui teremos nosso quadro de pontos de dados, título de ponto. Por que isso? Porque, na verdade, só para lembrá-lo aqui no topo, temos nossos dados, dados de uma propriedade local, e dentro temos todas as nossas colunas, todas as nossas tarefas e um quadro. É por isso que aqui temos um acesso direto ao título do painel de dados e queremos renderizá-lo como um texto padrão. Depois disso, também queremos fornecer um título, e esse é o valor para nossa empresa. Aqui também escreveremos o título do quadro de dados e último, mas não menos importante, é tratado enviar. Este é o nosso evento e queremos criar um novo método, por exemplo, atualizar o nome do quadro e evento interno do dólar é uma string para atualizar um quadro. Agora vamos criar esse método. Vou pular no arquivo RTS e em algum lugar na parte inferior podemos adicionar o nome da placa de atualização. E sabemos que aqui estamos recebendo o nome do nosso conselho, que é uma string. E, de volta, queremos obter um vazio porque aqui queremos simplesmente usar nosso serviço. E, na verdade, aqui já temos acesso ao nosso serviço these dot boards. E isso é importante, não entediado, mas as placas pontuam. E aqui temos nosso quadro de atualização aqui dentro. Em primeiro lugar, devemos fornecer o ID do nosso conselho, e este é o AT do quadro de pontos. E em segundo lugar, nossos campos. No nosso caso aqui, temos apenas um título, que é o nome do nosso conselho que recebemos de nossa forma interna. Então, criamos com sucesso um único fluxo. Então, criamos nosso interior a partir daqui, atualizamos o nome do nosso conselho, e foi emitido um evento para nosso back-end. Vamos verificar se essa parte está funcionando. Não tenho nenhum erro no cliente ou no back-end. E agora vamos abrir um navegador. Como você pode ver aqui, temos agora primeira parte e posso clicar aqui para abrir um formulário. E aqui vemos nossa primeira prancha. Eles podem escrever algo aqui e clicar em enter. E, como você pode ver, ele não foi atualizado porque não reagimos às nossas mudanças no back-end. E, na verdade, como você pode ver aqui dentro, não temos nenhum erro e provavelmente nosso título já foi atualizado, mas não notificamos nosso cliente. E, na verdade, podemos verificar isso facilmente. Podemos simplesmente recarregar a página. E como você pode ver agora, estamos recebendo nosso título atualizado, que na verdade significa que toda a lógica já está funcionando e nosso backend atualizou nosso quadro com sucesso. Mas o principal problema é que não notificamos todos os nossos clientes sobre mudanças. Na verdade, sim, fizemos isso no back-end, mas não criamos uma assinatura para esse evento no cliente. Aqui é y. Vamos fazer isso agora. Então, primeiro de tudo, devemos voltar para dentro do nosso componente de placa. E só para lembrá-lo aqui no topo, temos inscrições para diferentes eventos. É por isso que aqui eu quero copiar colar uma assinatura e alterá-la. Então, aqui temos nosso serviço de soquete e estamos ouvindo o evento de atualização de nossa placa, o que na verdade significa que estamos recebendo uma nova placa. É aqui que temos uma interface de placa e aqui temos o evento de soquete C num dot. E aqui estamos ouvindo o sucesso. Aqui temos quadros, atualizações, sucesso. E dentro do nosso Assine agora, estamos recebendo nosso quadro atualizado. Então, o que queremos fazer com isso? Na verdade, gostaria apenas de chamar um método dentro de nosso serviço de placas e ele atualizará nosso fluxo de dados. É por isso que aqui podemos usar o serviço de placa, placa de atualização de pontos e linha de valor. E dentro do nosso quadro atualizado, super sucesso está inscrito no nosso evento. E só precisamos criar essa função de atualização da placa dentro do nosso serviço de placa. Então, vamos entrar no nosso serviço de diretoria. E aqui na parte inferior, podemos criá-lo. Então aqui está o ponto de atualização, e sabemos que estamos recebendo aqui o quadro atualizado, que na verdade é uma interface de placa completa. E aqui vamos nos alargar porque simplesmente queremos atualizar nosso fluxo. Mas aqui temos um problema. Por padrão, nosso conselho agora está aqui. texto datilografado gritará que não podemos trabalhar com ele. Agora, aqui é onde eu quero verificar se temos agora dentro do quadro ou não. Então, aqui eu quero obter um quadro, e isso é, esses conselhos são transmitidos para obter valor. E depois disso, quero verificar se é agora. Então, se não tivermos nossa placa, então eu quero lançar um erro. Então, aqui lançamos um novo erro porque, na verdade, não podemos atualizar a placa se não tivermos uma placa. Aqui, digamos que a placa não seja inicializada depois disso se pudermos trabalhar com parte e na verdade, quisermos apenas atualizar nosso fluxo. Então, este quadro com ponto de dólar a seguir, e aqui eu quero mesclar todo o quadro que temos com o título porque eu quero apenas atualizar no título. Portanto, o título é o nosso título de ponto do quadro atualizado. E você pode dizer, ok, nós poderíamos apenas pegar o objeto inteiro. Sim, estamos bem, mas quero ficar do lado seguro e apenas implementar um recurso que precisamos resolver. Esse código deve atualizar o fluxo com êxito e nosso componente, como está inscrito no stream, será notificado e finalizado. Vamos verificar se está funcionando. Não temos nenhum erro aqui. Vamos recarregar a página e aqui temos o primeiro quadro. Vamos apenas mudar seu título e clicar em Enter. E como você pode ver, aqui estão diretamente minhas mudanças. Agora vamos duplicar essa guia e tentar novamente. Então, aqui na segunda guia, vou tentar sintonizar e pressionar Enter. E como você pode ver aqui na primeira guia, ele também foi atualizado, o que significa que implementamos com sucesso um recurso de atualização do título de um quadro do início ao fim. 39. Excluir placa: Neste vídeo, implementaremos a exclusão do ponto. E, na verdade, esse recurso será super semelhante ao nosso recurso anterior com a atualização suficiente da nossa placa, este é y. Vamos implementá-lo muito rápido como sempre. Coloque um para começar com nosso servidor. Aqui é y. Vamos pular para dentro da fonte do servidor. E aqui estamos interessados em nossos eventos de soquete. E, na verdade, exatamente como essa atualização, precisamos de três novos eventos para exclusão. Aqui é você, vamos criar três novos eventos. É port delete boards para seu sucesso e fracasso. E vamos mudar à direita, nossa string two boards delete. Em seguida, os painéis excluem o sucesso e os painéis excluem Agora vamos nos inscrever nosso evento para este salto bônus dentro do nosso servidor. E aqui podemos copiar, colar o sucesso do nosso conselho e alterá-lo para nossos quadros. Excluir. Aqui queremos usar um novo método, não atualizar a placa, mas excluir a porta. Agora vamos pular para o nosso controlador e criar esse método dentro do controlador da nossa placa. E, na verdade, para isso, eu quero copiar totalmente e colar nosso método de atualização porque uma exclusão será super semelhante. Então, primeiro de tudo, vamos mudar o nome. É delete board e é um método assíncrono. Agora, dentro de nossos dados, a única coisa que precisamos não é um d do nosso conselho. Aqui é onde eu comprei o D é suficiente aqui, mas não preciso fornecer mais nada porque simplesmente excluímos nossa placa por d. E para back-end, é informação suficiente. Agora, aqui dentro, temos try-catch como sempre, e estamos verificando nosso usuário de soquete. Mas aqui, em caso de erro, queremos lançar outro erro e será falha de exclusão de placas. Aqui. Vamos também mudar nossa gaiola. Também será falha na exclusão das placas do DOD. E agora precisamos mudar nosso modelo lógico sussurrado, porque aqui fizemos uma atualização. Agora temos a movimentação do Azure e na verdade, não queremos receber nada de volta, mas simplesmente queremos remover essa ligação por d. E, para isso, podemos usar métodos diferentes. Por exemplo, podemos usar find one e delete. Isso é totalmente bom. Isso é exatamente como fizemos na atualização interna. Mas, na verdade, você também pode usar diretamente sem açúcar, exclua um. E este é um método apenas para você saber dentro de delete one, devemos fornecer um objeto com campos pelos quais queremos encontrar o sensível. E, na verdade, aqui podemos apenas fornecer id de sublinhado igual a e d Agora, no caso de ser AD de quadro de pontos de dados, e na verdade não importa se você está usando delete one ou find até o final delete, está funcionando exatamente o mesmo. Portanto, essa linha remove com sucesso nosso quadro. E depois disso, queremos emitir nosso sucesso de remover. É aqui que, para todos os nossos usuários dentro desta porta, queremos emitir placas, excluir o sucesso. E, na verdade, aqui não precisamos fornecer um ID do nosso quadro, porque todos esses usuários estão dentro desse quadro específico e sabem qual placa foi removida e devem ser redirecionados para a página inicial. porque eles não podem ficar no conselho que um dos clientes removeu. Portanto, nossa lógica de servidor está completamente pronta. Agora vamos voltar ao nosso cliente e exatamente como antes. Em primeiro lugar, queremos começar com eventos compartilhados e com nossos soquetes. E copiarei e colarei de nossos eventos de soquete, três eventos, sucesso e falha de exclusão do quadro e colarei aqui na parte inferior. Agora devemos entrar em nossos serviços, serviço de diretoria, porque aqui queremos criar um novo método para remover uma placa. É aqui que vamos copiar e colar nosso quadro de atualização e alterá-lo para o ponto de exclusão. E a única coisa que precisamos é do nosso conselho AT, não precisamos de nenhum campo aqui. E aqui queremos emitir nosso evento de exclusão de quadro. Então, vamos tentar aqui. Comprou delete e dentro forneceremos um objeto com apenas um campo. De fato, é o ID do nosso conselho. Agora, dentro de nosso aplicativo, podemos chamar essa placa de exclusão e ela lançará uma visão final corretiva do Socket Layer. Agora vamos atualizar nosso componente. Então, eu quero voltar para dentro do nosso quadro. Componentes comprados em HTML. Aqui temos nosso formulário em linha. E depois deste formulário embutido, devemos criar um ícone que excluirá o quadro. Aqui é onde, digamos, classe div Delete Board. E aqui teremos nosso evento de clique e desclique em Poupon para excluir nosso ponto. E, na verdade, não precisamos fornecer nada interno porque temos o NAD da nossa placa dentro do nosso arquivo de teste. Então, aqui eu quero fechar nossa div e experimentá-la dentro do código Delete Board. Agora devemos pular dentro do nosso arquivo ts e criar esse método aqui na parte inferior. E o que queremos fazer dentro do nosso quadro de exclusão, basta ligar para o nosso serviço. Bem, aqui sabemos que é um vazio e queremos chamar um serviço. Mas, na verdade, além disso, quero escrever aqui uma confirmação porque devemos ter certeza de que os usuários realmente desejam remover uma placa. Então, vamos tentar aqui. Se confirmar e se você não souber o que está confirmado, este é um pop-up Javascript padrão dentro do navegador, que mostrará um sim ou não. Então, aqui queremos escrever algo como tem certeza de que deseja excluir o quadro? E se a resposta for sim, então entraremos nessa peneira e chamaremos esse serviço de bordo. E aqui temos o ponto de exclusão onde podemos fornecer o AD da nossa placa. E agora você pode pensar, ok, devemos atualizar agora nosso serviço de diretoria. Mas não precisamos fazer isso porque, na verdade, é muito mais simples. O que queremos fazer Poupon para se inscrever aqui no nosso evento de soquete, que será excluído com sucesso. Vamos fazer isso agora. Para isso, queremos copiar e colar nosso serviço de soquete, ouvir e ouvir boop, quero ouvir o void porque back whoop não receberá uma placa. Sabemos que isso é apenas o sucesso da exclusão do nosso conselho. É aqui que o evento será comprado, excluirá o sucesso e voltará quando não conseguir nada. E a questão é: o que queremos fazer por dentro e, na verdade, simplesmente queremos redirecionar o usuário para nossa página inicial. Por que isso? Porque, na verdade, temos um ouvinte aqui no topo da navegação Iniciar, que na verdade significa que no momento nosso usuário está indo para outra página, por exemplo, para a página inicial, nós lidaremos com a transmissão ao vivo por meio de nosso serviço de diretoria e removeremos todos os fluxos corretamente. Aqui é o que queremos fazer dentro da nossa assinatura, basta escrever este ponto do roteador navegar por URL. E aqui temos, por exemplo, placas de barra, que na verdade significa que a placa não existe. Devemos mostrar para cada cliente uma lista de possíveis placas disponíveis. Vamos verificar se esse código está funcionando. Como você pode ver, não temos nenhum erro no cliente. Não temos erros no back-end. Vamos abri-lo agora no navegador. E como você pode ver, nossa página ainda está funcionando. E agora temos esse quadro de exclusão. Mas, na verdade, não quero remover essa parte porque construímos muitos testes aqui. Mas eu quero fazer, eu quero pular de volta para dentro de nossas pranchas e criar uma nova placa, por exemplo, para remover. Nesse caso, podemos testar essa funcionalidade nessa nova barra vazia. Mas queremos fazer agora, queremos duplicar essa guia apenas para verificar se ela funcionará para o segundo usuário. Então, o que eu quero fazer agora, eu quero clicar em Excluir ponto e, como você pode ver, eu vejo uma confirmação. Garanto que você quer deletar um quadro onde estiver escondido, ok? E onde há regularidade reagiu aos nossos conselhos. E como você pode ver aqui, não temos nosso quadro porque ele foi bem-sucedido ou removido. E como você pode ver na segunda guia, onde todos os dígitos direcionados para nossa parte de barra porque todos os nossos clientes dentro desta sala foram notificados sobre o sucesso na remoção da placa e eles devem ser rejeitado em nossa página de fóruns. E como você pode ver, nossa arquitetura é tão incrível que podemos criar novos recursos em questão de minutos. 40. Excluir coluna: Neste vídeo, devemos implementar a exclusão de nossa coluna. E, na verdade, aqui temos uma coluna dentro do nosso quadro e a massa perto do título mostra o ícone para excluir uma coluna. E, novamente, ele deve ser implementado com o soquete IO. Portanto, notificaremos outro usuário sobre nossa exclusão. E eu acho que é um recurso muito bom que você pode implementar por conta própria, porque será muito semelhante a excluir em um pássaro. E aqui está uma ajuda da minha parte. Em primeiro lugar, como sempre, devemos no back-end, implementar novos eventos e registrar o evento use socket. Depois disso, devemos criar uma nova ação do controlador que é colunas. Por exemplo, excluir coluna. Também devemos fazer sentido apenas com o cliente. Em primeiro lugar, registro e novo evento. Em seguida, reunimos um novo método dentro do serviço de coluna que pode ser compartilhado para remover uma coluna. Depois disso, devemos atualizar nosso componente para adicionar um botão no qual removeremos essa coluna específica deste ponto. E, na verdade, isso é apenas uma reunião do evento para o back-end. E também devemos assinar o sucesso para remover essa coluna em todos os nossos clientes. E aqui está a marcação do botão. Então você sabe o que precisa implementar. Como você pode ver aqui, estou dentro do componente HTML da placa. Aqui temos os títulos das nossas colunas e logo após o título, queremos escrever aqui uma imagem com a fonte. E aqui teremos ativos de barra, barra estreita sublinhado, ícone ponto SVG. E aqui podemos fechar nossa imagem, mas também devemos fornecer aqui uma classe que será o ícone de exclusão de coluna. Vamos verificar isso. Estou recarregando a página e aqui agora temos uma bela cruz. E é exatamente aqui que você vinculará o evento de clique. Mas se você quiser apenas acompanhar, vamos implementar isso juntos. E, na verdade, como eu disse, será muito parecido com a exclusão do quadro. Aqui é y. Vamos fazer isso rápido e furioso. Então, primeiro de tudo, quero começar com nosso backend e salto de biomassa aqui dentro de nossos tipos de fonte de servidor. E aqui temos nossos eventos de soquete. E, novamente, temos aqui os quadros deletar, posso copiar e colar e apenas alterá-lo para excluir colunas. Aqui é y aqui à esquerda, teremos colunas excluídas e à direita, em vez de placas escreveremos colunas em todos os lugares. E também devemos mudá-lo em sucesso e fracasso. Então, nossos eventos estão lá. Agora devemos pular dentro de nossas camadas de servidor que aqui e usar socket aqui em vez de placas delete, eu quero escrever colunas delete, que acabamos de criar. Aqui. Em vez do controlador de placa, devemos usar nosso controlador de colunas. Aqui não excluiremos um quadro, mas excluiremos nossa coluna. E agora somos o método de exclusão de coluna mostarda dentro do nosso controlador de colunas. Mas eu não quero redigitar nada porque o código é exatamente a mesma perna de exclusão do quadro. É aqui que podemos copiar, colar completamente esse quadro de exclusão e colá-lo dentro do nosso controlador de colunas , pois será 99% o mesmo. Então, em primeiro lugar, a questão é o que devemos obter aqui como parâmetro? Aqui já estamos, eu entro no AD e eles também querem obter aqui a coluna que eles D, porque precisamos saber o que estamos excluindo. E você pode dizer aqui, ok, mas por que precisamos da pobre dama? Só precisamos de uma coluna e na verdade, não, porque devemos notificar todos que se inscreveram neste anúncio específico do conselho. É por isso que devemos fornecer os dois valores aqui. Depois disso, estamos verificando aqui o nosso usuário e aqui devemos atender a um evento de falha. No nosso caso, será falha de exclusão de colunas. Aqui este usuário não está autorizado, e aqui temos nossa captura e podemos usar aqui as mesmas colunas delete failure com nossa mensagem de erro get. Aqui. Em vez do modelo de placa, usaremos nosso modelo de coluna. Aqui estamos excluindo um registro por ponto de dados, e aqui estará o ID da coluna porque devemos excluir nossa coluna não nasceu e depois dessa forma alcançamos nosso sucesso. Mas aqui vamos tentar o sucesso para a exclusão de nossa coluna, e aqui será o sucesso. E, na verdade, já estamos prontos com nosso back-end. O que eu quero fazer agora é copiar e colar esses eventos de soquete porque vamos usá-lo no cliente. É assim que copiarei e colarei colunas, excluirei o sucesso e o fracasso, e que o Champion desativado defina o aplicativo de origem dos clientes. E aqui temos tipos compartilhados e aqui estão nossos eventos de soquete onde dentro podemos colar colunas, excluir. Nosso próximo passo será as colunas de serviços compartilhados tub Data, Service, Insight. Porque queremos implementar a coluna de exclusão exatamente aqui. Podemos escrever um novo método delete column, e sabemos que estamos obtendo aqui nosso ID de placa, que é uma string, e também nosso ID de coluna, que também é uma string. E estamos ficando com um grande vazio porque só queremos emitir nosso evento de soquete. É por isso que aqui podemos escrever este serviço de soquete e atender, e estamos usando aqui nossos eventos de soquete em m colunas de pontos delete. E devemos fornecer como um segundo parâmetro e um objeto com o AD do nosso quadro e também o ID da coluna, que estamos obtendo dos parâmetros. Depois disso, devemos atualizar nosso serviço de diretoria. E só para lembrá-lo, furar serviços exatamente onde estamos armazenando nosso fluxo de colunas. O que realmente significa que aqui devemos implementar a exclusão da coluna. Então, aqui na parte inferior, eu posso criar o método delete column. E aqui só precisamos do nosso colunado. Não precisamos da ideia do Board porque chamaremos esse método apenas do componente para atualizar nosso stream. Então, aqui sabemos o ID da coluna que queremos excluir e, de volta, estamos sendo anulados, e agora queremos atualizar a lista de nossas colunas. Este é o caminho aqui. Podemos criar colunas atualizadas de uma propriedade. E aqui podemos acessar nosso stream com essas colunas stream. Aqui estamos obtendo nosso valor. E depois disso, queremos filtrar nossa matriz. E, na verdade, aqui estamos obtendo acesso a cada coluna e queremos rejeitar esse ID de coluna específico. É por isso que aqui podemos verificar se o ID da coluna não é igual aos nomes das nossas colunas, que foram passados como um parâmetro. Neste caso, estamos obtendo exatamente a mesma lista de nossas colunas, mas sem essa coluna. E depois disso, precisamos apenas atualizar nosso stream. Para isso, podemos escrever essas colunas seguir e estamos jogando dentro de nossas colunas atualizadas. Então, na verdade, esse método atualizará nosso fluxo e removerá uma coluna do fluxo. O próximo passo é atualizar nosso componente. E, na verdade, já mudamos nosso HTML. Aqui agora temos uma imagem, mas devemos anexar, ouvir um evento de clique. E aqui o que eu quero fazer, eu quero excluir uma coluna. É assim que podemos fornecer um método delete column, e devemos passar dentro do com dot id. E aqui no topo, como você pode ver, temos acesso à nossa coluna. Agora podemos pular dentro do nosso componente e criar esse método. Portanto, a coluna Dalit está recebendo apenas um único argumento, que é o ID da nossa coluna que queremos remover e banco onde será anulado. E agora, por dentro, simplesmente queremos ligar para o nosso serviço compartilhado. Então aqui estará este mundo de serviço de coluna ou o Herodes. Agora, aqui temos uma coluna de exclusão de método dentro. Devemos fornecer um AD de placa e, na verdade, são esses AD do quadro e, em seguida, o ID da coluna. Portanto, essa linha de código emitirá um evento para nosso back-end para remover essa coluna e notificar todos os nossos clientes. E agora só precisamos nos inscrever dentro da nossa assinatura aqui no topo que queremos atualizar nossa lista de colunas. É aqui que aqui, na verdade, podemos copiar e colar algo semelhante e as colunas soldadas aqui criam sucesso. Vou copiar, colar e colar aqui na parte inferior. E aqui nós excluímos e na verdade, excluímos com não fizemos isso corretamente. Eu quero pular de volta para dentro de nossas colunas de controle. Como você pode ver aqui, temos o quadro de dados i2 que eles emitem, e aqui eu apenas mudei o nome colunas delete success, mas não é suficiente. Devemos fornecer aqui alguns dados porque, na verdade todos os nossos clientes devem saber qual coluna devemos remover. É aqui que aqui como o segundo parâmetro, eu quero fornecer coluna de pontos de dados que eles aprofundam. E, neste caso, recebemos informações suficientes para todos os nossos clientes sobre a exclusão de nossa coluna. Agora podemos voltar para dentro do componente do quadro e aqui está nossa escuta. E, na verdade, aqui estamos ouvindo nossas colunas, exclua o sucesso. E aqui o que estamos recebendo de volta não é uma coluna, mas apenas a string que queremos remover. É por isso que aqui podemos escrever que esse é o ID da coluna e na verdade, são informações suficientes para o cliente remover uma coluna. É por isso que aqui agora podemos ligar para o ponto de serviço do conselho. E aqui temos nossa coluna de exclusão. E por dentro, como você pode ver, estamos fornecendo a coluna D, e isso é exatamente o que temos aqui do nosso back-end. Então, na verdade, implementamos tudo para o nosso recurso. Vamos verificar se está funcionando. Em primeiro lugar, vamos verificar se o back-end que temos aqui é um problema. Excluir coluna não existe no tipo e aqui estão as colunas. Vamos verificar isso. Vou pular de volta para dentro de nossos controladores, e aqui temos nossa placa de exclusão. Então esse é o problema. Copio o método Delete Board colado, mas eles não o renomearam. Deve ser a coluna de exclusão. Vamos verificar isso de novo. Estou salvando e pulando no console. E como você pode ver agora, não temos nenhum erro. Agora vamos verificar nosso cliente. Tudo está parecendo bem. Então, vamos pular para o nosso quadro. Como você pode ver, nossas páginas estão funcionando. E agora aqui posso clicar para remover, por exemplo, essa coluna completa. Estou clicando nele e, como você pode ver, ele desapareceu completamente. E o que é mais interessante, podemos duplicar a guia e tentar remover a próxima coluna, F, F, d, d e assim por diante. Estou batendo aqui cruzado e ele é removido não só aqui, mas também nesta guia. E tudo é atualizado automaticamente, o que significa que implementamos com sucesso remoção das colunas dentro do nosso aplicativo. 41. Atualizar a coluna: Neste vídeo, devemos implementar um dos últimos recursos relacionados ao nosso quadro, e isso é a atualização da coluna. E como você já pode entender, será muito parecido excluir a coluna. A única diferença é que teremos um interior do atualizado, mas muitas coisas permanecerão exatamente iguais. Onde uma reunião, eu sou um evento de soquete onde colocá-lo no back-end e quando definimos todos os nossos clientes, este é y. Vamos implementá-lo juntos agora, antes de tudo, eu quero voltar para dentro do nosso servidor tipos de origem. E aqui devemos criar eventos internos de soquete em novos tipos e hairball para a nota das colunas principais, posso copiar, colar e renomear atualização de duas colunas. Então, aqui teremos colunas Atualização, atualizações de colunas, sucesso e fracasso. Aqui à direita. Em seguida, podemos alterá-lo para atualizar. Em seguida, um sucesso na data de nascimento e uma falha de atualização após este lítio de volta para nossa irmandade S e aqui e seu próprio evento. Então, aqui eu copio a exclusão de coluna colada e vamos alterá-la para nossa atualização de colunas que acabamos de criar. E aqui estamos usando nosso controlador de colunas, mas aqui estamos recebendo não excluir coluna , mas atualizar coluna. Agora devemos criar essa ação, mas na verdade podemos copiar e colar de nossos quadros porque aqui já estamos implementados placa de atualização e será super semelhante. É por isso que eu quero copiar colado completamente e colar na parte inferior dentro do nosso controlador de colunas. Aqui com primeiro de tudo, deve mudar a nomenclatura. Então, aqui temos nossa coluna de atualização e, na verdade, quero mantê-la exatamente igual com a pobre senhora e os campos. Portanto, temos exatamente a mesma estrutura. É aqui que a única coisa que precisamos é o ID da coluna, que é uma string. E o único campo que estamos atualizando aqui é nosso título. Agora vamos mudar nosso conteúdo. Aqui teremos eventos de soquete em m e aqui foram criadas falhas de atualização da coluna. E vamos mudar também o nosso problema aqui também será a falha na atualização da coluna. Agora devemos mudar nossa lógica. Em vez do modelo de Bohr, teremos aqui o modelo de coluna e estamos sendo multados até o final da atualização. Isso é totalmente bom. Mas aqui não queremos obter um quadro, mas uma coluna por ID de coluna. E aqui temos campos de dados. Isso é completamente normal e retroceder a coluna atualizada e não o quadro atualizado. Agora, aqui queremos emitir para todos os nossos clientes nosso evento, que será um sucesso de atualização de coluna. E aqui devemos fornecer nossa coluna atualizada para que eles possam alterá-la no cliente. Nosso backend é bem-sucedido, mudou. Agora devemos atualizar nosso cliente. E antes de tudo, quero copiar colar esses três novos eventos, que são atualização de colunas, sucesso e fracasso. Agora, vamos voltar ao aplicativo de origem de nossos clientes. E aqui não dissemos que dispensamos nossos tipos de eventos de soquete. E aqui na parte inferior vou adicionar colunas de sucesso e fracasso de atualização. Agora queremos mudar nosso serviço de camisas, que é responsável por fazer solicitações à nossa API. Aqui estão as colunas de serviços e aqui já implementamos a coluna de exclusão, mas precisamos fazer agora é nossa nova coluna de atualização de método. Aqui já sabemos o que estamos recebendo. Estamos recebendo aqui nosso ID do conselho, que é uma string. Depois disso, estamos obtendo nosso ID de coluna, que também é uma string. E por último, mas não menos importante, estão nossos campos, que é um objeto com um título, que é uma string. E de volta estamos ficando vazios porque aqui simplesmente emitimos um evento. É aqui que o serviço de soquetes de ouvido Datta se encontra e queremos usar aqui o soquete até mesmo vê-los ponto. E aqui temos nossa ação de atualização de colunas como o segundo parâmetro. Devemos fornecer tudo. Em primeiro lugar, bordo AT segunda coluna carente. E por último são os filmes. E com isso, nosso serviço está totalmente pronto. Agora precisamos atualizar nosso serviço de diretoria para que possamos alterar nosso componente. É por isso que vou entrar em nosso aplicativo, serviços de diretoria, serviço de diretoria. E aqui já criamos um quadro de atualização de método. É aqui que vamos criar nosso método de atualização de coluna. E sabemos que esse grupo quer atualizar um único registro dentro do nosso array. E aqui a única coisa que queremos é uma coluna um pouco datada. Isso é o que obtivemos do nosso back-end. Aqui. Estamos recebendo toda a interface da coluna e, de volta, queremos anular. Agora, aqui está nossa ideia. Precisamos mapear cada coluna e atualizar essa coluna por dia. É assim que podemos recuperar nossas colunas atualizadas. E aqui queremos obter, antes de tudo, o valor do nosso fluxo. Então, aqui teremos nossas colunas obtendo valor e estamos mapeando por meio dessa matriz. Então aqui está o mapa e estamos obtendo acesso a cada coluna aqui dentro , devemos escrever nossa lógica. Portanto, se o ID da coluna que estamos percorrendo for igual ao nosso ID de ponto de coluna atualizado, então devemos fazer nossa mágica. E se não, simplesmente queremos retornar nossa coluna sem uma atualização. Agora, o que queremos fazer dentro do loop um para atualizar essa coluna específica. É por isso que quero mesclar nossa coluna com o título. E aqui estamos fornecendo um título de ponto de coluna atualizado. Neste caso, estamos atualizando apenas uma única jaqueta quando ela combina. Em outro caso, onde simplesmente retornar nossa coluna. Depois disso, só precisamos atualizar nosso stream com essas colunas a seguir. Somos fornecidos dentro de nossas colunas atualizadas, então nosso método está completamente pronto. Agora só precisamos atualizar nosso componente. Então, vamos voltar para dentro do nosso componente do quadro, e aqui temos o título da nossa coluna, mas em vez de apenas um título , devemos seguir a tendência aqui. Vamos experimentá-lo em linha, e vamos fechá-lo aqui diretamente. Agora, antes de tudo, aqui devemos definir nossa classe que será adicionada forma de coluna. Depois disso, devemos fornecer o texto padrão. E aqui queremos escrever o nome da nossa coluna, que será coluna, o título, mas também deve fornecer aqui um valor. Este é y, aqui estará o título, que é o título da nossa coluna. E o último é o nosso retorno de chamada, que é tratado como enviar. E, na verdade, esse método podemos nomear, atualizar, nome da coluna, e dentro estamos recebendo Festival, nosso evento, que na verdade é o nome da nossa coluna. E aqui também devemos fornecer o ID da coluna, porque não é o caso do Groupon saber para qual coluna queremos atualizar essa tela específica. Agora, vamos criar esse método dentro do nosso componente. Então, aqui na parte inferior, quero adicionar o nome da coluna de atualização. E aqui estamos obtendo, em primeiro lugar, nome da nossa coluna, que é a sequência da nossa diversão no interior. E em segundo lugar, estamos obtendo aqui nosso ID de coluna. Nesse caso, sabemos o que precisamos atualizar e o que queremos fazer aqui. Só queremos chamar nosso método de colunas de fragmentação. Este é y, aqui, este serviço de coluna, e aqui está nossa coluna de atualização de método que acabamos de criar. Em primeiro lugar, devemos fornecer aqui nosso ID do conselho, ID da coluna e também nossos campos. No nosso caso aqui, temos apenas um único campo, que será nosso título, que é o nome da nossa coluna. Do lado do cliente, tudo está pronto, mas devemos assinar o sucesso de uma data de nascimento na coluna. É por isso que devemos ir aqui no topo, agora um serviço de soquete. E, na verdade, aqui já temos nossa atualização do quadro, que na verdade significa que eu quero copiar e colar essas linhas e apenas alterá-las. Porque aqui de volta, obteremos nossa interface de coluna depois de atualizarmos nossa coluna. E, na verdade, aqui queremos nos inscrever para chamá-los de sucesso de atualização. E aqui estamos recebendo o quadro não atualizado, mas estamos recebendo o número da coluna atualizado devemos chamar outro método do nosso serviço de diretoria. E esse método será a coluna de atualização. E dentro estamos fornecendo nossa coluna atualizada, o que na verdade significa que, com esse código, todos os nossos clientes serão notificados e atualizaremos essa coluna específica. Vamos verificar se está funcionando aqui no back-end, está tudo bem. Aqui no cliente, não temos nenhum erro. Vamos para o navegador. E como você pode ver aqui, eu tenho esse nome legal e agora posso clicar nele porque esta é nossa empresa no interior e não apenas o título. Agora vamos tentar aqui, atualizado e eu estou pressionando Enter. E como você pode ver, ele foi atualizado e adiado carregando a página, então esse código também é mancha, o que na verdade significa que fizemos com sucesso essa alteração está no back-end e eles fizeram todos os nossos clientes. E aqui, se eu estiver pulando para a segunda guia, ela parece exatamente a mesma porque também foi atualizada e notificada por meio do soquete IO. Com isso dito, implementamos com sucesso nosso recurso de atualização na coluna. 42. Cancelar assinatura: Neste vídeo, quero falar sobre inscrição porque, na verdade, temos um problema. Vamos dar uma olhada em nosso teste de componentes de placa. Aqui temos nossos ouvintes de inicialização e estamos usando o dot subscribe várias vezes. E, na verdade, você deve saber que dentro do Angular toda vez que estiver escrevendo a palavra subscrever, você está em perigo porque está criando uma assinatura lá. E esta assinatura vai ficar lá até o fim do mundo. O que significa, por exemplo, que estamos deixando nossa prancha e pulando para outra prancha. E todas essas assinaturas já estão lá e nunca serão destruídas porque todas as assinaturas não têm nada a ver com o nosso componente e o angular não tem qualquer coisa sobre eles. Mas aqui é importante mencionar que, se estamos falando dentro do Angular sobre o cliente HTTP, não devemos cancelar a assinatura dele. Isso não é obrigatório porque angular cancelará a inscrição automaticamente, o que na verdade significa que aqui, quando estamos usando este roteador, os eventos se inscrevem, Isso é totalmente bom. Aqui também podemos ver nossos dados de busca e aqui também usamos a assinatura do nosso get bored. E para isso devemos abrir nosso get bored e verificar o que temos aqui. E, na verdade, este é um Gad bem grande, que é um cliente HTTP, o que na verdade significa que esse código é totalmente bom e não devemos cancelar a inscrição. Mas, na verdade, eu prefiro cancelar a assinatura em todos os lugares, em cada aplicativo em que uma assinatura C, porque você nunca sabe o que exatamente é esse método get board? É realmente um cliente HTTP ou é apenas um invólucro por aí? E você realmente precisa cancelar a inscrição. E a questão é como você pode cancelar a inscrição em seu aplicativo para torná-lo confortável. E há muitas maneiras de fazer isso. E, na verdade, sempre queremos cancelar a inscrição quando estamos destruindo um componente. E normalmente onde esse componente Turner, quando estamos mudando, o que na verdade significa que aqui podemos escrever algo como esta assinatura do conselho é igual. E aqui estamos obtendo o resultado de nossa assinatura e o resultado da assinatura fácil de assinatura, o que na verdade significa, por massa, criar essa propriedade e, em seguida, diretamente dentro do nosso mecanismo, destruir assinatura do Boards dot unsubscribe. Isso é totalmente válido, mas depois criaremos muitas propriedades e isso não é tão confortável. É por isso que existem maneiras melhores de fazer isso. Eu queria mostrar uma abordagem simples que você pode usar. O que eu quero fazer dentro do meu componente do quadro, eu quero criar mais uma propriedade e eles querem nomear essa propriedade unsubscribe. E, na verdade, eu quero colocar aqui dólar porque será um fluxo. E aqui eu quero atribuir um novo assunto e na verdade, também o assunto comportamental juvenil dentro do nosso serviço do conselho. Mas aqui temos um novo assunto com vazio, e estou apenas chamando, a principal diferença entre sujeito e sujeito comportamental é que o sujeito comportamental sempre tem um valor inicial e então digamos, sujeito, não temos nenhum valor inicial. Agora, aqui queremos adicionar implementos em destruir, o que na verdade significa que devemos criar em G ao destruir. E agora estamos falando sobre isso na Alemanha. E aqui podemos escrever em junho destruir e o que queremos fazer por dentro, queremos escrever este ponto de cancelamento de inscrição a seguir, então estamos na coluna o próximo valor. E depois disso, esse ponto de cancelamento de inscrição foi concluído, o que significa que depois que destruímos esse componente, não queremos obter novos valores dentro desse cancelamento de inscrição. E agora podemos usar esse cancelamento de inscrição em qualquer lugar para ignorar assinaturas. Como isso parece? Na verdade, aqui, não precisamos usá-lo, mas devemos usá-lo dentro do serviço de soquete porque é uma assinatura personalizada. E para fazer isso antes de nossa assinatura, podemos apenas experimentá-lo ponto pipe e dentro queremos usar o método take until e dentro eles querem colocar esse cancelamento de inscrição que acabamos de criar, o que na verdade significa que aqui estamos pegando, ok, devemos adotar novos valores e ter essa assinatura até que esse cancelamento seja válido. No momento em que formos Colin com vínculo completo, venha aqui para nossa assinatura. O que na verdade significa que, em todos os casos , quando temos uma assinatura, podemos experimentá-la antes aceitando até esse cancelamento. E estamos prontos para ir atrás que nossos componentes sejam destruídos. Aqui teremos o completo e essa lógica nunca acontecerá. Essa é realmente uma variante confortável e fácil implementar, cancelar a inscrição. É por isso que eu quero copiar, colar esse código e colocá-lo em todas as lições que estamos escrevendo aqui antes de me inscrever. Neste caso, estamos no lado seguro, e não chamaremos esse código depois de destruir um componente. Agora você com certeza quer saber se está realmente funcionando assim. É por isso que, para testá-lo, podemos simplesmente comentar até , por exemplo, em colunas, acesso a atualizações. Mas na verdade não vai funcionar assim porque quando estávamos saindo do conselho, Bacon para de enviar eventos para perguntar, é por isso que o que podemos fazer apenas para testar é defendido dentro das colunas dos controladores. E aqui está nossa coluna de atualização de método, e aqui temos nossa função são suas duas. E aqui precisamos encontrar apenas clientes onde eles estão dentro dessa parte específica. Apenas por uma questão de teste, removerei aqui para notificar todos os clientes , porque eles querem mostrar que essa assinatura ainda está lá quando saímos do conselho. Então, agora aqui eu quero apenas tentar o log do console. Coluna atualizada. Aqui está nossa coluna atualizada. Vamos verificar isso. Estou recarregando a página, estou pulando para esse ponto e estou tentando atualizar a coluna. Como você pode ver, este é o nosso log do console, e aqui também temos o log do console. Está tudo bem. Mas agora estamos voltando para nossas pranchas e não temos nada e nosso componente foi destruído. Agora, aqui na segunda guia, atualizaremos essa coluna. E como você pode ver aqui, insira o primeiro passo. Temos esta coluna atualizada e estamos recebendo porque esta assinatura ainda está pendurada com não inscrição do nosso código e denotado para fazer isso, podemos apenas descomentar até, Vamos tentar isso. Agora, aqui estamos entrando em nosso aplicativo. Estamos recebendo, atualizamos a coluna onde o campeão volta às nossas pranchas. E agora aqui podemos tentar atualizar nossa coluna. Mas, como você pode ver agora na primeira etapa, não recebemos uma mensagem porque aqui ela não passou por essa tomada até, é por isso que é tão importante cancelar a inscrição de todas as nossas assinaturas. Agora vamos mudar esse código de volta. Em primeiro lugar, não precisamos desse log do console. E em segundo lugar, vou pular dentro das colunas do nosso controlador e alterar o código de volta para o ID do banco de dados i2. Portanto, no aplicativo real, eu recomendo que você cancele a inscrição de todas as suas assinaturas. 43. Módulo de tarefa e componente básico: Neste vídeo, iniciamos recurso novo e interessante e depois falamos aqui sobre o modelo de tarefa de recurso. O que isso tem um significado? Na verdade, como você pode ver aqui, onde dentro do quadro e quando clicamos em tarefa específica dentro deste ponto, na verdade, devemos abrir aqui um modelo, mas não é tão simples assim, porque o que queremos Para fazer isso, queremos mudar nosso roteamento. Então agora temos slash board slash board Id. E, na verdade, quando abrimos uma tarefa após o recarregamento da página, queremos ver a mesma tarefa. E a maneira mais fácil de implementar isso é obviamente o roteamento. Então, queremos, no momento em que abrirmos um URL de tarefa como barra barra ID do quadro de barras tarefas de barra tarefa de barra KD, o que na verdade significa que temos uma rota aninhada dentro do quadro. E, na verdade, Angular nos permite muito simples administrar as secas das crianças. Por que precisamos aqui de uma seca infantil? Porque eles realmente aqui queremos antes de tudo renderizar todo o quadro e, adicionalmente, renderizar esse modelo, o que na verdade significa que nosso modelo, estará aqui na parte superior e abaixo do nosso modelo, veremos todo o conselho. E isso é extremamente importante porque, na verdade, vamos, mesmo dentro do modelo, buscar o quadro inteiro. E, na verdade, todo esse componente será renderizado Assim como está, sem nenhuma alteração. E o que também é interessante dentro do nosso modelo de tarefas, usaremos essas informações do conselho, e é exatamente isso que implementamos aqui. Aqui dentro de nossa fonte de cliente, aplicativo, serviços de placa, serviço de bot, temos três fluxos. Nossa coluna de tarefas e, mas, e isso é incrível, porque agora dentro do nosso modelo de tarefas, podemos ler todas as nossas tarefas, encontrar a tarefa necessária por esse ID dentro da URL que implementaremos em um segundo e depois apenas renderize essas informações da tarefa sem solicitações adicionais. E neste vídeo, quero começar com o básico desse modelo de tarefa. Aqui queremos criar um componente básico e vincular corretamente nossa rota. E para isso, quero voltar para dentro do nosso módulo de placa. E aqui temos nossa rota com slash boards, slash board Id. E aqui queremos ter uma seca infantil. É aqui que podemos escrever filhos e isso é uma matriz. Aqui também temos um objeto com caminho, que será uma barra de tarefas. E aqui está o ID da tarefa, o que na verdade significa que estamos seguindo o caminho pai e nosso caminho filho. E juntos teremos nosso caminho de ID de tarefa aqui, mas também devemos fornecer um componente que criaremos em um segundo. E é o nosso componente do modelo de tarefas. Mas também não implementamos a mudança de nossa rota. E para isso, quero pular dentro da nossa placa de componentes. E aqui está comprado componente HTML. E como você pode ver aqui, temos um link para nossa tarefa. Esta é a tarefa da classe div, e aqui está energia para loop. E, na verdade, aqui queremos escrever um evento de clique. E aqui o que queremos fazer, queremos abrir a tarefa. E para isso só precisamos da nossa tarefa dot id. E o que queremos fazer dentro desse método é apenas mudar uma rota. Este é o caminho aqui. Vamos criar essa tarefa aberta dentro do componente do quadro. E aqui estamos obtendo nosso ID de tarefa, que é uma string. A parte de trás está ficando vazia. E agora aqui podemos simplesmente usar nosso roteador para alterar a rota. Então, aqui podemos escrever este roteador dot navigate, e estamos usando aqui navigate e não navigate por URL porque queremos passar dentro de um array. Aqui. Primeiro, temos placas, depois concatenamos essa string com esse ID de placa, depois vírgula. E temos aqui nossas tarefas, e aqui teremos nosso ID de tarefa. Como você pode ver, é muito mais simples escrever navigate with array e depois navegar por URL, onde devemos concatenar essa string nós mesmos. Portanto, nosso evento click está completamente pronto, e agora só precisamos criar esse novo componente. É por isso que dentro da nossa placa e ainda estamos falando sobre os componentes da inserção do módulo da placa. Queremos criar nosso novo componente e ele será nosso modelo de tarefa. Agora dentro com primeiro de tudo, precisa criar uma tarefa Modelo Ts e também modelo de tarefa componente ponto ponto HTML. E agora, aqui dentro do HTML, quero fixar diretamente toda a marcação do nosso modelo sem qualquer lógica. Nesse caso, podemos ver diretamente que o termo modelo está funcionando e o roteador também está funcionando. É aqui que vamos escrever todo o mercado. Então aqui, antes de tudo, temos nosso contêiner de modelo de tarefa de classe, e aqui não vincularemos nenhum dado ainda. Agora, dentro dessa div, devemos experimentá-la mais profundamente, e será nosso cabeçalho modal de tarefas. Vamos fechar essa div e, dentro dela, renderizaremos mais tarde o título da nossa tarefa em forma de linha. E depois da nossa forma interior, precisamos aqui para renderizar uma imagem. E, na verdade, aqui estarão os ativos de barra de origem barra fechar ícone ponto SVG. E aqui também precisamos fornecer uma aula que será tarefa. Modelo fechado e, na verdade, eu escrevi não corretamente. Esta imagem deve seguir o título da nossa tarefa em linha firme. Então, estamos falando aqui sobre o cabeçalho modal da tarefa. E depois do cabeçalho modal dusk, queremos criar o próximo div, que será o corpo modal Task. Vamos fechar aqui nossa div e por dentro queremos criar um motivo porque precisamos agrupar nossos elementos. Então, dentro dessa div, queremos criar nosso formulário mais tarde. Você pode perguntar, ok, mas por que aqui estamos usando a empresa Justin Lin e aqui queremos criar uma empresa real porque, na verdade, aqui mais tarde, também precisaremos de um select para alterar nossa coluna. É por isso que é muito mais fácil de usar neste fórum. Aqui é você. Vamos criar um formulário por enquanto sem nenhum grupo firme, basta bater o copo. E aqui teremos nosso contêiner de seleção de coluna. Vamos fechar esse formulário. E dentro do nosso formulário mais tarde, renderizaremos aqui um select, mas por enquanto não o temos. Aqui é onde aqui, basta selecionar a coluna. E depois disso, a empresa desejará criar um motivo em que teremos a descrição do nosso modelo de tarefa. E aqui teremos nossa div com o rótulo de descrição do modelo de tarefa de classe. E então, do lado, simplesmente escreveremos uma descrição de palavras. Após essa div, teremos um formulário embutido para nossa descrição. Então, aqui está a descrição do formulário em linha que criaremos mais tarde. E agora, após essa div que criamos , precisaríamos criar um motivo. E aqui teremos nossas ações de modelo de tarefa dentro, antes de tudo, precisamos de uma classe adicional e serão ações de modelo de tarefa rotuladas e dentro dessa div, simplesmente escreveremos ações. E depois disso, precisamos criar mais uma div. E dentro dessa div, vamos empacotar um motivo com classe, tarefa, modelo, ações, ação. Aqui, vamos fechar esse div e, em seguida, dentro podemos renderizar uma imagem com fonte slash acids slash trash SVG. E aqui está a nossa classe que será encarregada ícone de ações do modelo. E depois do segundo, nós apenas renderizaremos uma palavra delete. E depois de toda a marcação no final, precisamos renderizar um pano de fundo, todo o nosso quadro fique um pouco escondido. É aqui que devemos criar div com pano de fundo do modelo de tarefa de classe aqui Vamos fechar esta div para que nossa marcação esteja completamente pronta. Agora, só precisamos criar esse componente. Vamos primeiro criar aqui uma classe e ela será nosso componente modal de tarefas. No topo foram dominados nosso componente, e vamos nos registrar lá dentro. Primeiro de tudo, um seletor, será encarregado modelo. E depois disso, um URL de modelo e soldado, mais pesado é HTML componente modal tarefa, mas não é tudo. Devemos fornecer mais uma classe para todo o invólucro desse componente. Somente nesse caso, nosso mercado estará correto. E aqui devemos encadernar diretamente o host. E aqui estou dando aula de insights. Aqui podemos escrever classes iguais ao modelo de tarefa. E se você nunca escreveu algo assim, estamos usando essa notação quando não precisamos aplicar essa classe a algum profundo dentro desse componente, mas queremos que o aplique exatamente uma classe em nosso elemento componente. Então, fizemos alguns componentes básicos. Vamos verificar agora se está funcionando. Então Festival aqui temos muitos erros. Por exemplo, aqui no módulo da placa não é possível encontrar componente modal de tarefa. Então, primeiro de tudo, aqui devemos pular dentro do nosso módulo de placa. E aqui precisamos inserir nosso componente de modelo de tarefa. E também devemos fornecê-lo aqui dentro da declaração, este é o componente do modelo de tarefa. Vamos verificar novamente com não há erros aqui. Vou recarregar a página e eles não verão nenhum erro dentro do console agora. Mas o que devemos fazer agora, precisamos clicar em uma das tarefas. Por exemplo, aqui está minha primeira tarefa e estou apenas clicando. E como você pode ver, nada aconteceu. Mas dentro da seca, podemos ver agora cortar placas, cortar nosso ID do conselho, cortar tarefas e cortar o d da nossa tarefa que acabamos de abrir. E agora você pode perguntar, ok, mas por que não vemos nosso componente e, na verdade, não tendemos a saída para nossos filhos, que na verdade significa dentro de nossa placa, dentro do componente HTML, em algum lugar dentro da nossa marcação, por exemplo, na parte inferior, devemos renderizar a saída Zhao exatamente como fizemos dentro do nosso componente de aplicativo. Então, aqui vamos fechar a tomada do roteador e agora ele deve funcionar. Vou recarregar a página. E como você pode ver, vemos nosso modelo por isso porque, na verdade, essa é a rota. E agora, toda vez que estou recarregando a página, vemos nosso pai em segundo plano. E aqui vemos nosso modelo e na verdade, já temos algumas marcações básicas para esse modelo, o que significa que ele está funcionando totalmente. Mas agora eu quero consertar uma grande armadilha que será muito difícil de depurar o que estou falando. Como você pode ver aqui dentro do nosso componente do quadro, aqui temos uma verificação de rota e, na verdade, aqui no topo, assinamos as estrelas de navegação deste evento. E aqui estamos desencadeando nascidos vivos. O que o live board está fazendo? Na verdade, aqui estamos encontrando um evento de soquete para nosso back-end, o que na verdade significa que estamos cancelando a inscrição neste soquete atual, nosso usuário atual de você foi neste ponto, que na verdade significa que aqui estávamos neste ponto, slash board slash AD. E agora estamos recebendo eventos. Está tudo bem. Mas no momento em que abrimos nosso modelo, mudamos. E, na verdade, isso significa que estamos aqui neste IV e aqui vemos ao vivo o que podemos facilmente verificar. Por exemplo, aqui vou tentar ao vivo, mas estou recarregando a página. Parece bom. Mas quando estou pulando nossas pranchas e depois clico na minha primeira tarefa. Como você pode ver aqui, estamos recebendo licença. Isso foi completamente redesenhado porque, nesse caso, não receberemos nenhuma notificação em nosso quadro, mas já saímos do quadro. Esse é o comportamento do Sean porque não queremos viver como um conselho. Se apenas abrirmos o modelo, ainda queremos estar nesta página, mas podemos fazer para corrigi-lo, na verdade só precisamos verificar nossa rota de slash boards. Porque, na verdade, se aqui dentro da seca tivermos slash boards slash, isso significa que ainda estamos nesta página. Porque se estamos voltando para nossa página de quadros, então aqui temos apenas placas de barra e não temos uma barra. E então é aqui que eu posso escrever URL end not event dot. E esse é todo o URL para o qual vamos incluir, e estamos verificando se essa barra de URL específica , barra de placas. Então, na verdade, aqui vamos acionar nosso quadro de vidas quando nosso início de navegação acontecer. E esse URL que vamos usar não inclui barra de porta. Essa barra de barra é nossa única ligação ou nossa placa única foi modelo. Vamos verificar se está funcionando. Estou clicando aqui na minha primeira tarefa e agora não estamos deixando a parte, o que significa que tudo funcionará bem. E agora vamos implementar juntos. Vá para o quadro porque essa é apenas uma única linha que eu quero fazer. Eu quero entrar em nosso modelo de tarefa. E aqui no topo temos essa imagem de perto. E, na verdade, aqui também podemos criar um evento de clique e vamos nomeá-lo, ir para o quadro. Agora podemos pular diretamente dentro do nosso modelo de tarefa e criar esse método, vá para o vínculo. E o que precisamos saber dentro desse componente para saltar para o nosso quadro, devemos ler a partir deste ano. Bem, em primeiro lugar, nosso ID de tarefa, precisaremos dele em qualquer caso. E aqui, o mais importante, o AD da placa, que na verdade significa que escreveremos o mesmo código que escrevemos dentro do nosso construtor dentro da placa. Então, aqui vamos registrar nosso construtor. E por dentro, precisamos primeiro de tudo, nosso conselho AT. Para isso, precisamos usar route, que realmente significa que aqui devemos injetar nossa rota, que é uma rota ativada. E agora aqui podemos escrever esta rota dot snapshot, dot, params, map, dot, get. E aqui estamos tentando obter nosso ID do conselho. E como você pode ver aqui, estamos ficando tensos agora. É por isso que faz muito sentido verificar se realmente conseguimos nosso ID do conselho. Nesse caso, podemos salvar o ID da placa e o AD da tarefa diretamente como uma propriedade dentro do nosso componente. É por aqui que eu primeiro quero criar nosso anúncio de quadro. É uma corda. E em segundo lugar, tarefa Katie, também é uma corda. Agora aqui podemos verificar, ok, duplicar uma placa. Caso contrário, precisamos lançar um erro. É aqui que o ouvido lançou um erro para você. E aqui podemos dizer que não é possível obter o ID da placa do URL. E agora precisamos fazer exatamente o mesmo para nosso ID de tarefa. Este é o caminho aqui. Vamos tentar fazer a tarefa AD e estamos tentando fazer com que a tarefa seja diferente. E agora aqui queremos escrever mais uma Eva e verificar aqui a tarefa AD. Então, aqui podemos escrever, não é possível obter o ID da tarefa do URL. Mas, na verdade, aqui cometi um grande erro é que você pode ver que temos um ID de placa e ID de tarefa, mas com o Taskade, está tudo bem. É este mapa de parâmetros de instantâneo de rota. Mas com Boyd AD, não está tudo bem porque queremos ler todas essas informações de nossos pais. É por isso que aqui devemos tentar route dot parent, e aqui devemos colocar um ponto de interrogação e, em seguida, mapear programas instantâneos. Nesse caso, vamos lê-lo diretamente dos pais. E agora, após essas duas verificações, podemos simplesmente atribuir a essa tarefa AD, e isso é uma string agora, e aqui também temos esse ID de placa e também é uma string. Agora, aqui podemos implementar o método go to board, mas para este útero deve injetar aqui. Além disso, grite para mudar sua rota. Então, aqui temos nosso roteador. E agora, dentro desse método, podemos simplesmente escrever essa rota e navegar exatamente como fizemos anteriormente. E aqui queremos embarcar. E como segundo parâmetro , é essa placa. Neste caso aqui, o URL será pontos cortados, ID do quadro de barras. Vamos verificar isso. Estou recarregando a página aqui. Estou dentro da tarefa e aqui estou clicando em Cross. E depois de clicar onde eles pularam diretamente insight slash id. E, o mais importante, não tivemos um recarregamento de página. Não precisamos buscar dados para essa parte porque todos os dados estão lá. E agora podemos simplesmente abrir uma segunda tarefa, fechá-la, e ela é muito fácil e rápida porque não precisamos buscar informações adicionais aqui. 44. Obtenha tarefas e colunas: Neste cupom de vídeo para falar sobre fluxos de dados dentro do nosso modelo de tarefas. É aqui que será realmente interessante. Por que isso? Como eles realmente já tinham todos os dados de cada modelo dentro do nosso quadro, só precisamos usar esses dados e mapeá-los corretamente dentro do modelo de tarefas. É aqui que a primeira coisa que quero fazer é injetar aqui nosso serviço de diretoria que já temos e não o serviço de placas para não funcionar com a torta, mas nosso serviço de diretoria com o estado. Agora, aqui, antes de tudo, quero encontrar a tarefa. E, na verdade, aqui, por exemplo, após esse ID da placa dentro do construtor, podemos apenas escrever que essa tarefa era mais alta e será o nosso fluxo da tarefa atual que abrimos. E aqui podemos realmente experimentar esses serviços esportivos. E aqui temos nosso fluxo com todas as tarefas do nosso conselho. E como você pode ver, ele já está disponível, mas não precisamos de toda a gama de nossas tarefas. É assim que o boop quer usar o mapa. É por aqui que podemos escrever por mapa e depois citar onde obter acesso a todas as nossas tarefas. E agora só precisamos encontrar uma tarefa específica que precisamos para esse modelo de tarefa. Então, aqui eu quero apenas retornar tarefas encontrar, e aqui dentro, teremos acesso a cada tarefa. E aqui nós apenas pegamos essa tarefa pelo AD e a comparamos com essa tarefa AD que aqui no topo dentro do construtor. Então, na verdade, o que isso faz, transforma nossas tarefas de serviço de stream board. E aqui estamos apenas mapeando a tarefa única e aqui estamos recuperando. Mas não é tudo, na verdade, depois do mapa. Eu quero escrever filtro e aqui dentro eu quero fornecer booleano. Por que estamos fazendo isso? Porque, na verdade, pode acontecer que no início não tenhamos uma tarefa porque não buscamos todas essas tarefas aqui, que na verdade significa onde saltar para construtor dentro do nosso modelo, este é o nosso fluxo. Tasks é simplesmente uma matriz vazia. Aqui tentamos encontrá-lo e não conseguimos e obtemos um indefinido, mas indefinido não está interessado em rápido. Foi aqui que escrevi o filtro Boolean e ele simplesmente se livrará de cada indefinido nele. Agora, neste caso aqui, esse fluxo não será cumprido até que possamos encontrar uma tarefa. Então, agora vamos tentar usar esse corte dentro do nosso HTML. Aqui no topo, devemos criar um formulário embutido, o título atualizado da nossa tarefa. E podemos simplesmente escrever aqui nosso formulário em linha que já foi usado centenas de vezes. E então lado primeiro de tudo, devemos definir uma classe, e aqui teremos modelo de tarefa adicionado título fórum. Depois disso, queremos definir nosso texto padrão. E, na verdade, aqui precisamos fornecer o título da tarefa. Mas, novamente, quero escrever ainda melhor. Poderíamos usar esse fluxo dentro do nosso HTML. Mas, como já falei anteriormente, podemos combinar diferentes fluxos de dados dentro de uma única propriedade, e isso é exatamente o que podemos fazer agora, aqui podemos escrever esses dados eram mais altos e podemos usar aqui combinado mais recente, assim como usamos anteriormente e, na verdade, mais tarde, não teremos aqui apenas uma tarefa, pelo menos também teremos obter aqui uma lista de nossas colunas por isso, porque na verdade temos um select para alterar a coluna em que esta tarefa está. Este é o caminho aqui. Em primeiro lugar, teremos nossa tarefa e, mais tarde, adicionalmente, aluno aqui, fluxo para as colunas. E aqui precisamos mapear todos esses dados e queremos converter nossa matriz para o objeto. Aqui. Em primeiro lugar, vamos conseguir nossa tarefa. Aqui. Precisamos devolver apenas uma tarefa. Agora, aqui devemos criar esses dados dentro desse componente, desta forma aqui no topo. Em primeiro lugar, devemos mudar o dólar da tarefa para observável. E aqui estamos obtendo nossa interface de tarefas e nunca agora porque a verificamos com filtro. E agora aqui também precisamos dos dados que roubamos. E aqui também teremos um observável do objeto. E aqui temos nossa tarefa, que é uma interface de tarefas. Agora, os dados estão prontos, na verdade, dentro do HTML, podemos usar esses dados diretamente. É aqui que aqui no nosso div superior, vou tentar. E G, Aqui temos nosso fluxo com dados como, e aqui estamos obtendo dados, o que na verdade significa que agora em todo o arquivo, podemos apenas usar dados. Isso é y aqui dentro do texto padrão, podemos fornecer tarefa de ponto de dados, título de ponto. E depois disso, precisamos fornecer um título dentro do formulário, também será um título de ponto de tarefa de dados. E como você pode ver, não temos fluxos aqui, mas, na verdade, aqui dentro dos dados, criamos um fluxo de tarefas, que é uma string baseada em nosso fluxo, onde temos uma variedade de tarefas. E a última coisa é uma saída aqui e aqui temos nosso identificador submit, por exemplo, update task name. E aqui dentro de onde conseguir um evento. E eles só querem criar essa função dentro do nosso componente. Não vou implementar nada aqui. Então, aqui estamos obtendo o nome da nossa tarefa. Que é uma corda, as costas estão vazias. E agora eu só quero escrever aqui o log do console. Este é o nome da tarefa de atualização, e aqui estamos obtendo o nome da tarefa. Vamos verificar se está funcionando. Não temos nenhum erro aqui e eles simplesmente recarregarão a página. E como você pode ver diretamente aqui, estamos recebendo minha primeira tarefa. Como isso funciona? Aqui nós construímos nossa tarefa de stream, que é baseada em nossas tarefas e na verdade, depois de páginas muito quando não obtemos um erro. E nós poderíamos potencialmente obtê-lo. Na verdade, não porque temos aqui na GE com Chegg, mas é sempre bom escrever filtro booleano só para saber que estamos no lado seguro. E aqui estamos recebendo nossa primeira tarefa dentro desse fluxo de dados. Aqui podemos mudar isso diretamente, minha primeira tarefa e atualizada. E como você pode ver, este é o nosso registro do console. Obviamente, ainda não implementamos a atualização, mas estamos no caminho certo. Agora. Podemos escrever exatamente o mesmo código com a descrição do nosso formulário embutido. É por isso que eu quero voltar para dentro do nosso HTML. Aqui está nosso interior a partir da descrição. E, na verdade, aqui podemos apenas experimentá-lo em linha, como fizemos para o título. E aqui já temos os dados dentro do fluxo de dados. Este é o caminho aqui. Em primeiro lugar, nosso modelo de tarefa de classe , edição, descrição, formulário. E depois disso, em primeiro lugar, temos aqui o texto padrão. Aqui vamos tentar a descrição da tarefa de dados. E aqui eu quero escrever, ou porque na verdade uma descrição dentro da tarefa não é obrigatória, o que significa que em algum momento ela será uma string vazia. Este é o caminho aqui, adicione uma descrição mais detalhada. Depois disso, também queremos definir nosso título. É por isso que a descrição da tarefa de ponto de dados. Também queremos fornecer aqui no exterior, e este é o nosso primeiro uso da área de texto. Este é o caminho aqui. O tipo de entrada é a área de texto também tem a propriedade Button deve ser definida como true. E depois desse botão, o texto pode ser configurado para salvar. E também precisamos fornecer aqui eu cuido do envio. Aqui, vamos chamá-lo, atualizar a descrição da tarefa. Aqui estamos recebendo nosso evento, na verdade. Aqui devemos criar a função, mas será exatamente a mesma. É por isso que vou copiar, colar, atualizar o nome da tarefa e apenas alterar o nome e o log do console. Mas, obviamente, não é um nome de tarefa, mas uma descrição da tarefa. Vamos alterá-lo e o log do console e verificar se está funcionando. Como você pode ver aqui, estamos recebendo um tipo de erro indefinido. Não é atribuível ao tipo string. Na verdade, é um ponto válido do TypeScript porque nosso interior deseja obter apenas uma string e não uma indefinida aqui. É por isso que podemos simplesmente experimentá-lo ou uma string vazia. Isso é totalmente bom. Como você pode ver agora, não temos um erro. Aqui estamos obtendo agora minha descrição, que é uma descrição real da nossa tarefa. Podemos alterá-lo e clicar em Enter. E, na verdade, aqui está uma área de texto, então Endo não ajuda. Devemos clicar no botão Salvar. E aqui estamos recebendo atualizações internas do console, descrição da tarefa, minha descrição, o que na verdade significa que nossa empresa no interior está trabalhando e nosso fluxo também está fornecendo dados rapidamente. E agora vamos falar sobre colunas. Na verdade, é ainda mais fácil. Devemos simplesmente pular , digamos, modelo de tarefa. E aqui precisamos desse fluxo para as colunas do nosso quadro. E, na verdade, não precisamos nem mesmo criar propriedades adicionais aqui dentro do mais recente combinado, posso simplesmente escrever este cão de serviço do conselho. E aqui temos colunas de fluxo e podemos simplesmente empacotar uma matriz de colunas aqui dentro deste componente, e estamos prontos para ir. Então, aqui estamos conseguindo nossa tarefa. E em segundo lugar, as colunas aqui dentro do objeto boop querem retornar essa matriz de colunas. E agora aqui podemos usar essas colunas para construir um select dentro do nosso Markov. Então, na verdade, aqui temos um formulário e dentro dele queremos escrever um select. Vamos fazer isso agora. Em primeiro lugar, aqui estará S Select e queremos escrever aqui nome do controle do formulário porque, na verdade precisamos incorporá-lo a partir do Grupo. Por que estamos fazendo isso? Porque, na verdade, é muito mais fácil trabalhar com formulários reativos se você tiver, por exemplo, um Select. Este é o caminho aqui. Vamos criar um grupo de formulários. E aqui queremos criar, por exemplo, formulário de coluna. E aqui dentro do select, podemos simplesmente empacotar o nome do controle do formulário, e será o ID da nossa coluna. E aqui também devemos fornecer a seleção da coluna de classe. Agora, dentro do select, queremos renderizar todas as nossas opções e será nossa matriz de colunas. Esta é a maneira aqui, opção dentro do G4, estamos renderizando aqui com apenas um loop através de nossas colunas porque as temos em colunas de pontos de dados e não precisamos nos preocupar com fluxos aqui. Também aqui queremos usar no valor G e fornecer o valor dentro da opção R. Isso será o ponto da coluna AD porque estamos percorrendo eles. Vamos fechar essa opção e executar o interior de cada opção no título. Então, aqui vamos apenas executar o título do ponto da coluna. Vamos verificar se está funcionando. Estou pulando aqui e estamos recebendo um erro e o valor G é desconhecido. E antes de tudo, devemos criar nosso formulário. É por isso que vamos voltar atrás e definir nosso componente. E aqui no topo, devemos criar um formulário para apenas uma única propriedade. Então, aqui vou tentar que tenhamos nosso formulário de coluna. E é esse FB. E na verdade nós não injetamos aqui se p. Então vamos fazer isso agora. Se B é como sempre, apenas construtor de formulários, e aqui escreveremos esse grupo F B e dentro passaremos nossos controles. E aqui temos apenas um ID de coluna, mas não precisamos de mais nada. E, por padrão, será. Agora, aqui ainda temos essa Sarah. E, na verdade, porque não injetamos formas reativas dentro do módulo da placa. Portanto, devemos pular para trás e configurar nosso módulo de placa. E bem aqui dentro do módulo de formulários reativos de entrada, como você pode ver agora, estamos recebendo outro erro dentro do nosso HTML. E aqui estamos obtendo colunas que não existem no tipo Task interface porque na verdade não estendemos nossa interface. Aqui no topo temos fluxo de dados e aqui dizemos que só temos uma tarefa e isso não é verdade. Temos aqui colunas, e esta é apenas uma matriz da nossa interface de coluna, como você pode ver agora dentro do nosso console com não há nenhum erro. Então, vamos verificar isso. Agora estou recarregando o paciente aqui, agora temos nosso incrível select e não vemos nenhum valor porque não fornecemos um valor padrão. Agora, aqui podemos abrir esse select e podemos escolher entre diferentes colunas. E como você pode ver, isso é diretamente nossas colunas que temos dentro do quadro. Agora, a única última coisa que eu quero implementar, definindo o valor padrão dentro do select, porque na verdade, por padrão, temos uma coluna e essa tarefa está situada em alguma coluna. E podemos fazer isso facilmente porque temos fluxos. Então, aqui podemos apenas usar essa tarefa foi roubada porque temos o fluxo. E aqui sabemos que estamos conseguindo nossa tarefa e podemos simplesmente escrever Assine aqui e teremos acesso à nossa tarefa. E agora precisamos atualizar nosso formulário. Então, aqui temos acesso a esse formulário de coluna, qual valor, e se você não sabe o que o valor de pitch está fazendo, ele atualiza as propriedades dentro do formulário. Então, aqui devemos fornecer campos a um objeto. E, no nosso caso, isso é apenas um ID de coluna de campo único. Por dentro, queremos fornecer um ideal para a coluna dessa tarefa. É o ID da coluna do ponto da tarefa, o que na verdade significa dentro do construtor inicializar onde se inscreve no fluxo de tarefas. E quando estamos recebendo nossa tarefa aqui, estamos corrigindo o valor. Como você pode ver agora, em vez do navegador, estamos recebendo nossa primeira coluna. Mas o que eu não gosto aqui, estamos usando a assinatura novamente sem cancelar a inscrição. É por isso que eu quero fazer exatamente o mesmo que fizemos dentro do nosso quadro. Em primeiro lugar, aqui devemos criar nosso cancelamento de inscrição. E isso está em uso, onde por dentro estamos fornecendo vazio. E agora aqui queremos criar em G ao destruir. Este é o caminho aqui, implementos neste Troy. E em algum lugar após o construtor, podemos criar em junho, a greve e o insight com, em primeiro lugar, queremos chamar esse cancelamento de inscrição em seguida e depois concluir. Então, esses cancelamentos de inscrição são concluídos. E depois disso, não devemos esquecer antes de assinar o tubo de gravação. E aqui, até aqui, estamos fornecendo a eles esses cancelamentos de inscrição que acabamos de criar. Nesse caso, estamos no lado seguro emDestruir este componente. Nossa assinatura também será destruída. 45. Atualizar a tarefa: Neste vídeo, devemos implementar a atualização de nossa tarefa do início ao fim. E, na verdade, dentro de uma tarefa, temos três coisas diferentes. Em primeiro lugar, aqui temos um formulário embutido para o nosso título, para todos os implementados. E estamos chegando aqui o registro do console. Na verdade, essa é uma atualização parcial da nossa tarefa. Temos exatamente a mesma lógica com a descrição. Aqui podemos simplesmente alterá-lo e clicar em Salvar. Mas também aqui temos uma mudança de nossa coluna e, na verdade, não lidamos com isso e devemos fazê-lo. E isso também é uma atualização da tarefa. Mais importante ainda, todas essas são atualizações parciais que devemos atender para nosso back-end porque queremos notificar todos os nossos clientes sobre essa mudança dentro da tarefa, o que realmente significa que nossa lógica será exatamente como na parte interna anterior, estamos emitindo algo no cliente, no back-end, fazemos algo em nosso banco de dados, por exemplo, tarefa de dados da web. E depois disso, estamos notificando todos os nossos clientes que estão inscritos nesse quadro específico. E a primeira coisa que precisamos fazer é criar novos eventos de soquete. Vamos começar desta vez com o cliente. E dentro de nossos tipos de fragmentação de aplicativos de origem, temos eventos de soquete. E, na verdade, aqui eu vejo tarefas Criar, e agora precisamos exatamente o mesmo com a atualização de tarefas do PS. E aqui temos sucesso e fracasso como sempre. E aqui podemos alterar o nome para tasks, update, update success e update failure. Para que nosso evento esteja pronto, Nobu deve implementar um novo método dentro de nossas tarefas de serviço de camisas, porque, como anteriormente, queremos esconder nosso soquete dentro desse método dentro das tarefas de compartilhamento. Este é o caminho aqui. Vamos criar nosso método que atualizará a tarefa. Aqui. Em primeiro lugar, estamos recebendo nosso ID do conselho porque precisamos saber quais usuários devemos notificar. É aqui que ouvir aniversário, essa string também precisará de um ID de tarefa porque precisamos saber qual tarefa devemos atualizar. E por último, mas não menos importante, aqui está uma lista de campos. E aqui teremos um objeto em que todos os nossos campos não serão obrigatórios. É por isso que estou escrevendo com um interrogação para que possamos atualizar nosso título. É uma corda. Também podemos atualizar nossa descrição. Também é opcional e string. E aqui também temos nossa coluna e nossa senhora da coluna é onde nossa tarefa está situada. E aqui estamos ficando vazios. A única coisa que devemos fazer aqui é o socket meet. É por isso que socket service summit. E aqui queremos usar nosso novo método, eventos de soquete em m ponto. E temos aqui nossas atualizações de tarefas começam aqui como o segundo parâmetro, devemos fornecer um objeto com todos esses campos. Em primeiro lugar, é um raio de borda, depois o ID da coluna e, em seguida, nosso objeto com campos. E como você pode ver aqui, eu cometi um erro de digitação. Não é continuidade , mas ID da tarefa e por causa do TypeScript com ver diretamente um erro. Então, agora podemos voltar atrás e definir nosso componente e fazer as mudanças necessárias. E aqui temos o nome da tarefa de atualização e a descrição da data. Aqui, em ambos os casos, queremos chamar esse método de tarefa de atualização. Este é o caminho aqui no topo com primeiro de tudo, deve injetar essas tarefas serviço que acabaram de ser atualizados. E é um serviço de tarefas. Depois disso, podemos simplesmente escrever aqui este serviço de tarefas, e aqui está nossa nova tarefa de atualização de método e depois dizê-la. Em primeiro lugar, devemos escolher uma placa EM este ID de placa aqui é de uma tarefa ou temos aqui ID de tarefa? Sim, nós temos, nós definimos isso aqui dentro do construtor. Então aqui também podemos escrever este ponto faz KD, e aqui temos nossos campos. Nesse caso, só precisamos atualizar o título. É assim que podemos dizer título, Tarefa, Nome, e como você pode ver aqui, estamos recebendo um ID de coluna de propriedade estranho faltando no tipo, o que na verdade significa que fiz algo errado. E eles já podem ver o problema aqui. Column lady também é opcional. Não deve estar lá sempre. É aqui que está aqui. Você pode ver agora que não estamos recebendo um erro porque todos os nossos campos podem ser indefinidos. E aqui só precisamos fornecer um título. Então, aqui nós atualizamos o nome da nossa tarefa. Agora posso copiar e colar esse código e atualizar aqui nossa descrição. Aqui vou apenas fornecer uma descrição, e esta é a descrição da nossa tarefa a partir do parâmetro e agora é a parte mais interessante. Devemos lidar com essa mudança desse único select. E, na verdade, esta é uma forma reativa, o que é realmente bom porque podemos reagir às mudanças de forma completamente reagida. O que eu quero escrever aqui é este formulário de coluna de pontos Gad. E aqui podemos obter o ID da nossa coluna, mas, na verdade, aqui queremos reagir às mudanças de valor e as mudanças de valor reais nos devolverão e observáveis, o que na verdade significa que podemos escrever aqui subscrever. Mas como você pode ver aqui, estamos recebendo um aviso do TypeScript de que possivelmente esse campo pode ser agora, mas não no nosso caso, porque no nosso caso, sempre se diz que é aqui que realmente aqui estamos pode suprimir esse aviso apenas usando o banco aqui. Nesse caso, estamos dizendo TypeScript, não se preocupe com a verificação que essa propriedade está lá. E como você pode ver agora aqui, as mudanças de valor são observáveis. Aqui é onde eu posso agora tentar me inscrever e, em seguida, obter aqui o que está dentro desta coluna senhora após a mudança, que na verdade significa comer esta coluna senhora quando era atualizado. E agora eu só preciso escrever o log do console de inserção. ID da coluna alterada. E aqui podemos verificar se está realmente funcionando. Vamos recarregar a página. Como você pode ver aqui dentro do console, estou mudando a coluna que eles D, e aqui está o ID da nossa coluna. E, na verdade, isso é um problema porque o que queremos fazer agora dentro desta assinatura, queremos acionar uma mudança para o back-end, como fizemos aqui com a tarefa de atualização. Mas não faz sentido acioná-lo no início, quando temos o mesmo ID de coluna, nós realmente queremos ser muito complicados quando o alteramos. É por isso que o que podemos escrever aqui. Podemos verificar se a coluna carente, o que foi alterado não é o mesmo que metade válida. Mas aqui também, o problema, temos essas informações apenas dentro do nosso fluxo de tarefas, o que na verdade significa que devemos combinar esses dois fluxos juntos. É por isso que aqui podemos usar lasers combinados, assim como fizemos anteriormente. E aqui podemos fornecer, primeiro lugar, essa tarefa era mais alta. E aqui depois disso, esse fluxo que escrevemos aqui na parte inferior, vou apenas colá-lo como um segundo parâmetro. E esse último combinado nos dá de volta uma matriz, o que na verdade significa que aqui temos acesso à nossa tarefa e depois disso ao nosso id de coluna do formulário. E aqui agora eu posso registrar os dois no console. Aqui eu quero ver antes de tudo, mudou a senhora da coluna e, mudou a senhora da coluna e segundo lugar, o que temos dentro da tarefa. E, na verdade, aqui queremos verificar o ID da coluna do lote da tarefa. Vamos dar uma olhada nisso. Estou recarregando a página e estamos conseguindo os dois anos oitenta. E como você pode ver, eles são semelhantes, o que na verdade significa que esse é exatamente o caso quando não precisamos fazer nada. Então, o que queremos escrever aqui, se nossa coluna de tarefas eles D não for igual ao nosso id de coluna, então precisamos fazer uma atualização. Aqui podemos simplesmente escrever esse serviço de tarefas exatamente como fizemos na tarefa de atualização inferior. E aqui dentro foram fornecidos. E primeiro de tudo, esse ID do quadro, depois a tarefa, temos dentro do ID do ponto da tarefa, e aqui estão nossos campos. Dentro dos campos, só temos nossa propriedade de id de coluna. Então, como você pode ver, o JS de Eric realmente nos ajuda a trabalhar em conjunto com formas reativas, fluxos, nossos próprios fluxos ou um caminho que é extremamente eficiente. Agora podemos remover esse código comentado. Não precisamos mais disso. Mas o que eles querem fazer aqui, eu quero escrever para lidar com o cancelamento de inscrição neste caso aqui, não teremos uma assinatura de arma de fogo. É aqui que devemos pegar o tubo reto até que, como já fizemos aqui. E dentro desses cancelamentos de inscrição e na verdade, nossa parte de front-end do código está completamente pronta. Agora devemos tentar o material padrão no back-end, o que na verdade significa que, antes de tudo, devemos copiar e colar eventos. Em seguida, precisamos criar uma nova assinatura para esse evento e, em seguida, implementar um novo método dentro do controlador para atualizar uma tarefa. Vamos fazer isso agora. Em primeiro lugar, quero entrar nossos eventos de soquete e copiar e colar a atualização de tarefas. Depois disso, podemos entrar nos tipos de origem de um servidor. Aqui temos nossos eventos de soquete e, na parte inferior, posso colar esses três novos eventos. Agora podemos pular de volta para dentro ou para a irmandade S. E aqui na parte inferior podemos adicionar uma nova tonelada de soquete. Aqui, queremos ouvir nossos eventos de soquete em m ponto. E aqui temos nossas tarefas atualizadas aqui com não quero chamar um controlador de colunas, mas controlador de tarefas. E aqui temos uma nova função, tarefa de atualização, e devemos fornecer informações sobre seu soquete e dados. Agora é hora de criar essa tarefa de atualização. E, na verdade, preciso copiar e colar da atualização de colunas porque será super semelhante, como você pode ver aqui, temos a coluna de atualização. Vou copiar, colar todo o método e pular e dizer tarefas, e colar aqui na parte inferior. Agora vamos mudar isso aqui. Em primeiro lugar, temos nossa tarefa de atualização e estamos obtendo aqui os dados. Então, o que obtivemos dentro dos dados? Era uma identificação do conselho. Então temos aqui no ID da tarefa, e dentro de nossos campos, temos três campos. Em primeiro lugar, título, é opcional. Então podemos obter aqui a descrição. Também é uma string opcional. E por último é a nossa coluna eles D, que também é opcional. Agora vamos atualizar nosso festival try and catch aqui, estamos verificando a atualização das colunas que está desenhada, precisamos alterá-lo para nossas tarefas. Falha na atualização. Aqui estamos enviando o usuário não está autorizado, também devemos alterar a falha dentro da gaiola. Então, aqui também teremos falhas de atualização de tarefas. E agora aqui devemos mudar nosso modelo. O modelo de tarefa encontrado por ID e atualização está totalmente correto. E aqui temos nosso ponto de dados, e aqui temos nosso ID de tarefa. Aqui, simplesmente jogamos todos os campos de dados que temos dentro e eles serão atualizados com o que fornecemos. Aqui de volta, estamos recebendo uma tarefa atualizada e queremos enviar essa tarefa atualizada para o nosso cliente. E aqui estamos fornecendo o ID da placa de dados. Isso é totalmente bom e a demanda aqui é o sucesso da atualização de tarefas. E aqui dentro, estamos fornecendo nossa tarefa atualizada. Portanto, terminamos totalmente com nossa parte de back-end, mas devemos no cliente, também escrever uma escuta para notificar todos os nossos clientes sobre mudanças. Portanto, devemos lidar com a Cúpula sobre o cliente. E para isso, é preciso voltar para dentro do aplicativo de origem de nossos clientes , Serviços de placa, serviço de placa por aqui, porque na verdade simplesmente precisamos escrever uma lição dentro dos componentes de nossa placa sem precisa escrever ouvir dentro do modelo da placa porque o modelo realmente comprado simplesmente usa nossos fluxos a partir daqui, o que na verdade significa apenas se inscrever dentro do nosso componente de placa. Aqui, chamaremos um método para atualizar na tarefa dentro do nosso fluxo de tarefas. É por isso que aqui eu só quero dar uma olhada em nossa coluna de atualização, porque ela será muito semelhante à nossa tarefa de atualização. E, na verdade, podemos copiar e colar totalmente. Então, vamos mudar isso agora. Aqui temos nossa tarefa de atualização. Estamos chegando aqui são tarefas atualizadas, que na verdade está na interface do crepúsculo. Aqui, precisamos fazer exatamente as mesmas coisas, basta atualizar uma única tarefa dentro de nosso array. Então, aqui estamos recebendo tarefas atualizadas e aqui estamos usando nossas tarefas de fluxo para obter valor e estamos obtendo acesso a todas as tarefas. Agora, aqui estamos verificando, ok, nosso ID de tarefa deve ser igual ao AD de nossa tarefa atualizada. Neste caso, aqui devemos retornar, estamos espalhados essa tarefa e queremos atualizar aqui apenas um título. E na verdade isso não é válido porque aqui precisamos retornar mais aqui. Em primeiro lugar, a tarefa atualizada, o título, mas também devemos atualizar aqui nossa descrição, pois pode acontecer que a atualizemos. É aqui que ouvimos a descrição atualizada do ponto da tarefa e o último aqui será nossa coluna carente, e também é atualizado o ID da coluna do ponto da tarefa. Agora parece totalmente bom. E em outro caso, nós apenas retornamos nossa tarefa. E depois disso, precisamos atualizar nosso fluxo de tarefas com algumas tarefas atualizadas para que nosso método esteja totalmente pronto, agora só precisamos voltar e definir nossa placa de componentes, componente da placa. E aqui devemos criar mais uma lição, palestra. Quero descobrir aqui sucesso da nossa atualização do cone porque será super semelhante. Aqui está. Vou apenas copiar e colar. E aqui precisamos mudar isso. Em primeiro lugar, de volta, estamos recebendo nossa interface de tarefas e aqui está sucesso da atualização das tarefas Socrative e C num dot. Agora, aqui temos nosso cancelamento de inscrição e volta, estamos recebendo nossa tarefa atualizada. E agora aqui podemos simplesmente chamar esse método que acabamos de criar, essa tarefa de atualização. E aqui dentro, devemos fornecer nossa tarefa atualizada que estamos obtendo do back-end. Nesse caso, aqui com esse código, atualizaremos o fluxo de tarefas para cada cliente que estiver inscrito em nossa página. Vamos verificar agora se seguir um código está funcionando aqui. Não temos nenhum erro no front-end, nenhum erro no back-end. Agora vamos abrir nosso site e, na verdade, quero duplicar a guia para que possamos verificar com outro cliente. Então, aqui abrimos minha primeira tarefa e eles só querem atualizar um título aqui. Vamos escrever na íntegra e pressionar Enter. E como você pode ver, ele foi atualizado diretamente aqui, aqui no quadro. E também na próxima etapa, ele também foi atualizado, que na verdade significa que o atualizamos com sucesso no back-end, notificaremos os clientes legais com esta assinatura de escuta, quando atualizada o riacho e agora todos os lugares que estão inscritos nos riachos foram dramaticamente traseiros. Isso está funcionando muito bem. Agora vamos verificar se podemos alterar uma coluna. Então aqui eu quero selecionar a segunda coluna, atualizada e algum número. E como você pode ver diretamente, essa tarefa desapareceu da primeira coluna e agora está aqui dentro da segunda coluna. Ele foi atualizado dentro do nosso formulário. E aqui na próxima etapa Vemos minha primeira tarefa, que também é atualizada na próxima coluna. O que realmente significa que implementamos com sucesso a atualização de nossa tarefa e também a movemos entre nossas colunas. 46. Excluir tarefa: Neste vídeo, implementaremos o último recurso dentro do nosso projeto, e isso é a exclusão das tarefas. Vamos fazer isso agora. Em primeiro lugar, quero começar a partir do nosso servidor aqui, mas devo entrar em nossos eventos de soquete de tipos de origem e criar três novos eventos de soquete. Porque, na verdade, queremos notificar todos os outros clientes que foram removidos de uma tarefa. É por isso que faremos isso por meio de eventos de soquete. É aqui que vou copiar, colar, atualizar tarefas, basta alterá-lo para tarefas, excluir. E aqui à direita, podemos alterá-lo para tarefas, excluir, tarefas, excluir sucesso e tarefas excluir falha. Depois disso, podemos pular dentro dessas celebridades e da nova tonelada. Então, aqui devemos chamá-lo de ponto, e aqui temos nossas tarefas delete, que é um padrão. E aqui está nosso controlador de tarefas onde estamos chamando nossa tarefa de exclusão. E agora, na verdade, eu quero copiar e colar nossa exclusão da coluna. Vai ser super parecido. Como você pode ver aqui no topo, temos o método delete column e eles simplesmente copiam e colocam dentro de nossas tarefas aqui na parte inferior. E agora vamos mudar esse método. Em primeiro lugar, não exclui a coluna, mas exclui a tarefa. E o que estamos recebendo aqui, estamos ficando entediados, eles precisam notificar todos os nossos clientes. E aqui devemos obter apenas a tarefa Katie, para saber o que precisamos remover. E aqui temos nosso erro e só precisamos chamar aqui tarefas falha de exclusão. E aqui dentro de nossa gaiola, também podemos chamar tarefas de falha de exclusão. Agora, aqui, em vez do modelo de coluna, podemos apenas usar um modelo de tarefa, excluir um ponto, e simplesmente excluímos nossa tarefa pelo ID da tarefa que fornecemos. E depois disso, não definimos todos os nossos clientes com essas tarefas de soquete. Exclua o sucesso aqui Beckwith, só preciso dar um D a uma tarefa porque não temos mais informações e essas informações são suficientes para nosso cliente entenda qual tarefa deve ser removida. Agora devemos continuar com caminho do cliente e, para isso, é preciso copiar e colar esses três eventos de soquete que acabamos de criar. Voltarei para dentro da fonte AB de nossos clientes, tipos compartilhados, eventos de soquete. E aqui na parte inferior , podemos adicioná-los. E agora precisamos atualizar nosso serviço para trabalhar com tarefas. E o que queremos fazer aqui, queremos criar um novo método que será removido na tarefa. Este é o caminho aqui. Vamos criar uma tarefa de exclusão. E sabemos que simplesmente fornecemos aqui um ID de placa, que é uma string. E também precisamos aqui do nosso ID de tarefa, e também é uma string. E de volta estamos chegando aqui vazios. E agora, por dentro, podemos simplesmente chamar nossa imagem de ponto de serviço de circuitos. Aqui está mostrando tarefas de ponto de cinema de evento de soquete de evento excluídas aqui como o segundo parâmetro. Estamos fornecendo nossas opções, que são, em primeiro lugar, AT do conselho e, em segundo lugar, nosso ID de tarefa. E com isso, nosso método de API está completamente pronto. Agora devemos entrar no módulo da placa e no serviço da placa. E, na verdade, aqui precisamos um novo método, como delete column, mas será uma tarefa excluída e na verdade, o código será super semelhante porque aqui só queremos filtrar um específico tarefa do nosso array. É aqui que vamos alterá-lo para excluir tarefa, e aqui está um argumento de que estamos recebendo nossa tarefa AD. É aqui que queremos percorrer nosso fluxo, que é o Task Stream obter valor aqui, onde eu obtenho acesso a cada tarefa. E estamos comparando nossa tarefa k, d com a id da tarefa que precisamos remover. E aqui para trás obtendo tarefas atualizadas. E agora queremos atualizar nosso fluxo, que é nossa Reserva de fluxo de tarefas e você atualizou o array de tarefas. Então, criamos com sucesso nossa tarefa de exclusão para o estado do conselho. E agora aqui eu também quero remover esse comentário. Não precisamos mais disso. Agora, precisamos criar algum HTML para remover nossa tarefa. É aqui que devemos pular para trás e disse nosso modelo de tarefa de componentes. E aqui na parte inferior do nosso componente de modelo de tarefa HTML, temos ações, e aqui temos uma exclusão com uma imagem. E, na verdade, agora nesta div, podemos simplesmente adicionar o evento click e chamar aqui um novo método que será excluído tarefa. Agora vamos criar essa tarefa de exclusão dentro do nosso componente. Aqui não precisamos de nada, só precisamos desse ID de tarefa e desse ID de placa, e já os temos. É por isso que aqui podemos simplesmente escrever este serviço de tarefas Dot Delete Task e estamos fornecendo-os dentro. Então, aqui neste ponto, nesta tarefa KD, então nossos clientes emitiram com sucesso esse evento para o back-end. back-end atualizou nossa tarefa e notificou todos os nossos clientes. Mas, na verdade, devemos nos inscrever com a escuta em diferentes lugares. Em primeiro lugar, queremos fazer isso aqui dentro do nosso modelo de tarefas. E em segundo lugar em nosso quadro, e na verdade dentro do quadro, simplesmente precisamos chamar esse método que criamos Delete Task apenas para atualizarmos um fluxo. Mas o que eu quero fazer aqui, eu não quero diretamente dentro da tarefa de exclusão para ir para a nossa página do quadro. Na verdade, faz sentido, mas não temos certeza se removemos com sucesso na tarefa. É por isso que eu não quero escrever código aqui. Eu realmente quero escrever ouvir, por exemplo, dentro do nosso construtor. Para isso, devemos injetar aqui nosso serviço de soquete. É aqui que ouvimos o serviço de circuito privado e estamos recebendo aqui nosso serviço de soquete. E agora aqui no construtor Sul por exemplo, na parte inferior, podemos simplesmente escrever esta lição de serviço de soquete. Aqui, deve fornecer isso recuperando a tensão. E esta é a tarefa k d que estamos removendo. Agora, aqui podemos usar eventos de soquete em m ponto e onde a assinatura de nossas tarefas exclui o sucesso. E aqui eu quero andar até estarmos no lado seguro e, em seguida, fornecer informações sobre o cancelamento da inscrição. E depois do cachimbo, podemos usar nossa assinatura e, na verdade, não nos importamos com Tuskegee. Nós simplesmente queremos ir muito amplo e já criamos esse método. Isto é, isso vai para o quê? Temos esse método diretamente aqui dentro deste arquivo, o que na verdade significa que quando estamos obtendo sucesso e nosso modelo é aberto, esse código voltará diretamente para o quadro porque podemos mostrar essa tarefa excluída mais. E agora eu quero copiar e colar esse código totalmente porque escreveremos exatamente o mesmo dentro do nosso quadro. E aqui, como você se lembra, estamos escrevendo todas essas ligações para o nosso serviço de diretoria. É aqui que faz muito sentido colocar esse código aqui. E em vez disso, vá para o quadro, tente aqui, esta palavra ponto de serviço. E aqui temos nossa tarefa de exclusão qual estamos fornecendo o ID da tarefa. E neste caso aqui precisamos dessa tarefa AD que estamos obtendo do back-end, e eles realmente foram totalmente implementados esse recurso. Agora vamos verificar se está funcionando, mas não há erros aqui e nenhum erro no back-end. Agora, vamos para o navegador. Aqui eu tenho minha primeira tarefa, então vamos removê-la agora, como você pode ver dentro das ações, temos essa exclusão e, em seguida, clique aqui delete e essa tarefa desapareceu completamente não vejo aqui dentro do tabuleiro, e não o vemos dentro do segundo quadro. E, na verdade, no sucesso , foi redirecionado com sucesso para o slash slash board ID, o que na verdade significa que implementamos com sucesso esse recurso, Fool Live do início ao fim. 47. Implementação: Concluímos com sucesso nosso projeto com a criação do clone do Trello e agora precisamos falar sobre implantação. E normalmente a implantação não é uma tarefa fácil e muitas pessoas têm dúvidas. Como o jogador deve projetar, como vamos gerenciá-lo, que serviço devemos usar para isso. E isso é realmente um problema. Existem centenas de empresas diferentes nas quais você pode pagar dinheiro e elas serão implantadas para o seu projeto. Mas antes de tudo, você deve comparar todas essas empresas, entender como implantar seu projeto, aprender suas ferramentas on-line e assim por diante. Não faz muito sentido. Na verdade, todas essas ferramentas fazem exatamente o mesmo. Eles estão configurando seu projeto em produção em um servidor real. E, na verdade, a melhor variante para aprender produção e implantação é implantar nosso projeto por nós mesmos em nosso próprio servidor. Essa é a base da implantação. É aqui que faz muito sentido aprender a fazer isso. Além disso, provavelmente será a variante mais barata, como você pode hospedar seu projeto. Sim, não será gratuito porque você deve pagar pelo servidor, mas não paga à empresa para gerenciar um servidor e não paga por algumas ferramentas gráficas para aplaudir seu projeto. É aqui que, neste vídeo, devemos alugar um servidor juntos, configurá-lo e, em seguida, implantar esse nosso projeto. E, na verdade, se você não quiser pagar pelo servidor, está tudo bem. Você pode simplesmente deixar seu projeto como está. E verificando disse o vídeo, como eu estou fazendo isso e faz uma empresa de servidores, eu mesmo uso hertz e este é um provedor de servidor bastante barato e confiável. E, na verdade, você pode escolher qualquer provedor de sua preferência. Você só precisa acessar o servidor virtual privado. Mas eu gosto do hatsune porque é confiável e não é tão caro. Como você pode ver aqui, podemos clicar na nuvem e verificar os preços aqui na parte inferior. Como você pode ver, existem muitos pacotes diferentes e o mínimo está aqui por anos e US $0,15, que é bastante barato para o mês de 20 terabytes, trágico dois gigabytes de RAM e processador de CPU. E, na verdade, estou usando esse menor servidor para dois projetos em produção, mas muitas pessoas estão chegando. E se você otimizar seu thriller de projetos, bom, então você está totalmente bem com um pequeno xarope. É por isso que neste vídeo alugaremos exatamente o xarope. Então, agora o primeiro passo é registrar dentro de seu filho um pente ou qualquer provedor que você gostaria de. Eu já tenho aqui uma conta e após o registro e confirmação do seu e-mail, você verá essa página. Na verdade, aqui, esse serviço em seu perfil estará vazio, mas este é meu próprio servidor web. Aqui eu quero clicar no servidor porque eles só querem, por causa deste curso, criar um novo servidor. Então, o primeiro aqui é a localização, realmente não importa. Podemos escolher aqui Helsinque ou o que você preferir. ferimento da imagem está totalmente bom. Não precisamos escolher nada. Aqui está o tipo padrão, totalmente bom. E aqui, o menor nível, que é para o seu, $0,15. Não precisamos mudar nada. Não precisamos de volumes, redes, firewalls, recursos adicionais, chave SSH e aqui apenas um nome. Podemos nomeá-lo aqui, trailer, assim como nosso projeto, para sabermos do que estamos falando. E como você pode ver aqui com não selecionamos nossa chave SSH, o que significa que receberemos um e-mail com o usuário root e a senha, que é totalmente bom rapidamente. Estou clicando aqui para criar e agora, e nosso servidor será criado. Como você pode ver, meu servidor já está verde e funcionando. E, na verdade, digamos, o e-mail, obtive minhas credenciais onde tenho um usuário root e a senha do nosso servidor. Agora devemos entrar no console e escrever SSH. E aqui estará, antes de tudo, nosso usuário root add. Em seguida, o endereço IP que temos aqui, basta clicar nele e ele será copiado e eles precisam colá-lo aqui. Então temos aqui SSH, root at, e aqui o artista AP. Estou pressionando Enter e estamos recebendo a mensagem. Garanto que você quer continuar. Onde bem aqui, sim. E pressionando Enter, como você pode ver aqui, estamos recebendo, em primeiro lugar, a pergunta sobre nossa senha. Então, precisamos pegar uma senha do e-mail e colar aqui. E depois disso, estamos recebendo muitas informações sobre nosso servidor. E iniciamos o processo de alteração da senha root e, na verdade, para alterar a senha com antes de tudo, devemos fornecer uma senha atual. É por isso que estou colando novamente e pressionando Enter. E agora devemos fornecer uma nova senha para nosso usuário root. E estamos fazendo isso só para que Kasner não saiba nossa senha. Aqui, fornecerei apenas 123. E mais uma vez, 123. E como você pode ver, estamos recebendo uma mensagem. Você deve escolher uma senha mais longa. Vamos fazer isso 12345678. E mais uma vez, e na verdade você deve entender que para o projeto de produção real, você deve criar uma senha segura e não assim, isso é apenas para o teste. Então, se você tem essa saída com root em L, Trello e hash aqui, isso significa que você conseguiu, nós olhamos dentro do observador. Aqui podemos fazer alguma coisa. Aqui eu quero mencionar algo importante. Não estamos falando neste curso sobre como gerenciar servidores com eficiência e segurança. O que realmente significa que mostrarei tudo, toda a implantação com nosso usuário root. Normalmente, em um projeto de produção real, você não quer fazer tudo com o usuário root. Você deseja criar outro usuário com permissões limitadas que pode simplesmente implantar um projeto. Então, novamente, usar a rota na produção é ruim, mas se você fizer isso como seu projeto de estimação, isso é totalmente bom. Nosso próximo passo aqui é trazer nosso projeto para dentro da calda. E, na verdade, existem muitas possibilidades para isso e eu quero usar o mais fácil aqui. O que podemos fazer, podemos simplesmente enviar nosso projeto para o GitHub ou GitLab, o que você preferir, e então clonar esse projeto dentro do nosso xarope. Isso é muito eficiente porque você pode fazer algumas alterações em um projeto. Você certamente armazenará e atualizará seu projeto dentro do repositório Git, o que na verdade significa que toda vez que você quiser atualizar seu projeto, você simplesmente pule aqui dentro do seu console e disse Sarah, você apenas tenta obter pool para agrupar seu projeto e , em seguida, reiniciá-lo. É isso aí. Espero que você já não saiba como implantar seu projeto para obter o laboratório ou o GitHub. Mas se você não ouvir um pequeno passo, prefiro que meus próprios projetos usem o MATLAB, mas é apenas minha preferência pessoal. Aqui eu já tranquei dentro do GitHub e eles clicaram em Criar novo projeto. Agora, aqui eu só preciso clicar em Criar projeto em branco. E aqui podemos escrever algum nome. Por exemplo, podemos nomear nosso trailer do projeto L e não precisamos mudar nada aqui. E, na verdade, por padrão, no GitHub, estamos ficando privados de graça, e isso é incrível para nossas necessidades. Agora, aqui dentro da URL do nosso projeto, devemos escolher nosso namespace e eles escolherão o namespace do meu usuário. Agora eu só clico em Criar projeto aqui e nosso projeto é criado. E aqui estamos dando alguns passos de como devemos trazer esse projeto para obter o laboratório. Agora devemos entrar no console do nosso projeto e escrever o que precisa. Isso inicializará bem para o nosso projeto. Estou acessando aqui e, em seguida, recebendo uma mensagem de que minha pasta já é um repositório Git porque eles já têm meu projeto dentro de bom, normalmente você não receberá essa mensagem, mas apenas a mensagem que inicializamos com sucesso. Bom dentro deste repositório, nosso segundo passo aqui é implantar todos os nossos arquivos dentro do MATLAB. Mas o ponto mais importante aqui é que devemos adicionar para ignorar todos os módulos de nó dentro dos módulos do nó do cliente e módulos do nó do servidor do insights. Não precisamos fazer upload todas essas bibliotecas dentro do repositório Git. É por isso que devemos criar arquivo dot gitignore dentro do servidor. Eles têm aqui módulos de nós neste e também dentro do cliente. Aqui, como você pode ver, eu também tenho o ponto gitignore, e aqui temos muitas coisas. Ele foi criado automaticamente pelo angular e não precisa mudar nada aqui. Aqui os módulos de nó sinalizaram e isso é ignorado, o que significa que, na verdade, devemos mudar apenas o servidor. E aqui está o nosso ser ignorado. Depois disso, devemos pular no set console aqui, certo? Git add dot e ele adicionará todos os nossos arquivos ao bem. Agora precisamos criar nosso primeiro commit para isso, podemos tentar git commit am. E aqui, por exemplo, projeto concluído, como você pode ver aqui, estou recebendo uma mensagem, nada para confirmar, mas não deve ser o seu caso. No seu caso, você terá centenas de arquivos aqui, que já foram criados neste projeto. Nosso último passo aqui é que você pode ver é adicionar esta linha, git remote, adicionar HTTPS de origem e, em seguida, o caminho completo, vou colar agora aqui. E com isso, vinculamos com sucesso o get lip a esse repositório. E nosso último passo aqui será esse git push menos uf origin main. E, na verdade, como você pode ver aqui, está escrito em main. Mas para mim, por padrão, tenho um branch master, o que é totalmente bom. É por isso que eu quero renomear main para master. É bom. Push menos uf origin, domine-os ocultos aqui, Enter, como você pode ver aqui, devo fornecer antes de tudo, um nome de usuário do meu usuário do GitHub. E em segundo lugar, a senha é, você pode ver aqui que estou recebendo uma mensagem para acesso profundamente básico negado, o que na verdade significa que isso não aconteceu. Mas aqui devemos criar um token de acesso pessoal com repositório correto redepositado dentro do GitLab. Se você estiver usando o GitHub, por exemplo, talvez tenha funcionado para você. Se não estiver aqui, podemos pular para esses tokens de acesso pessoal do perfil de barra de link. Como você pode ver, eu o abri aqui e aqui só precisamos criar um token de acesso para que possamos fazer push no GitHub. E aqui, por exemplo, ele pode criar um nome falante do trello. E aqui devemos selecionar escopos. Para nós. Devemos criar o repositório correto e ler o repositório. Isso é o mais importante. Estou acessando aqui, crio token de acesso, e aqui estamos chegando ao topo do nosso novo token de acesso. E, felizmente, agora devemos mudar nosso controle remoto novamente por causa desse token de acesso para esta tabela, certo? Bom Ashram ou região remota, que removerá essa origem que criamos aqui no topo com esta linha, e isso será removido. Agora eu quero copiar e colar esta linha e é assim que estamos fazendo isso com o token de acesso dentro do GitHub. Como você pode ver aqui ao escrever git remote add origin HTTPS. Aqui, primeiro devemos fornecer o nome do token de acesso. É por isso que aqui criamos o trailer l como nosso símbolo. Vou escrever isso aqui, ultra law, e agora aqui temos dois pontos e nosso token de acesso. Vou copiar e colar também da nossa página onde o geramos. E depois disso, temos exatamente o mesmo que temos aqui no topo. Para mim, é https github com slash meu apelido barra L dot. Bom. É aqui que escreverei exatamente o mesmo. E então meu repositório, eu vou Trello, vamos dar uma olhada nisso. Estamos tentando fazer push novamente para o nosso repositório com git push origin master, assim como fizemos anteriormente. Estamos batendo aqui. E como você pode ver, quando não for questionado sobre nosso nome de usuário e senha, porque agora estamos fazendo push com nosso token de acesso. E como você pode ver, não temos um erro. Aqui. Estamos conseguindo que tudo esteja resolvido e agora temos sucesso em impulsionar o branch master dentro da origem. Como você pode ver agora, aqui dentro do nosso projeto, temos um branch master, e aqui estão todas as nossas mudanças. Temos aqui duas pastas, cliente e servidor. E aqui dentro podemos ver todo o projeto que construímos. E agora podemos aplaudir nosso código para o nosso servidor. É por isso que aqui eu quero voltar para dentro do nosso servidor que acabamos de criar. E como você pode ver, estou dentro da calda. Então, primeiro de tudo, aqui eu quero criar um novo diretório que é chamado de projetos. Agora, eu quero pular dentro desse projeto de diretório e clonar esse projeto aqui. E, na verdade, aqui podemos tentar usar com o mesmo token de acesso que acabamos de usar. Podemos simplesmente escrever dentro do console, obter o chmod menos a versão dentro do console local, não dentro do servidor. E aqui está nosso controle remoto com esse URL de token. E, na verdade, podemos simplesmente copiar e colar esse URL e usá-lo aqui dentro do xarope aqui. Eu só quero escrever git clone e depois esse URL que estou acessando aqui. E como você pode ver, não temos problemas de permissão. E clonamos com sucesso nosso projeto aqui dentro dos projetos. E aqui agora eu posso escrever Ls. E como você pode ver, temos o trailer da pasta L, o que na verdade significa que temos sucesso no exterior do nosso projeto para o nosso servidor. Agora, para continuar, precisamos atualizar todos os pacotes dentro do nosso servidor. E para isso, podemos simplesmente escrever apt-get update e pressionar Enter. Como você pode ver, todos os nossos pacotes foram atualizados e agora eu quero instalar, primeiro de tudo em jeans e em segundo lugar MongoDB. Então, o que está em jinx? Este é o nosso futuro servidor web que usaremos em nosso projeto. É aqui que podemos escrever EPT com estilo e azaração. Aqui devemos clicar em yes, para instalar este pacote. Como você pode ver, nosso pacote foi instalado com sucesso. Vamos verificar se está funcionando aqui, podemos simplesmente escrever o status do serviço e do jinx. E como você pode ver, estou pressionando Enter e estamos recebendo muitas informações. Em primeiro lugar, o que está no Jinx e aqui, em execução ativa, o que na verdade significa que ele foi instalado com sucesso e está sendo executado agora, nosso próximo passo é instalar nosso banco de dados, e era o MongoDB. Este é o caminho aqui, apt install Mongo DB e devemos confirmá-lo com sim. Agora vamos verificar o estado do nosso MongoDB para este fim de semana, certo, serviço e status do Mongo DB. E como você pode ver, ele também está ativo e funcionando, o que significa que está tudo bem. A próxima ferramenta que eu quero instalar é chamada n. E, na verdade, vamos usá-la para gerenciar nossa versão do nó porque na verdade pode acontecer que desejemos atualizar o nó e é muito mais fácil de fazer isso usando essa ferramenta, especialmente se você tiver vários projetos e precisar alternar entre diferentes versões do nó. É aqui que vou colar essa linha dentro do console. Portanto, é curl menos l e esse URL, é Gita, sua barra n no estilo bash. Estou pressionando Enter e estamos recebendo um erro. É por isso que o que devemos fazer. Antes de tudo, devemos executar o apt install. E aqui é essencial. Estou apertando Enter e devemos confirmar. Agora, como você pode ver, ele está instalado para que possamos tentar instalar. E novamente, estou apertando Enter e put. Não tenha nenhum erro. Aqui. Podemos simplesmente escrever sim e prosseguir com a instalação. Como você pode ver aqui, por padrão, n instalado para mim, sei, 16151. E, na verdade, esse é exatamente o mesmo nó que eles têm localmente. E eles sempre recomendam que você tenha a mesma versão de nó em seu servidor de produção e no ambiente local. Nesse caso, você evitará aborrecimentos e caixa mágica. E os dois últimos que queremos instalar são chamados de PM2.5. Este é um gerente especial para reiniciar nossos processos de nó e nós o usaremos para iniciar nosso aceno. É aqui que podemos escrever npm install menos g, o que significa globalmente VM2. E como você pode ver aqui, estamos recebendo um comando de erro npm not found, e o mesmo para o nó de comando não encontrado. Se eu estiver bem aqui, nó menos versão. E, na verdade, após a instalação de n, tanto internamente quanto obtendo Node e npm. Mas devemos reiniciar nosso terminal. Portanto, devemos nos desconectar do servidor e nos conectar novamente para trazer uma chance conhecida dentro do caminho. É aqui que podemos simplesmente escrever exit e, novamente, usar SSH root e nosso endereço IP. Keaton aqui Entre e devemos fornecer nossa nova senha. E como você pode ver aqui, eu estou dentro e agora eu posso escrever node minus fashion e seguida, obter a versão do nó e o mesmo com NPM menos versão, que na verdade significa que agora podemos instalar o TM2 novamente com o npm install globalmente VM2. Agora não temos um erro e nosso PM dois está sendo instalado. Agora, devemos instalar todos os nossos pacotes para o cliente e para o servidor. E para isso, devo pular novamente dentro da pasta de projetos. E aqui, como você pode ver, eu tenho nosso projeto ultra lab. Como você pode ver aqui, estou dentro do trailer e eles têm cliente e servidor. Primeiro de tudo, eu quero pular e dizer servidor. E aqui temos muitos arquivos, então podemos simplesmente escrever e pagar o estilo e ele instalará todas as dependências para o nosso servidor. Como você pode ver, tudo está instalado agora devemos pular dentro do nosso cliente. Então, eu estou escrevendo CD client e depois deste npm install novamente, e instalaremos todos os nossos pacotes front-end para Angular. Portanto, todos os nossos pacotes foram instalados com sucesso e agora devemos criar uma configuração para o nginx para o nosso projeto. E para isso podemos escrever cd slash UTC e jinx Cohen's d. E aqui dentro temos que criar um novo arquivo. E para isso podemos escrever Tij e depois L trailer ponto com.com. E, na verdade, aqui para abrir e editar o arquivo, devemos usar algum editor do console. E vou escrever aqui nano e depois o nome do nosso arquivo, que é o trailer antigo, calmo, calmo. Estou chegando aqui e é assim que esse editor está parecendo. Então, aqui podemos simplesmente digitar algo e depois salvar. E, na verdade, aqui eu quero já colar o conflito, muitas vezes azarar o tipo preparado anteriormente, e é assim que parece. Então, aqui temos um blog do servidor. Agora, lá dentro, ouvimos AT, que é uma parte AT padrão. E aqui é onde nossa raiz de frontend está mentindo. Aqui estão os projetos de barra de rota de barra onde já o criou. Aqui, a pasta é forte. Na verdade, é uma pasta ultra baixa que acabamos de criar. Em seguida, corte o aplicativo slash e slash do cliente. E, na verdade, devemos construir também mais tarde nosso cliente depois de instalar pacotes. Portanto, nosso script de tipo será convertido para JavaScript, e estará aqui dentro desta pasta, dentro do aplicativo de barra. É por isso que agora está tudo bem. Aqui estamos resolvendo nosso index.HTML e aqui o nome do servidor, o sobrenome é realmente importante porque, na verdade, esse é o nosso domínio. Este é L.com e www L Trello.com. E, na verdade, não temos nenhum domínio. E isso é totalmente bom porque na verdade, podemos dentro de nossa máquina local, dentro do arquivo host, apenas escrever um endereço APR do servidor. Nesse caso, não precisamos nos preocupar com a estratégia logo que o domínio real, e ela funcionará exatamente como com o domínio. Depois disso, temos a localização. Então, estamos tentando sempre carregar nosso index.HTML. E aqui temos a API de barra de localização. E, na verdade, isso é importante porque aqui estamos dizendo, ok, quando somos campeões na API de barra L Trello.com, devemos enviar nossa solicitação por proxy para este servidor web e esse servidor web usaremos dentro do nosso backend. Este é o host local da API 1001 slash. Depois disso, temos exatamente o mesmo, mas para solicitações de E/S de soquete. E aqui temos http localhost 4.001, e aqui temos alguns cabeçalhos. E, na verdade, essa é toda a configuração que precisamos para o In Jinx. Então, agora a questão é como podemos salvar esse arquivo? E para isso, em primeiro lugar, queremos clicar em Control O. E aqui na parte inferior vemos o nome do arquivo para escrever ys l Trello com conf, onde basta pressionar enter. E isso é totalmente bom. Foi salvo. Agora, aqui eu quero clicar em Control X, e agora estamos fora, estamos de volta ao nosso console. E agora se você precisar verificar se tudo foi salvo com sucesso, você pode escrever cat e então eu vou Trello, estou apertando Enter e estamos entrando no console essa boa saída com o conteúdo do nosso arquivo, mas não é tudo onde também devemos mudar um usuário dentro da configuração dos genes. Este é o caminho aqui. Eu quero sair desta pasta aqui eu quero escrever novamente nano, mas no nosso caso agora ele estará em jinx.com. E, na verdade, essa é a configuração padrão, geralmente Jinx. E aqui queremos mudar apenas uma única linha. Aqui no topo, temos os dados do usuário e queremos alterá-los para a rota do usuário com a qual estamos bloqueados aqui, e precisamos salvar esse arquivo novamente. Então Control O Enter, depois Control X. Agora devemos reiniciar o In Jinx para aplicar a configuração que fizemos. É por isso que podemos escrever serviço e reiniciar o jinx. Estou pressionando Enter e não temos nenhum erro. E agora não devemos esquecer de construir nossa frente. E é por isso que devemos voltar para dentro projetos de barra de rota. E aqui está nosso trailer L e cliente. E, na verdade, somos clientes internos. E para construir nosso projeto Angular, podemos simplesmente executar npm, executar build. E como você pode ver aqui, estamos chamando GI Bill, que é o comando do Angular, e ele vai construir para nós todo o projeto dentro desta pasta, como você pode ver aqui, depois de construir, Estou recebendo muitos erros dentro do console. E, na verdade, o principal problema é que é uma construção de produção e a folha de pagamento não existe no tipo de produção booleano, o que na verdade significa que não atualizamos nossos ambientes, Config dentro do nosso projeto. É aqui que é real e bom que temos agora o bem, para que possamos fazer ajustes rapidamente. Aqui, quero voltar ao nosso projeto e estamos interessados nos ambientes de origem de peças de nossos clientes. Aqui temos dois arquivos. Meio ambiente, sim. E à direita, abrirei protesto ambiental. Aqui. Como você pode ver à esquerda, fornecemos o URL da API e o URL dos sockets, mas não os fornecemos à direita. E, na verdade, vou apenas copiá-los da esquerda para a direita aqui. Agora, temos essas propriedades dentro da nossa configuração. Depois dessa ferida deve implantar essas mudanças para o salto bom para deficientes no projeto local, certo? Git add dot, ele adicionará apenas todos os arquivos localmente e após esse commit. Então git commit menos m e por exemplo, ambiente atualizado. Estou batendo aqui, entre em nossos comutados. Depois disso, podemos simplesmente escrever git push origin master e pressionar Enter. E nossas mudanças já estão dentro do GitHub ou GitLab. Depois disso, podemos voltar para dentro do nosso servidor, que foi inserido. E aqui eu quero sair do cliente. E aqui estou eu dentro da nossa pequena pasta de trailers. Agora acabei de experimentar o Git pool e estamos trazendo nossas mudanças, como você pode ver aqui, protease do ambiente dentro do nosso servidor. E depois disso, devemos tentar novamente executar build, e é npm run build, mas não devemos esquecer, devemos pular dentro do cliente, como você pode ver, nenhum pacote de arquivo ou diretório, Jason, porque eu não sou cliente interno. Então, o cliente e aqui o npm executam build. Agora, como você pode ver, não temos nenhum erro e estamos recebendo uma mensagem de que tudo foi concluído. E, na verdade, aqui devemos verificar o que temos dentro de nossa pasta dist. Então, diminuiu. E como você pode ver aqui, temos todos os trailers e dentro de todo o Trello, temos todos esses arquivos. Primeiro de tudo, nosso index.HTML e, em seguida, nossos ativos, gerentes e assim por diante. Mas, na verdade, isso significa que temos um pequeno problema dentro de nossa configuração interna e jinx porque nossa pasta raiz foi rolada , esse aplicativo de barra. E no nosso caso aqui temos uma barra reduzida, eu vou Trello, o que na verdade significa que devemos atualizá-lo agora. Portanto, devemos tentar Nano slash, ETC. E jinx Cohen d. E aqui temos nossa L Trello Comic-Con. Estou pressionando Enter e abri novamente nossa configuração. E aqui dentro da rota devemos tentar esta barra l Trello. Agora estou pressionando Control O, Enter Control vaza e precisamos reiniciar e azarar, então o serviço e o jinx reiniciam. Portanto, agora nosso front-end está completamente pronto e simplesmente precisamos executar nosso back-end e não precisamos começar de alguma forma nosso fronted, porque no jinx fará isso rápido. Mas para começar, não vai porque, na verdade, dentro do nosso front-end temos apenas arquivos estáticos como HTML, JavaScript e CSS. Mas dentro do nosso backend, temos nosso observável. É por isso que eu quero pular dentro do nosso back-end. Então aqui servidor de CD, e aqui precisamos iniciar nosso servidor com PM2.5. Mas, na verdade, aqui também temos um problema dentro do nosso servidor. Nós temos o TypeScript com não temos arquivos JavaScript e, na verdade, o womb deve converter todo o nosso TypeScript para JavaScript antes de começarmos a executá-lo sem PM2.5. E, na verdade, para isso, é preciso criar em seu comando. É por isso que devemos voltar ao nosso projeto e entrar no pacote do servidor, Jason. E aqui temos um script para começar, mas não temos um script para Build. É por isso que aqui podemos simplesmente escrever build e aqui o script será TAC. Então, o que é TAC? Na verdade, é um TypeScript e simplesmente transpira todo o código que temos dentro deste projeto com essa configuração ts. Como você pode ver aqui é a saída, é uma pasta dist. Isso está completamente bem rápido. Mas depois que fizemos essas mudanças. Devemos pular no set console e fazer exatamente as mesmas coisas novamente, primeiro de tudo, get head, depois git commit e depois git push. Então, com esses comandos, estamos trazendo nossas alterações para dentro do get wrapper. Agora estamos voltando em vez de uma pesquisa. Aqui estamos saindo e eu estou puxando meu projeto novamente. Então, estamos prontos para ir agora, podemos voltar e dizer, oh, pasta do servidor. E aqui podemos tentar construir nosso back-end. É aqui que eu posso simplesmente escrever npm run build, e isso transpira meu script de tipo para o meu JavaScript. Como você pode ver aqui, está feito. Agora podemos tentar menos dist e verificar o que temos. E como você pode ver aqui, vemos todos os nossos arquivos que foram criados, mas com extensão js, o que na verdade significa que isso está totalmente bem e devemos iniciar dist slash server.js e ele irá comece nosso projeto. Queremos usar PM2.5. É aqui que podemos simplesmente executar PM para o espaço, começar o espaço. Aqui será diminuída a busca por barra. Sim, estou pressionando Enter e estamos obtendo muita saída. Como você pode ver aqui, essa é toda a saída do PM dois. Não importa, mas aqui no fundo vemos gerando PM para demônio. É demonizado com sucesso e estamos começando com esses surtos no modo 4k, e está pronto e aqui está o nosso servidor. E, na verdade, por que estamos usando aqui P M2, não apenas o processo de nota que poderíamos escrever aqui nó e , por exemplo, o surto, sim, isso é totalmente bom. Mas pm tubule, em primeiro lugar, os riscos começam para nós, este servidor web se ele estiver quebrado por algum motivo. Em segundo lugar, o PM dois é mais adequado para as aplicações de produção. Então, o que fizemos aqui, em primeiro lugar, construímos com sucesso nosso cliente e, em segundo lugar, iniciamos nosso backend. E o último passo que queremos fazer é abrir um navegador. Mas podemos simplesmente abrir um navegador porque devemos apontar nosso domínio, L Trello.com, que não existe. Não o compramos da nossa máquina local para o nosso servidor. E, na verdade, aqui eu devo pular dentro do console localmente. E abra o arquivo host, por exemplo, dentro do Linux e macOS, é linha em barra, hosts de barra ETC. Então, aqui está como parece para mim, se você estiver no Windows, aqui está o seu caminho, é o Disco C, sistema Windows, então os dois drivers, ETC, hospedam e você está abrindo esse arquivo e isso é exatamente como meu arquivo aqui. E como você pode ver aqui, eu já testei esse projeto. É por isso que eu tenho essa linha. Então aqui eu tenho um domínio, L Trello.com. Isso é o que estamos registrados, mas esse é o endereço antigo da API. Eu não preciso disso. Devo voltar para dentro do meu painel de SNA principal e copiar este domínio e colá-lo aqui, que na verdade significa em nossa máquina local, quando estamos pulando dentro da dose ultra baixa, quando não olhando na tabela de pesquisa de DNS, estamos apenas apontando para o nosso endereço IP do servidor. Então, agora o momento da verdade, vamos abrir nosso projeto. Estou escrevendo dentro do navegador L Trello.com. E isso, você pode ver que este é o nosso projeto. Está funcionando. E, na verdade, eu quero abrir aqui console para que possamos verificar se temos alguns erros. E, na verdade, aqui temos um host local estreito para 1001 usuários de elevador de gelo lamacento da origem, eu vou Trello e, na verdade, como você pode ver, rede, este é o nosso pedido para API. Este é http localhost 4.001 pares slushy mais usuário. E, obviamente, isso é forte. Isso não é o que precisamos usar. É por isso que devemos voltar ao nosso projeto e entrar no cliente localmente e alterá-lo. Então, aqui está a fonte, o meio ambiente e o protesto ambiental do nosso cliente . Aqui. Obviamente, esse host local não existe. O que temos agora aqui é uma API de barra CTP L Trello.com e a mesma aqui, http L Trello.com. E então não precisamos fornecer aqui um porto. E agora devemos cometer essas mudanças novamente. É por isso que git add git commit e depois git push. Agora queremos pular para o nosso servidor, sair e dizer pasta Trello e certo, obter ***. Mas depois disso, devemos construir nosso cliente novamente porque mudamos nosso cliente. E para fazer isso, podemos escrever c, d client. E agora, novamente, npm run build e ele simplesmente gerará arquivos estáticos rápidos para o frontend, nosso projeto é construído com sucesso. Estou recarregando a página aqui e não temos um erro. Temos aqui para 01, para HTTP L trailer com slash APIs slash user. Isso é totalmente bom. Não estamos trancados. Agora vamos tentar registrar o usuário. Então, aqui estou eu escrevendo f2 em gmail.com. Aqui está nosso nome de usuário e senha 123 ocultos aqui registre-se. E, na verdade, funcionou. E isso é importante verificar porque significa que aqui configuramos o MongoDB com sucesso porque essa solicitação de postagem é enviada para a API e esta é a nossa resposta. E aqui estamos recebendo de volta o anúncio do usuário salvo e aqui o token. Portanto, nosso back-end e DPI também funcionam. Agora, aqui temos um quadro e aqui vou criar meu primeiro quadro. Vamos apertar Enter e estamos pegando nosso quadro, podemos abri-lo. E aqui estamos dentro do quadro. Agora vamos verificar se nosso soquete IO está funcionando para isso. Quero duplicar esse toque aqui e tentar criar uma lista. Então, aqui, por exemplo, primeira lista, estou acertando aqui pelo menos, e estamos recebendo a lista. E também na próxima etapa, estamos obtendo exatamente a mesma lista. Agora, aqui no segundo mandato, podemos criar um novo cartão. Por exemplo, primeiro cartão, estou acertando aqui, adicione e estamos recebendo esse cartão nas duas páginas. Agora, aqui podemos abrir nosso modelo e ele está funcionando conforme o esperado, o que na verdade significa que implantamos com sucesso nosso projeto na produção. Não foi fácil, mas isso é a base de qualquer projeto que você possa implantar. Não importa qual visão angular reaja. Qualquer cliente que você quiser, JavaScript simples ou qualquer back-end, sempre será muito semelhante. 48. Trabalho de casa: Meus parabéns, você terminou este curso com sucesso, e eu realmente acho que você é incrível e aprendeu muitas coisas. Agora, com certeza, você aprendeu como criar seu projeto full-stack com Node.JS no back-end e express como um serviço. Além disso, você pode com certeza usar facilmente o soquete IO porque o usamos bastante no cliente. Você novamente, muita experiência em relação a n Cooler TypeScript, ótimo e interfaces e criando um bom estado reativo. Mas, obviamente, não é o fim. Como um bom professor, devo lhe dar lição porque, na verdade, se você quiser melhorar suas habilidades como desenvolvedor, deve aprender e criar seus próprios projetos. E aqui você tem duas possibilidades. Você pode criar seu próprio projeto do zero. Isso é o que eu realmente recomendo, ou você pode implementar recursos neste projeto. E, na verdade, há benefícios em ambas as possibilidades. Se você continuar implementando este projeto, você já tem uma arquitetura muito boa e será muito mais fácil para você. E, na verdade, a quantidade de recursos que você pode implementar neste projeto é realmente tremenda. Em primeiro lugar, você pode implementar aqui diferentes funções. Por exemplo, como usuários administradores que podem criar, por exemplo, equipes, o que na verdade significa que você começa a organizar as pessoas dentro do Teams, assim como no Trello real também, por exemplo, no front-end, você pode implementar arrastar e soltar para tarefas dentro do quadro. A variante mais fácil para você seria abrir o aplicativo oficial do trailer e apenas olhar para o conjunto de recursos e apenas implementar algo que seja interessante para você. E, na verdade, isso é super importante e está relacionado ao seu próprio projeto. Se você planeja fazer seu próprio projeto, eu recomendo que você implemente algo em que esteja realmente interessado. Porque se o seu projeto não for interessante para você, você não o fará por um longo período de tempo. E se você está procurando ideias para seus próprios projetos, interrompa muitas delas. Por exemplo, você pode implementar um choque de comércio eletrônico, ou talvez uma livraria, um clone da netflix ou um aplicativo financeiro para gerenciar suas despesas. Eu realmente espero que você tenha gostado deste curso e tenha aprendido muito e nos veremos no meu próximo curso.