freeCodeCamp/curriculum/challenges/portuguese/06-quality-assurance/advanced-node-and-express/set-up-the-environment.md

4.6 KiB

id title challengeType forumTopicId dashedName
589fc830f9fc0f352b528e74 Configure o ambiente 2 301566 set-up-the-environment

--description--

Os desafios a seguir farão uso do arquivo chat.pug. Assim, em seu arquivo routes.js, adicione uma rota de GET apontando para /chat, que faz uso de ensureAuthenticated e renderiza chat.pug, com { user: req.user } passado como argumento para a resposta. Agora, altere a rota /auth/github/callback existente para definir req.session.user_id = req.user.ide redirecione para /chat.

Adicione socket.io@~2.3.0 como uma dependência e solicite/instancie-o no servidor definido como http (que vem integrado ao Node.js), conforme segue:

const http = require('http').createServer(app);
const io = require('socket.io')(http);

Agora que o servidor http está montado na aplicação do Express, você precisa escutar o servidor http. Altere a linha com app.listen para http.listen.

A primeira coisa que precisa ser tratada é escutar uma nova conexão do client. A palavra-chave on faz isso - escuta um evento específico. Ela requer 2 argumentos: uma string contendo o título do evento que é emitido e uma função com a qual os dados são passados. No caso do nosso listener de conexão, usamos o socket para definir os dados no segundo argumento. Um socket é um client individual que está conectado.

Para escutar as conexões do servidor, adicione o seguinte na sua conexão do banco de dados:

io.on('connection', socket => {
  console.log('A user has connected');
});

Agora, para o client se conectar, basta adicionar o seguinte ao client.js que é carregado pela página após a autenticação:

/*global io*/
let socket = io();

O comentário suprime o erro que você normalmente veria, já que 'io' não está definido no arquivo. Já adicionamos um CDN confiável à biblioteca socket.io na página em chat.pug.

Agora, tente carregar o aplicativo e autentique-se. Você deve ver no console do servidor a frase 'A user has connected'!

Observação: io() só funciona ao se conectar a um socket hospedado no mesmo url/servidor. Para se conectar a um socket externo hospedado em outro lugar, você usaria io.connect('URL');.

Envie sua página quando você achar que ela está certa. Se você encontrar erros, pode conferir o projeto concluído até este momento aqui.

--hints--

socket.io deve ser uma dependência.

(getUserInput) =>
  $.get(getUserInput('url') + '/_api/package.json').then(
    (data) => {
      var packJson = JSON.parse(data);
      assert.property(
        packJson.dependencies,
        'socket.io',
        'Your project should list "socket.io" as a dependency'
      );
    },
    (xhr) => {
      throw new Error(xhr.statusText);
    }
  );

Você deve solicitar e instanciar corretamente http como http.

(getUserInput) =>
  $.get(getUserInput('url') + '/_api/server.js').then(
    (data) => {
      assert.match(
        data,
        /http.*=.*require.*('|")http\1/gi,
        'Your project should list "http" as a dependency'
      );
    },
    (xhr) => {
      throw new Error(xhr.statusText);
    }
  );

Você deve solicitar e instanciar corretamente socket.io como io.

(getUserInput) =>
  $.get(getUserInput('url') + '/_api/server.js').then(
    (data) => {
      assert.match(
        data,
        /io.*=.*require.*('|")socket.io\1.*http/gi,
        'You should correctly require and instantiate socket.io as io.'
      );
    },
    (xhr) => {
      throw new Error(xhr.statusText);
    }
  );

Socket.IO deve estar escutando as conexões.

(getUserInput) =>
  $.get(getUserInput('url') + '/_api/server.js').then(
    (data) => {
      assert.match(
        data,
        /io.on.*('|")connection\1.*socket/gi,
        'io should listen for "connection" and socket should be the 2nd arguments variable'
      );
    },
    (xhr) => {
      throw new Error(xhr.statusText);
    }
  );

O client deve se conectar ao servidor.

(getUserInput) =>
  $.get(getUserInput('url') + '/public/client.js').then(
    (data) => {
      assert.match(
        data,
        /socket.*=.*io/gi,
        'Your client should be connection to server with the connection defined as socket'
      );
    },
    (xhr) => {
      throw new Error(xhr.statusText);
    }
  );

--solutions--

/**
  Backend challenges don't need solutions, 
  because they would need to be tested against a full working project. 
  Please check our contributing guidelines to learn more.
*/