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

Dúvida com o método express()

No código abaixo eu estou atribuíndo a constante express o conteúdo que o express exporta, que no caso seria uma função.

const express = require("express");

No código abaixo eu exibo no console o tipo do dado guardado na constante, que no caso é "function".

console.log(typeof(express));

Já no código abaixo eu guardo na constante app o retorno da função express(), que no caso seria um objeto.

const app = express();

Mas quando eu exibo o tipo do dado guardado na constante app, o console exibe "function".

console.log(typeof(app));

Minha dúvida é, não era para aparecer "object" no console, quando eu verifico o tipo do dado da constante app?

2 respostas
solução!

Olá Rafael, tudo bem com você?

Realmente você foi numa parte bem complexa do javascript, onde temos que funções também são objetos e podem ter atributos :)

Mas voltando a sua pergunta:

Quando instanciamos o express() o que ele nos devolve é uma função, e para te mostrar isso vou abrir o arquivo principal express.js:

A jsdoc da função:

/**
 * Create an express application.
 *
 * @return {Function}
 * @api public
 */

Aqui já temos indicando que ao executar express() teremos como retorno uma função, mas vamos ver de fato o método:

function createApplication() {
  var app = function(req, res, next) {
    app.handle(req, res, next);
  };

  mixin(app, EventEmitter.prototype, false);
  mixin(app, proto, false);

  // expose the prototype that will get set on requests
  app.request = Object.create(req, {
    app: { configurable: true, enumerable: true, writable: true, value: app }
  })

  // expose the prototype that will get set on responses
  app.response = Object.create(res, {
    app: { configurable: true, enumerable: true, writable: true, value: app }
  })

  app.init();
  return app;
}

Então veja que o retorno da função express() é uma nova função que foi atribuída a app, podemos perceber que são criados atributos dentro dessa função, mas de fato o tipo retornado é uma função

Essa parte de funções serem objetos, é um pouco complexa da linguagem, e existe bastante coisa para estudar para compreender afundo, mas basicamente é isso :)

Um exemplo mais simples:

function saudar(nome){
    console.log(`Olá ${nome}, tudo bem?`)
}

saudar.idade = 50;

console.log(saudar.idade); ---> 50
console.log(typeof saudar); --> function

Abraços e Bons Estudos!

Entendi Geovani. muito obrigado.