[Sistema De Agendamento (Módulo Node.JS - Semana 5)] Perguntas, Respostas e Compartilhamentos

Pessoal,

Estou criando esse tópico para concentrar os problemas que encontrei e destacar informações importantes.
Caso alguém tenha alguma contribuição posso ir editando e acrescentando. É só avisar.
INFO: Repositório no github com o projeto do professor

INFO: Repositório no github com o desenvolvimento em fases (branches) e lista de comandos

Clique na seta para abrir detalhes do item.
Os bugs foram numerados na ordem em que ocorreram as consultas e o registro das soluções sugeridas, nã a sequência das aulas.

BUG 1: Migration sendo criada na pasta errada. @AlbertoRebello
SOLUÇÃO: Arquivo .sequelizerc deve estar na raiz do projeto.
Resolvi quando atentei para aseguinte observação na documentação (1): "To begin, let's create the .sequelizerc file in the root directory of your project, with the following content:" Eu tinha criado dentro de src.

ALERTA 1: Erro ao desestruturar exports default, usando { } @Luanftg Ter atenção com erros de syntax na desestruturação de objetos.
Veja a syntax correta para o seu caso em JavaScript-Statements-import Reference
No caso específico relatado por @Luanftg a correção foi feita em:
DE: import { express } from 'express'; import { routes } from './router.js';

PARA:
import express from ‘express’;
import routes from ‘./router.js’;



ALERTA 2: syntax de .sequelizerc Atenção ao escrever o objeto no arquivo .sequelizerc conforme a documentação, alterando os argumento de path.resolve para o seu projeto conforme a aula: // .sequelizerc const path = require('path');

module.exports = {
‘config’: path.resolve(‘config’, ‘database.json’),
‘models-path’: path.resolve(‘db’, ‘models’),
‘seeders-path’: path.resolve(‘db’, ‘seeders’),
‘migrations-path’: path.resolve(‘db’, ‘migrations’)
};


BUG 2: TypeError: Cannot read properties of undefined (reading 'length') [aula7 17:04]
SOLUÇÃO: Nem todas as correções abaixo foram necessárias para todos os alunos que contribuiram com esse post.
Contribuiram para essa solução: @herbjrr, @michelnegrao, @AlbertoVictorRebello
=> No arquivo ">User.js" adicionar "return.this;" no fim da função "static init(sequelize) {...};"
=> No arquivo dentro da pasta migrations trocar o "created_at e updated_at por createdAt e updatedAt;"
=> No arquivo routes.js importar o database: "import Database from './database/index';"
=> Resetar o database no postbird pelo terminal com os comandos: npx sequelize db:migrate:undo:all npx sequelize db:migrate npm run dev

BUG 3: App não criou sozinho ./models/index.js [aula 8 03:00]
SOLUÇÃO Copiei arquivo do repositorio do projeto. Não identificada a causa.
Não foi identificada a causa do comportamento diferente da aula.

BUG 4: ReferenceError: auth is not defined [aula10 24:16]
SOLUÇÃO: Exportar o objeto diretamente em Auth.js
export default { secret: 'd14003a82cd66d15cc4a2404a0fb9a8d', expiresIn: '1h' };
Confirmar o import no arquivo "SessionController.js":

import authConfig from "../../config/auth";

ALERTA 3: [Aula 11 38:52] No update, como surge o id do user se não digitei no body? Pensei em destacar um detalhe da linguagem java script que pode facilitar o entendimento do arquivo
"src/app/middlewares/auth.js", na linha
const user = await User.findByPk(req.userId)
Dúvida: de onde vem essa propriedade se no json que escrevi na minha req não coloquei o id do usuário?
Resposta: essa propriedade foi criada em req pelo middleware auth.js pela linha req.userId = decoded.id;

Isso fica claro quando lembramos como podem ser criadas propriedades dentro de um objeto. O código abaixo dá um
exemplo:

const myObject = {

property01: 'initialProperty'

}

console.log('=== Just creates an object with 1 property ===');

console.log(myObject);

console.log();

console.log('=== Just includes a new property ===');

myObject.property02 = 'property-included-by-dot-notation';

console.log(myObject);

console.log();

console.log('=== Just includes one more new property ===');

myObject['property03'] = 'property-included-by-array-like-notation';

console.log(myObject);

