Exercício: Gravar de dados

Concluído

A Tailwind Traders está impressionada com suas APIs, que retornam produtos existentes. Agora você precisa criar uma API que possa inserir e atualizar produtos. Normalmente, os dados são armazenados em um banco de dados e contêm milhões de registros. Por esse motivo, você precisa usar técnicas que limitem a quantidade de dados que são passados para a API e retornados da API.

Implementar o suporte para gravação de dados

Implemente a API CRUD no recurso products:

Este projeto inicial em nodejs-route\exercise-express-routing\reading-writing contém os arquivos do produto e algum código de aplicativo inicial. Tudo o que você precisa fazer é preencher as partes que faltam.

  1. Clique com o botão direito do mouse no nome da pasta Leitura-Gravação e selecione Abrir no terminal integrado.

  2. No terminal, execute o seguinte comando para instalar a dependência:

    npm install
    
  3. Abra app.js para inspecioná-lo. O arquivo deve ser semelhante a este:

     const express = require('express');
     const app = express();
     const port = 3000;
    
     app.use(express.json());
    
     let products = [];
    
     app.post('/products', function (req, res) {
       // implement
     });
    
     app.put('/products', function (req, res) {
       // implement
     });
    
     app.delete('/products/:id', function (req, res) {
       // implement
     });
    
     app.get('/products', (req, res) => {
       // implement
     });
    
     app.listen(port, () =>
       console.log(`Example app listening at http://localhost:${port}`),
     );
    

    O arquivo app.js mostra o esqueleto de um programa. Seu próximo trabalho é implementar as rotas.

Implementar rota para leitura de dados

Para implementar rotas, o processo consiste em adicionar um pouco de código e depois testá-lo. Continue adicionando o método de cada rota até que você tenha uma API totalmente funcional. Faça as alterações no arquivo app.js no diretório reading-writing. Todos os arquivos que começam com client são aplicativos clientes que você pode usar para testar sua API.

  1. Para dar suporte à leitura da API, localize a parte do código que tem esta aparência:

    app.get('/products', (req, res) => {
      // implement
    })
    

    Substitua-a por este código:

    app.get('/products', (req, res) => {
      res.json(products);
    })
    
  2. Para verificar se o código funciona, inicie o aplicativo Node executando este comando:

    node app.js
    
  3. Em um terminal separado para a mesma pasta, leitura e gravação, execute o seguinte comando. É importante ter dois terminais abertos porque você precisa executar o servidor e o cliente ao mesmo tempo.

    node client-get.js
    

    Você deverá obter o seguinte resultado:

    Received data []
    Connection closed
    

    A API responde com uma matriz vazia porque você ainda não gravou nenhum dado nela. Vamos alterar isso em seguida.

  4. No primeiro terminal, selecione Ctrl+C para interromper o aplicativo.

Implementar a rota para gravação de dados

  1. Para implementar a gravação de dados no banco de dados na memória, localize este código:

    app.post('/products', function (req, res) {
       // implement
    });
    

    Substitua-a por este código:

    app.post('/products', function(req, res) {
      const newProduct = { ...req.body, id: products.length + 1 }
      products = [ ...products, newProduct]
      res.json(newProduct);
    });
    

    O novo código lê os dados de entrada de req.body e constrói um objeto JavaScript com base nele. Em seguida, ele será adicionado à matriz products do banco de dados na memória. Por fim, o novo produto retornará ao usuário.

  2. Para testar o código, execute o programa do servidor usando este comando:

    node app.js
    
  3. Em um terminal separado para a mesma pasta, leitura e gravação, execute o seguinte comando. É importante ter dois terminais abertos porque você precisa executar o servidor e o cliente ao mesmo tempo.

    node client-post.js
    

    Você deverá ver uma saída como esta:

    response {"name":"product","id":1}
    Closed connection
    
  4. Para verificar se os dados foram gravados na API, execute o seguinte comando:

    node client-get.js
    

    Você deve ver o seguinte resultado:

    Received data [{"name":"product","id":1}]
    Connection closed
    

    Suas solicitações até o momento:

    • client-post.js: a resposta informa que quando você executou client-post.js, você escreveu dados na API.
    • client-get.js: você executou client-get.js para consultar dados na API. A API respondeu com os dados que você acabou de gravar nela.
  5. No primeiro terminal, selecione Ctrl+C para interromper o aplicativo.

