3
respostas

Fundamentos de javascript em funções com argumentos

Minha dúvida reside no argumento que será recebido pela função criarTokenJWT. Explicitamente, essa função deverá receber um "usuario" como argumento, até aqui tudo ok. Contudo, quando eu for chamar essa função dentro do objeto Access, dentro da função cria(id) podemos observar que a função cria() recebe um argumento "id", Durante o curso de refresh token, o professor informa que devemos alterar o argumento na função "criaTokenJWT(usuario)" e que agora ela deverá receber um "id" como argumento. A minha dúvida é, por que precisamos alterar o argumento da função criaTokenJWT e deixa-la igual ao argumento que será recebida na função cria()? Pensei em um paralelo com linguagens fortemente tipadas e lá, antes de passarmos uma variável como argumento para um método precisamos saber se essa variavel é do mesmo tipo do argumento que será recebido. Contudo, em javascript, nao existe um tipo predefinido...

const jwt = require('jsonwebtoken');
const allowlistRefreshToken = require('../../redis/allowlist-refresh-token');
const crypto = require('crypto');
const moment = require('moment');

function criaTokenJWT(usuario) {
    const payload = {
      id: usuario.id
    };

    const token = jwt.sign(payload, process.env.CHAVE_JWT, { expiresIn: '30s' });
    return token;
  }

  async function criaTokenOpaco(usuario){
    const tokenOpaco = crypto.randomBytes(24).toString('hex');
    const dataExpiracao = moment().add(5, 'd').unix();
    await allowlistRefreshToken.adiciona(tokenOpaco, usuario.id, dataExpiracao);
    return tokenOpaco;
  }

module.exports = {
    access: {
        cria(id) {
            return criaTokenJWT();
        }
    },
    refresh: {
        cria(id) {

        }
    }
}
3 respostas

Oi, Andre!

Nessa parte, precisávamos alterar o argumento de criaTokenJWT() porque não teríamos mais acesso a usuarioem access.cria(). Isso é interessante também porque essa função pode ser usada para qualquer fim, e não apenas para tokens de usuários.

Mesmo assim, não entendi muito bem seu paralelo com linguagens fortemente tipadas. Você poderia explicar um pouco mais?

Abraços!

...Pensei em um paralelo com linguagens fortemente tipadas e lá, antes de passarmos uma variável como argumento para um método precisamos saber se essa variavel é do mesmo tipo do argumento que será recebido. Contudo, em javascript, nao existe um tipo predefinido...

Exemplo em Java:

Casa casa = "Ola mundo";

public void exibirOlaMundo(Casa casa) {
    // code
}

Observe que a função exibir deve receber em seu argumento uma variável do tipo Casa. Em javascript nao temos tipos a declarar... Dai surgiu minha duvida em sua aula. Tínhamos uma função x que seria chamada de outro modulo, essa função tinha como argumento um 'id', no modulo onde ela estava sendo chamada você afirmou que deveríamos passar no argumento da função a mesma palavra 'id' caso contrario o código nao funcionaria:

function exibirQualquerCoisa(id) {} // argumento com nome 'id'    que será chamada em outro modulo

exports.exibirQualquerCoisa; //exportar função
 ---------------------------------------------------------
import exibirQualquerCoisa from .... xxx // importar função em outro modulo

exibirQualquerCoisa( novoArgumento ) ; // digitei um novo nome para o argumento, nao mais id.

a questão é que nesse segundo trecho de código o nome do argumento que vou passar para a função que está sendo usada, na minha cabeça eu posso nomear o argumento de qualquer outro apelido, nao vai impedir o código de rodar pois o apelido do argumento so serve para receber o dado e mandar para a função original que se encontra em outro modulo qualquer.

Oi, Andre!

Hm, acho que entendi.

Isso que você falou é verdade. Os nomes das variáveis não costumam impedir o funcionamento do programa. Então o seu exemplo do exibirQualquerCoisa() funcionaria mesmo.

Mas aí, o que você quer dizer é que em vez de eu fazer isso:

function criaTokenJWT(usuario) {
    const payload = { id: usuario };
    const token = jwt.sign(payload, process.env.CHAVE_JWT, { expiresIn: '30s' });
    return token;
  }

module.exports = {
    access: {
        cria(id) {
            return criaTokenJWT(id);
        }
    },
   // ...
}

Eu fiz isso, não é?

function criaTokenJWT(id) {
    const payload = { id }; // que significa { id: id }
    const token = jwt.sign(payload, process.env.CHAVE_JWT, { expiresIn: '30s' });
    return token;
  }

module.exports = {
    access: {
        cria(id) {
            return criaTokenJWT(id);
        }
    },
   // ...
}

No fundo, o primeiro caso funcionaria normalmente. O problema é que a gente não está recebendo um usuário, né? Esse erro de nomenclatura não impacta a execução do programa mas impacta o desenvolvimento do software. Porque, como a gente não tem declaração de tipos em JS comum, os nomes são a única pista para quem programa saber o que é a variável que está trabalhando.

Aliás, esse é o motivo que sempre usamos nomes com significado. Por exemplo, preferimos usuario em vez de x ou u, que não dizem muita coisa.

Essa era sua dúvida mesmo?