Files
freeCodeCamp/curriculum/challenges/portuguese/06-quality-assurance/advanced-node-and-express/serialization-of-a-user-object.md

4.5 KiB

id, title, challengeType, forumTopicId, dashedName
id title challengeType forumTopicId dashedName
5895f70cf9fc0f352b528e66 Serializar um objeto de usuário 2 301563 serialization-of-a-user-object

--description--

Serialização e desserialização são conceitos importantes no que diz respeito à autenticação. Serializar um objeto significa converter seu conteúdo em uma pequena chave que pode ser desserializada no objeto original. Isto é o que nos permite saber quem se comunicou com o servidor sem ter que enviar os dados de autenticação, como o nome de usuário e a senha, em cada solicitação de uma nova página.

Para configurar isso corretamente, precisamos ter uma função de serialização e uma função de desserialização. No Passport, criamos estas funções com passport.serializeUser( OURFUNCTION ) e passport.deserializeUser( OURFUNCTION )

serializeUser é chamada com 2 argumentos, o objeto de usuário completo e uma função de callback usada pelo passport. Uma chave única para identificar que o usuário deve ser retornado na função de callback. A mais fácil de usar é o _id do usuário no objeto. Ele deve ser único, já que é gerado pelo MongoDB. Da mesma forma, deserializeUser também é chamada com essa chave e uma função de callback para o passport. Desta vez, porém, temos de pegar essa chave e devolver o objeto do usuário completo à função de callback. Para fazer uma pesquisa de consulta para um _id do Mongo, você precisará criar const ObjectID = require('mongodb').ObjectID;. Então, para usá-la, você chama new ObjectID(THE_ID). Certifique-se de adicionar mongodb@~3.6.0 como uma dependência. Você pode ver isso nos exemplos abaixo:

passport.serializeUser((user, done) => {
  done(null, user._id);
});

passport.deserializeUser((id, done) => {
  myDataBase.findOne({ _id: new ObjectID(id) }, (err, doc) => {
    done(null, null);
  });
});

OBSERVAÇÃO: deserializeUser vai lançar um erro até que tenhamos definido o banco de dados na próxima etapa. Portanto, por enquanto, comente todo o bloco e apenas chame done(null, null) na função deserializeUser.

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

Você deve serializar a função do usuário corretamente.

(getUserInput) =>
  $.get(getUserInput('url') + '/_api/server.js').then(
    (data) => {
      assert.match(
        data,
        /passport.serializeUser/gi,
        'You should have created your passport.serializeUser function'
      );
      assert.match(
        data,
        /null,\s*user._id/gi,
        'There should be a callback in your serializeUser with (null, user._id)'
      );
    },
    (xhr) => {
      throw new Error(xhr.statusText);
    }
  );

Você deve desserializar a função do usuário corretamente.

(getUserInput) =>
  $.get(getUserInput('url') + '/_api/server.js').then(
    (data) => {
      assert.match(
        data,
        /passport.deserializeUser/gi,
        'You should have created your passport.deserializeUser function'
      );
      assert.match(
        data,
        /null,\s*null/gi,
        'There should be a callback in your deserializeUser with (null, null) for now'
      );
    },
    (xhr) => {
      throw new Error(xhr.statusText);
    }
  );

O MongoDB deve ser uma dependência.

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

O MongoDB deve ser solicitado adequadamente, incluindo o ObjectId.

(getUserInput) =>
  $.get(getUserInput('url') + '/_api/server.js').then(
    (data) => {
      assert.match(
        data,
        /require.*("|')mongodb\1/gi,
        'You should have required mongodb'
      );
      assert.match(
        data,
        /new ObjectID.*id/gi,
        'Even though the block is commented out, you should use new ObjectID(id) for when we add the database'
      );
    },
    (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.
*/