/* SAIDA:
=== Just creates an object with 1 property ===

{ property01: 'initialProperty' }

=== Just includes a new property ===

{

property01: 'initialProperty',

property02: 'property-included-by-dot-notation'

}

=== Just includes one more new property ===

{

property01: 'initialProperty',

property02: 'property-included-by-dot-notation',

property03: 'property-included-by-array-like-notation'

}
*/

BUG 5: Postbird não conecta com docker [Aula03 03:51]
SOLUÇÃO: Executar comando sudo docker start container id
A sequência abaixo foi executada em Linux. Em algum momento pode haver diferenças a serem consideradas.

Considerando que você esteja usando Docker em sua aplicação:
Precisa garantir que o seu container docker está em running (se passou algum tempo depois de ter sido criado ou desligou o computador ele pode estar stopped. O seguinte comando lista todos os containers, mesmo os que não estão em running:
sudo docker ps -a
Seu container está em running? Uma forma de confirmar é executar o comando acima sem -a. Ele só será listado se estiver em running.
Neste caso, copie o container id do seu baco postgres e execute:
obs: substitua a3d062f08d01 pelo seu container id

sudo docker start a3d062f08d01
Abra o seu Postbird:

crie o banco de dados se ainda não criou
conecte com o banco de dados
Execute os seguintes comandos para reverter e aplicar suas migrations:
npx sequelize db:migrate:undoAll
npx sequelize db:migrate
Com o propóstito de validar se o seu Postgres está ok, se você rodar diretamente no Postbird esse SQL funciona?
INSERT INTO users (id,name,email,password_hash,“created_at”,“updated_at”) VALUES (DEFAULT,‘newUser’, ‘userEmail’, ‘userPassword’, now(), now());


Documentação de referência:

  1. sequelize.org/migrations
  2. Artigo com muitas semelhanças com nosso projeto, inclusive nos nomes de arquivos e objetos, variáveis etc
  3. Artigo sugerido por @DeyvisonEstevan:
    PostgreSQL configuration using Docker, Postbird and Sequelize
  4. Artigo sugerido por Rebeca Bertolini (Slack):
    PostgreSQL configuration using Docker, Postbird and Sequelize
  5. JavaScript-Statements-import Reference
37 Likes

Boa tarde, Alberto.

To preso no bug 2 há duas horas, conseguiu progredir?

5 Likes

Não voltei nele ainda. Pensando em uma estratégia hahaha

3 Likes

Pessoal, incluí o link de um artigo que pode nos ajudar no fim do post principal. Repito aqui para conveniencia:
https://medium.com/@flavio.ever/criando-um-backend-completo-em-nodejs-com-es6-e-configurando-o-ambiente-parte-1-8c271a010c9c

7 Likes

Para o segundo Bug, precisa incluir o import do database no app.js:

import express from ‘express’;
import routes from ‘./routes’;
import ‘./database’; <<<<<<----------------- Aqui !!!

class App { …

6 Likes

Boa noite, Michel.

Inserindo esse import outro erro é apresentado, eu dei uma olhada no arquivo do Douglas no github e realmente ele já tem esse import no fim do projeto, mas nessa parte em que estamos aparentemente ainda não. Você conseguiu receber o user no Postbird com essa alteração apenas?

Obrigado!

3 Likes

Oi @michelnegrao, naverdade meu App.js já está com essas importações. O aplicativo funciona até o momento em que incluo o seguinte trecho em route.js:

const user = await User.create({
        name: 'Alberto',
        email: 'albertorebello@alberto.com',
        password_hash: '1234567890'      
    })
3 Likes

Consegui sim. Qual o erro apresentado agora ?

3 Likes

O Trecho esta correto. Se o erro for este do length, deve ter algum problema com as importações

3 Likes

Funcionou pessoal. O bug 2 foi resolvido no meu caso com a linha return this;, no final da função static init(sequelize) { do User.js

Como durante a a pesquisa fiz outras tentativas pode ser que não seja só isso mas essa foi a última peça que faltava para esse quebra-cabeça. Se der, vou tentar reverter o que fiz até agora para ter mais certeza.

5 Likes

O exato trecho de código que gera o erro pra mim é esse: await User.create , se eu removo ele, a aplicação roda, o json é exibido na tela, mas o user não é gerado no postbird.

5 Likes
Executing (default): INSERT INTO "Users" ("id","name","email","password_hash","createdAt","updatedAt") VALUES (DEFAULT,$1,$2,$3,$4,$5) RETURNING "id","name","email","password_hash","provider","createdAt","updatedAt";
node:internal/process/promises:279
            triggerUncaughtException(err, true /* fromPromise */);
            ^

Error
    at Query.run (C:\Code\hc#3\semana5\sistemaDeAgendamento\node_modules\sequelize\lib\dialects\postgres\query.js:50:25)

@AlbertoVictorRebello SObre return this; Essa não resolveu pra mim. Seu projeto tá no github? Se sim, me manda o link, por favor.

3 Likes

No início desse post tem o git com o projeto do professor. Eu resolvi comparando o meu código com o dele. Já desfiz a maioria das coisas que fiz além dessa linha mas pode ser que tenha algo mais que esqueci.

3 Likes

@ArthurCandido, com o propóstito de validar se o seu Postgres está ok, se você rodar diretamente no Postbird esse SQL funciona?
INSERT INTO users (id,name,email,password_hash,“created_at”,“updated_at”) VALUES (DEFAULT,‘newUser’, ‘userEmail’, ‘userPassword’, now(), now());

4 Likes

@Arthur Candido, seu código está no github?

3 Likes

Desse jeito ai nao funciona nao, tive que alterar as aspas de colunas e valores:

INSERT INTO users (id,name,email,password_hash,created_at,updated_at)
VALUES (DEFAULT,‘newUser’, ‘userEmail’, ‘userPassword’, now(), now());

3 Likes

@michelnegrao, no meu funcionou.Em outros DBs as aspas são opcionais nos nomes de campos, salvo se contiverem espaçõs. Acreditei que nesse funcionaria da mesma forma.

3 Likes

Olá pessoal, travei na aula 6 - na criação das tabelas do DB. Alguém consegue me dar um help?

o erro é esse agora: PS C:\Users\suele\Desktop\Hiring Coders\Jornada\NodeJS\sistemadeagendamento> npx sequelize db:migrate

Sequelize CLI [Node: 16.15.0, CLI: 6.4.1, ORM: 6.20.1]

ERROR: Cannot find “C:\Users\suele\Desktop\Hiring Coders\Jornada\NodeJS\sistemadeagendamento\config\database.json”. Have you run “sequelize init”?

4 Likes

veja como esta o seu arquivo ‘.sequelizerc’

O nome do arquivo deve ser assim mesmo, começando com ponto e terminando no rc.

O conteudo deve ser esse:

const { resolve } = require(‘path’);

module.exports = {

config: resolve(__dirname, 'src', 'config', 'database.js'),
'models-path': resolve(__dirname, 'src', 'app', 'models'),
'migrations-path': resolve(__dirname, 'src', 'database', 'migrations'),
'seeders-path': resolve(__dirname, 'src', 'database', 'seeds'),

}

4 Likes

Obrigada pela força @michelnegrao, consegui resolver!
O arquivo estava certo com a aula, exatamente assim, então tentei como outro colega sugeriu em outro post, e como esta no doc oficial, usando o ‘const path’ mas não resolveu pra mim também, tive ajustar duas coisas pois os estavam alternando.

Vou deixar aqui, caso alguém tenha o mesmo problema:

1 - Erro: - Error: require is
not defined in ES module scope, you can use import instead
This file is being treated as an ES module because it has a ‘.js’ file extension
and ‘C:\Users\suele\Desktop\Hiring Coders\Jornada\NodeJS\sistemadeagendamento\p
ackage.json’ contains “type”: “module”. To treat it as a CommonJS script, rename
it to use the ‘.cjs’ file extension.

Correção: No arquivo packjson, alterar o “type”: “module” para “type”: “commonjs”,

2 - Erro: Sequelize CLI [Node: 16.15.0, CLI: 6.4.1, ORM: 6.20.1]

Loaded configuration file “src\config\database.js”.
ERROR: ENOENT: no such file or directory, scandir ‘C:\Users\suele\Desktop\Hiring Coders\Jornada\NodeJS\sistemadeagendamento\src\config\database\migrations’

Correção: Corrigi os caminhos do arquivo no arquivo ‘.sequelizerc’ ficaram assim:

const path = require ('path');

module.exports = {
        'config': path.resolve('./src/config', 'database.js'),
        'models-path': path.resolve('.src/database/models'),
        'seeders-path': path.resolve('./src/database/seeders'),
        'migrations-path': path.resolve('./src/database/migrations')
      }
4 Likes