1
resposta

Arquivo models/index.js

Até aqui eu estava ignorando, o funcionamento desse arquivo, mas agora eu não paro de tentar entender, ele, na documentação do sequelize-cli, não mostra nada disso, eu queria saber o que esse código está fazendo:

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

Eu até sei que ele meio que está direcionando os modelos, para um lugar só para manter a organização, no entanto não sei o que cada linha quer dizer.

1 resposta

Oi, Walter, tudo bem?

Desculpe a demora em te responder!

Vou explicar cada parte do código separadamente:

'use strict';

Essa linha ativa o modo estrito ("strict mode") do JavaScript, que aplica um conjunto mais rigoroso de regras ao código, ajudando a evitar erros comuns e tornando o código mais seguro.

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');

Essas linhas importam os módulos do Node.js necessários para o código. O fs é usado para trabalhar com sistema de arquivos, path é usado para manipular caminhos de arquivos e Sequelize é a classe principal do Sequelize, que será usada para criar a instância do ORM.

const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};

Essas linhas definem algumas variáveis utilizadas posteriormente, basename armazena o nome do arquivo atual, env armazena o ambiente atual do aplicativo, usando o valor da variável de ambiente NODE_ENV, config carrega as configurações do banco de dados de um arquivo JSON, com base no ambiente atual e db é um objeto vazio que será preenchido posteriormente com os modelos do banco de dados.

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

Essa parte condicional verifica a configuração específica do uso de uma variável de ambiente para a conexão com o banco de dados. Se config.use_env_variable estiver definido, cria-se uma instância do Sequelize usando o valor dessa variável de ambiente (process.env[config.use_env_variable]). Caso contrário, cria-se uma instância do Sequelize usando as configurações do banco de dados (config.database, config.username, config.password).

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    db[model.name] = model;
  });

Essas linhas leem os modelos do banco de dados presentes no diretório atual.

  • fs.readdirSync(__dirname) lê todos os arquivos no diretório atual.
  • .filter(file => { ... }) filtra os arquivos para incluir apenas aqueles que não começam com ".", não têm o mesmo nome do arquivo atual (basename) e possuem extensão ".js".
  • .forEach(file => { ... }) itera sobre cada arquivo filtrado.
  • const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes) carrega o modelo usando require e o passa para a instância do Sequelize, juntamente com os DataTypes do Sequelize.
  • db[model.name] = model adiciona o modelo ao objeto db, usando o nome do modelo como chave.
Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

Essa parte do código percorre todos os modelos carregados no objeto db e verifica se cada modelo possui um método chamado associate. Se possuir, esse método é chamado, passando o objeto db como argumento. O método associate é usado para definir relacionamentos entre os modelos, permitindo que sejam estabelecidas associações de um-para-um, um-para-muitos, etc.

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

Essas linhas definem as propriedades sequelize e Sequelize no objeto db para poderem ser acessadas externamente, db.sequelize é a instância do Sequelize criada anteriormente, e db.Sequelize é a classe do Sequelize. Em seguida, o objeto db é exportado para poder ser importado e usado em outros arquivos do projeto.

Espero ter ajudado. Caso tenha dúvidas, estarei à disposição. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software