Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida sobre aula 2.16 do curso Node.js

Nesta aula a query é isolada em uma função em um arquivo sepado. A estrutura é essa:

module.exports = function(){
    this.lista = function(){

    }
    return this;
}

A minha dúvida é o que significa o this aqui. Pq ele é necessário?

2 respostas
solução!

Olá, Leandro.

O this no JavaScript sempre depende! ;)

A questão é que quem chama os .js e as funções pode definir o this.

Então, resposta curta: o this, nesse caso, é um objeto criado pelo express-load.


Aprofundando

Normalmente, num módulo NodeJS, ou seja, num arquivo .js carregado com o require(), o NodeJS força o this a ser o module.exports.

Por isso, no server.js, por exemplo, se você colocar o seguinte código:

// server.js
console.log(this == module.exports);

O resultado vai ser true.


Porém, há um detalhe: estamos usando o express-load para carregar o produtosBanco.js. Esse módulo não é carregado pelo NodeJS.

Vamos imprimir o this e a comparação de module.exports com this dentro da function:

module.exports = function(){

  console.log("----------------");
  console.log(this);
  console.log(this == module.exports);
  console.log("----------------");

  this.lista = function(connection, callback){
      connection.query('select * from livros', callback);
  }

  return this;
}

Ao iniciar o servidor, teremos:

----------------
{ fullpath: '/home/alexandre/programming/work/caelum/cursos/js-35/projeto/casadocodigo/infra/produtosBanco.js',
  location: 'infra/produtosBanco',
  name: 'produtosBanco' }
false
----------------
Servidor rodando

Ou seja, o this é esse objeto esquisito aí, com as propriedades fullpath, location e name e não o module.exports.

Quem definiu esse this? Foi o express-load, que carrega esse módulo na função into:

mod = mod.call(script, instance);

https://github.com/jarradseers/express-load/blob/master/lib/express-load.js#L241

O primeiro parâmetro do call é o this que queremos.

E esse script é criado pelo próprio express-load, na função then:

 this.scripts.push({
        fullpath: entity,
        location: path.join(location, name),
        name: name
      });

https://github.com/jarradseers/express-load/blob/master/lib/express-load.js#L109

Mais pra frente na aula, no item Prototype e Data Access Object, modificamos o código para usar uma função construtora (ou produtora).

Obrigado pela explicação!