Implementar a rota para atualização de dados

  1. Para implementar a capacidade de atualizar seus dados, localize o código parecido com este:

    app.put('/products', function (req, res) {
      // implement
    });
    

    Substitua-a por este código:

    app.put('/products', function(req, res) {
      let updatedProduct;
      products = products.map(p => {
        if (p.id === req.body.id) {
          updatedProduct = { ...p, ...req.body };
          return updatedProduct;
        }
        return p;
      })
      res.json(updatedProduct);
    });
    

    O novo código localiza o registro na matriz products do banco de dados na memória que corresponde à propriedade id e atualiza esse registro.

  2. Para testar o código, inicie o aplicativo para servidores:

    node app.js
    
  3. Em outro terminal, execute o comando abaixo para criar um registro:

    node client-post.js
    
  4. Execute este comando para atualizar o registro recém-criado:

    node client-put.js
    

    Você verá a seguinte atualização no terminal:

    response {"name":"product-updated","id":1}
    Closed connection
    
  5. Para verificar se a atualização funciona, execute este comando:

    node client-get.js
    

    Você verá esta atualização:

    Received data [{"name":"product-updated","id":1}]
    Connection closed
    
  6. No primeiro terminal, selecione Ctrl+C para interromper o aplicativo.

Implementar a rota para exclusão de dados

  1. Para implementar a exclusão, localize o código semelhante a este:

    app.delete('/products/:id', function (req, res) {
      // implement
    });
    

    Substitua-a por este código:

    app.delete('/products/:id', function(req, res) {
      const deletedProduct = products.find(p => p.id === +req.params.id);
      products = products.filter(p => p.id !== +req.params.id);
      res.json(deletedProduct);
    });
    

    O novo código encontra o produto a ser excluído. Em seguida, ele filtra esse item da matriz products do banco de dados na memória e retorna o produto excluído.

  2. Para testar o código, inicie o aplicativo para servidores:

    node app.js
    
  3. Em um terminal separado, execute este comando para criar um registro:

    node client-post.js
    
  4. Execute este comando para remover o registro:

    node client-delete.js
    

    A seguinte saída deve ser exibida:

    response {"name":"product","id":1}
    Closed connection
    
  5. Para verificar o código, execute este comando:

    node client-get.js
    

    Ele fornecerá esta saída:

    Received data []
    Connection closed
    

    Parabéns! Você implementou um recurso products usando um CRUD completo (ações de criação, leitura, atualização e exclusão).

  6. No primeiro terminal, selecione Ctrl+C para interromper o aplicativo.

Limpar o contêiner de desenvolvimento

Depois de concluir o projeto, limpe o ambiente de desenvolvimento ou devolva-o ao estado padrão.

Excluir o ambiente do GitHub Codespaces garante que você possa maximizar a quantidade de horas de núcleo gratuitas a que você tem direito na sua conta.

Importante

Para saber mais sobre os direitos da sua conta do GitHub, confira O GitHub Codespaces inclui mensalmente armazenamento e horas de núcleo.

  1. Entre no painel do GitHub Codespaces (https://github.com/codespaces).

  2. Localize seus Codespaces atualmente em execução, originados do repositório MicrosoftDocs/node-essentials do GitHub.

    Captura de tela de todos os Codespaces em execução, incluindo seu status e modelos.

  3. Abra o menu de contexto do codespace e selecione Excluir.

    Captura de tela do menu de contexto de um único codespace com a opção “Excluir” realçada.