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

[Dúvida] Utilizaçao de es6 com sequelize

Boa tarde tentei configurar o sequelize para utilizar import e export mas nao obtive nenhum sucesso, mesmo mantendo os arquivos models, seeds e migrations com cjs, ainda sim nao obtive sucesso gostaria de saber se possivel trabalhar com es6 e sequelize?

Muito obrigado

3 respostas

Olá, Vitor! Tudo bem?

Sim, é totalmente possível utilizar ES6 com Sequelize. No entanto, existe a questão comentada pela instrutora, onde algumas ferramentas do Sequelize podem não se dar muito bem com esse formato. Então, recomendo que durante o desenvolvimento do projeto do curso você utilize o modelo "CommonJS" e, ao finalizar, tente replicá-lo com o ES6.

Para configurar seu ambiente para utilizar o padrão "ES6" é necessário apenas atribuir a propriedade "type" com o tipo "module" no seu arquivo package.json. Segue um exemplo de como deve ser feito isso:

  "description": "Repositório do curso de API com Node.js, Express e Sequelize",
  "main": "server.js",
  "type": "module", // adicionar somente essa linha

Pronto! Após aplicar essa simples propriedade, o seu ambiente está configurado para utilizar o padrão ES6 para import e export. Segue um exemplo simples de como ficarão as importações e exportações usadas nesse método.

// Importação
import express from 'express';

// Exportação
const app = express();
export default app;

OBS: lembre-se que com esse modelo os arquivos com códigos JavaScript devem ter a extensão .js e não .cjs.

No mais, espero ter ajudado e bons estudos!

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

Olá boa tarde, Antes de tudo muito obrigado pela dica e pela resposta, mas ainda ocorre um problema.

As configurações do models, seeders e migrations, nao mexi em nenhum deles então estão todos como comun.js mas ainda sim o o final .js oque ocorre e que quando vou importar o index do models, esta informando que nao possui nenhum export defualt.

Outro ponto que ja tentei resolver seria mudar o arquivo models para es6 com import e export, mas mesmo mudand ainda ocorre um problema com um trecho de codigo que não sei identificar o porque nao se funciona: const config = require(${__dirname}/../config/config.json)[env];

Arquivo Controller:

import { Sequelize as database } from '../models/index.js';

class LivrosController {
  static async pegarTodos(req, res) {
    try {
      const listaLivros = await database.Livro.findAll();

      return res.status(200).json(listaLivros);
    } catch (error) {
      return res.status(500).json(error.message);
    }
  }

Error:

import database from '../models/index.js';
           ^^^^^^^^
       
SyntaxError: The requested module '../models/index.js' does not provide an export named 'default'

Models com final .js:

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

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) => (
    file.indexOf('.') !== 0
      && file !== basename
      && file.slice(-3) === '.js'
      && file.indexOf('.test.js') === -1
  ))
  .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;

Novamente eu agradeço a resposta e todo o carinho de responder rápido;

solução!

Opa Vitor! Joia?

Acerca do erro no arquivo "index.js" da pasta "models", ele informa que não foi possível encontrar uma exportação de método, classe ou objeto com o nome "default", essa é a estrutura padrão, de exportação, para um projeto que utiliza o método ES6, que é o tipo module.

Com isso, analisando o final do seu código do arquivo "index.js", notei que você continua usando o estilo de exportação do CommonJS, e isso está causando o erro em questão. Então, troque o seguinte trecho:

module.exports = db;

Por esse:

export default db;

A meu ver, quando você realizar esse ajuste, o seu código deve funcionar sem mais problemas.

Bons estudos,