PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

La connessione a postgres da dattiloscritto si blocca

AVVISO

TLDS! (TROPPO LUNGO SKIM)! La risposta è lunga e ricca! Puoi scremare! È ben formattato!

Se hai molta fretta !Puoi selezionare Autentica sezione, Sequele-dattiloscritto (non sequel) sezione, Sequenza-dattiloscritto sezione.

E meglio che tu vada direttamente all'INFERNO sezione! Conosci nodejs v14 HELL ! (Vai direttamente alla fine! Bene un po' sopra).

Controlla anche FIX (Postgres v14 HELL)

Ho iniziato e prima di sapere mi sono ritrovata a scrivere troppo!

SUPER GUIDA

Fondamentalmente la sequela non dovrebbe semplicemente essere bloccata! Ma lancia un errore!

Guardando il codice sorgente

Guardando sync codice qui

 async sync(options) {
    // ...

    // no models defined, just authenticate
    if (!models.length) {
      await this.authenticate(options);
    } else {
      for (const model of models) await model.sync(options);
    }
    if (options.hooks) {
      await this.runHooks('afterBulkSync', options);
    }
    return this;
  }

Si possono facilmente vedere le possibilità di sospensione!

Registrazione

Per eseguire il debug di tali anomalie prima di tutto è importante avere una buona registrazione !

E puoi controllare come aggiungere la registrazione qui! Anche se normalmente sequele ha la registrazione della query attivata per impostazione predefinita!

https://sequelize.org/master/manual/getting-started.html #registrazione

const sequelize = new Sequelize('sqlite::memory:', {
  // Choose one of the logging options
  logging: console.log,                  // Default, displays the first parameter of the log function call
  logging: (...msg) => console.log(msg), // Displays all log function call parameters
  logging: false,                        // Disables logging
  logging: msg => logger.debug(msg),     // Use custom logger (e.g. Winston or Bunyan), displays the first parameter
  logging: logger.debug.bind(logger)     // Alternative way to use custom logger, displays all messages
});

Verifica l'autenticazione

In caso contrario, la registrazione avviene! Ciò potrebbe significare che il sequel non ha fatto nulla ed è solo sospeso all'inizio! Per testare l'autenticazione e se la connessione funziona!

Puoi eseguire il test con autenticazione :

https://sequelize.org/master/manual/getting -started.html#testing-the-connection

try {
  console.log('Gonna authenticate'); // <== to make sure console.log is working and not overrided!
  await sequelize.authenticate();
  console.log('Connection has been established successfully.');
} catch (error) {
  console.error('Unable to connect to the database:', error);
}

Se non ottieni la registrazione! E Gonna authenticate stampato semplicemente ok! Quindi il processo è sospeso su autenticazione . Che suggeriscono un problema nell'autenticazione!

Verifica le tue credenziali

Assicurati di non aver commesso errori!

Verifica la connettività da psql o da qualche altro client esterno

  • Se non funziona! Suggerisce un problema con il server Postgres! O qualche configurazione!
  • Se funziona! Allora il problema è in nodejs! E il tuo programma!

NON DIMENTICARE DI INSTALLARE IL DRIVER POSTGRES (o il tuo driver db)

Come da documento:https://sequelize.org/master/manual/ get-started.html#installazione

# One of the following:
$ npm install --save pg pg-hstore # Postgres
$ npm install --save mysql2
$ npm install --save mariadb
$ npm install --save sqlite3
$ npm install --save tedious # Microsoft SQL Server

Uno dei comandi! Assicurati di non averlo dimenticato!

Capire cosa sta succedendo ed eseguire meglio il debug! (registrazione della sorgente del codice)

Il modo migliore per eseguire il debug! E determinare davvero dove sta accadendo il problema! È aggiungendo log al codice sorgente si! Un modo veloce per me è farlo direttamente su node_modules . Ho aperto git su sequelize repo! Fatto una ricerca! Determinato il luogo di sync , authenticate , query ! Tutti risiedono in sequelize.js ! puoi controllare qui ! Si può CTRL + F per arrivare ai metodi > authenticate( [aggiungi il ( ]. Comunque! Puoi fare lo stesso in node_modules ! E inizia ad aggiungere log! Saprai in quale parte si sta verificando il problema! Che ti aiutano a risolvere il problema!

L'altro modo è fork ! E usa la tua forchetta! E funziona meglio!

Ma mmm! node_modules è un modo veloce ! Puoi farne una copia ! anche! Per assicurarti di non perdere i tuoi log! Una volta aggiornato! Alla fine pulisci semplicemente rimuovendo l'intero modulo! E reinstalla! O semplicemente invertire la creazione dei log (annulla)! Lo trovo un modo interessante per il debug!

Ma dovrebbe generare un errore

Normalmente dovrebbe! Vedendo la fonte del codice puoi conoscere meglio! Normalmente dovrebbe essere generato un errore! Ma se un processo si blocca! E non viene generato alcun errore! Allora puoi aspettarti un risultato come questo! Ecco che può essere il driver mancante! Assicurati inoltre di console.log . Funziona bene! E l'ultima cosa! MMM potrebbe essere un problema con nodejs stesso (vedi l'ultima sezione).

Sto usando sequelize-typescript (non sequelize)

Molto importante da sapere! Sequelize-dattiloscritto è solo un wrapper di sequele! Era lì per aggiungere il supporto per i dattiloscritti! Fornisce decoratori e alcune funzionalità! Anche da sequelize v5! Il dattiloscritto è supportato direttamente in sequelize! Vedi quihttps://sequelize.org/master/manual/typescript.html sequelize-dattiloscritto nell'ultima versione! Rivolto a utilizzare anche i tipi di dichiarazione nativa di sequelize!

Mentre l'involucro dattiloscritto segue la sequela! Assicurati di verificare la documentazione di sequelize!

Da notare anche che alcune persone gridano :Non usare decoratori! mmmm! mmm! E un altro mmmm!https://stackoverflow.com/a/60369189/7668448

Sequenza-dattiloscritto

Se stai usando sequelize-typescript assicurati la versione di sequelize-typescript e sequelize fare corrispondenza ! Come da lì doc V5 di sequela! Immagino V6 anche dovrebbe fare! E v1 per sequele-dattiloscritto!

npm install [email protected] [email protected]

E non dimenticare i pacchetti dattiloscritti necessari come da lì doc!
https:/ /www.npmjs.com/package/sequelize-typescript

(Puoi controllare e verificare tutte queste informazioni nel documento stesso)

Perché usare sequelize-dattiloscritto?

Come già accennato! Sequelize ha il supporto nativo per dattiloscritto a partire da V5 . Come da qui . Allora perché usare un involucro sopra di esso! Che usano anche i decoratori! (Non sono contro i decoratori! Alcuni lo sono! Secondo qui )

Chiediti perché? C'è qualcosa da seguire-dattiloscritto! Un vantaggio importante rispetto al modo nativo? Se ci sono cose chiare! Si prega di menzionarli nei commenti! E aggiornerò! Questa sezione!

E se no! Nativo può essere molto meglio! Una dipendenza o molte in meno!

Configurazione del progetto

tsconfig!

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es6",
        "moduleResolution": "node",
        "rootDir": "./src",
        "outDir": "./dist",
        "lib": [
            "es2015",
            "es2016",
            "dom"
        ],
        "declaration": true,
        "experimentalDecorators": true,
        "esModuleInterop": true
    },
    "include": [
        "src/**/*"
    ],
    "exclude": [
        "node_modules/**/*",
        "src/**/*.test.tsx",
        "src/**/*.story.tsx",
        "test/**/*"
    ]
}

Queste sono le due cose importanti da aggiungere.

"experimentalDecorators": true,
"esModuleInterop": true

Ma non dovrebbe essere un tuo problema! Altrimenti il ​​progetto genererà errori di compilazione!

INFERNO

VERSIONE nodo js (V14 HELL)

E sì! Questa può essere la causa! Potresti già farlo funzionare bene prima! E poi in un nuovo computer o ambiente! Non funziona più !

La versione del nodo può essere il problema ! Nodo v15 e Nodo v14 ! Questo è un problema noto! Io stesso ho incontrato una volta con knex.js e postgres (knex.js è un generatore di query)! Quindi puoi vedere che è correlato! Nella mia storia il codice funzionava perfettamente sul mio laptop e sui vecchi vps in cui abbiamo implementato! Ma poi ho distribuito su un Windows rdp! E mmm! Boom! Poi mi sono tirato i capelli per un po'! Ho riflettuto e controllato! Non c'è stato nessun cambiamento! E poi sono venuto a hey! Ho aggiornato solo nodejs! E più tardi ho scoperto che altre persone hanno riscontrato la stessa cosa! In breve! Tutto è iniziato su nodejs v14 (lo chiamo v14 INFERNO )! Puoi controllare la mia risposta al riguardo qui

E apparentemente lo stesso problema è sempre presente con nodejs v15 !

Nella domanda di questo thread! Lo abbiamo confermato! Nel mio desktop funzionava tutto bene! Nodejs v12 ! E con il mio amico computer! Non è successo! nodejs v14 e nodejs v15 . Poi volevo confermare! Ho installato nodejs v15 E caboom! BINGO! L'esecuzione si interrompe inaspettatamente! Nessuna registrazione! Nessun errore! In v12 ! Tutto funzionava correttamente! all'inizio avevo degli errori poi li ho corretti! E il server era attivo e funzionante! E seguiti connesso al DB!

Ecco le esecuzioni

V12 e v13

Sto visualizzando la v13! Lo stesso accade con la v12!

nvm use v13
Now using node v13.14.0 (npm v6.14.4)
 [email protected]  ~/Documents/coderhero/Dev/projects/Fahima-ecommerce   LuckyLook  npm run dev 

> [email protected] dev /home/coderhero/Documents/coderhero/Dev/projects/Fahima-ecommerce
> npx ts-node-dev src/server.ts

[INFO] 01:49:29 ts-node-dev ver. 1.0.0 (using ts-node ver. 9.0.0, typescript ver. 4.0.5)
config ::::
{
  username: 'fahima',
  password: '123456',
  database: 'fahimashop',
  host: 'localhost',
  dialect: 'postgres'
}
hi there ::::
Executing (default): SELECT 1+1 AS result
connection established
Executing (default): CREATE TABLE IF NOT EXISTS "Products" ("id"   SERIAL , "brand" TEXT, "price" DECIMAL, "description" VARCHAR(255), "imgUrl" VARCHAR(255), "category" VARCHAR(255), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, PRIMARY KEY ("id"));
Executing (default): SELECT i.relname AS name, ix.indisprimary AS primary, ix.indisunique AS unique, ix.indkey AS indkey, array_agg(a.attnum) as column_indexes, array_agg(a.attname) AS column_names, pg_get_indexdef(ix.indexrelid) AS definition FROM pg_class t, pg_class i, pg_index ix, pg_attribute a WHERE t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND t.relkind = 'r' and t.relname = 'Products' GROUP BY i.relname, ix.indexrelid, ix.indisprimary, ix.indisunique, ix.indkey ORDER BY i.relname;
server running http://localhost:8100
press CTRL+C to stop server, please :)

Ottimo funzionamento nessun problema

Esecuzione V14 e v15

v14

 [email protected]  ~/Documents/coderhero/Dev/projects/Fahima-ecommerce   LuckyLook  node -v        
v14.15.0
 [email protected]  ~/Documents/coderhero/Dev/projects/Fahima-ecommerce   LuckyLook  npm run dev

> [email protected] dev /home/coderhero/Documents/coderhero/Dev/projects/Fahima-ecommerce
> npx ts-node-dev src/server.ts

[INFO] 02:07:35 ts-node-dev ver. 1.0.0 (using ts-node ver. 9.0.0, typescript ver. 4.0.5)
config ::::
{
  username: 'fahima',
  password: '123456',
  database: 'fahimashop',
  host: 'localhost',
  dialect: 'postgres'
}
hi there ::::
 [email protected]  ~/Documents/coderhero/Dev/projects/Fahima-ecommerce   LuckyLook  

E ops! Il programma si sta chiudendo in modo imprevisto senza alcun output di errore!

V15

 [email protected]  ~/Documents/coderhero/Dev/projects/Fahima-ecommerce   LuckyLook  nvm use v15    
Now using node v15.0.1 (npm v7.0.3)
 [email protected]  ~/Documents/coderhero/Dev/projects/Fahima-ecommerce   LuckyLook  npm run dev

> [email protected] dev
> npx ts-node-dev src/server.ts

[INFO] 02:10:48 ts-node-dev ver. 1.0.0 (using ts-node ver. 9.0.0, typescript ver. 4.0.5)
config ::::
{
  username: 'fahima',
  password: '123456',
  database: 'fahimashop',
  host: 'localhost',
  dialect: 'postgres'
}
hi there ::::
 [email protected]  ~/Documents/coderhero/Dev/projects/Fahima-ecommerce   LuckyLook  

E di nuovo oppsii! Il programma si sta chiudendo in modo imprevisto senza alcun output di errore!

Non c'è alcuna differenza anche tra v14 e v15 ! È V14 HELL .

In breve

L'INFERNO V14 è una causa nota e molto probabile! Si è verificato un problema con pg modulo immagino! Qualcosa è cambiato su v14 e ha causato questo problema!

In breve! Se niente ha senso! E se il tuo stesso codice funzionava prima! Prima cosa da fare! È controllare con nodejs v13 o v12 ! Questo può salvarti dalla follia! Chi direbbe che la versione di nodejs e una nuova creeranno un tale problema!

Qual ​​è questo problema! Che cos'è V14 HELL in nodejs?

Se come me vi piace conoscere i dettagli e cosa è successo!?

Con il nodo V14! Alcune modifiche importanti sono avvenute sull'API! Anche molte cose sono state cambiate! Inclusa la versione Openssl!

Per postgres! E pg modulo! Il problema era come descritto in questo commento per questo thread :

E secondo questo PR !

Puoi vedere le modifiche in questa differenza

In breve come accennato! Il comportamento per onReadySate modificato per net.Socket !E la soluzione implementata era di non usare onReadyState affatto!

E come per questo

Controlla questa riga

Nella versione precedente la connessione veniva chiamata solo se il socket era su closed stato! readyState l'utilizzo è eliminato!

Puoi capire! A seconda dell'implementazione! Molte cose possono o meno essere influenzate da queste modifiche fondamentali!

Modifiche ai nodi rilevanti

E perché volevo vedere dove sarebbe avvenuto il cambiamento! Ecco a te e puoi controllare

https://github.com/nodejs/node/pull/32272

Si può anche controllare il registro delle modifiche:

https://github.com/nodejs/node/blob /master/doc/changelogs/CHANGELOG_V14.md

FIX (Postgres v14 HELL)

Secondo la mia risposta qui .

Aggiorna pg driver a >=8.0.3 ! Puoi semplicemente eseguire l'aggiornamento alla versione più recente!

npm install [email protected] --save

E puoi verificare il nostro problema in questione

Vecchia versione su v7

Aggiornamento a v8

Esecuzione di nuovo con node v15

Taraaaaa! E ha funzionato benissimo!

E se non stai usando postgres ! E il problema era v14 HELL ! Significato che hai testato con v13 . E ha funzionato! Quindi prova ad aggiornare il tuo driver db alla versione più recente!

Perché nodo v14 + uscita e nessun errore di registrazione

Anche per citare le modifiche di rottura! Fatto pg fai uscire il processo alla connect() call . Ed è quello che l'ha fatto uscire! E la registrazione doveva essere vista! Più in dettaglio per questo! Ecco come è successo! Sequelizza hai l'implementazione del dialetto postgres! Che uso pag! E pg client! crea una connessione! La connessione ha un connect evento! Quando si collega lo emette! E poiché il nodo v14 cambia il comportamento iniziando con open! La connessione allo streaming è saltata! E lo stream viene considerato connesso! Dove non è! E il connect l'evento viene emesso direttamente! Quando ciò accadrà! Il client chiamerà requestSsl() o startup() metodo dell'oggetto di connessione! Ed entrambi chiameranno this._stream.write . perché il flusso non è connesso! È successo un errore! Questo errore non è cattura! Quindi la promessa in sequela driver! Rimarrà irrisolto! E poi il ciclo degli eventi si svuota! Nodejs per impostazione predefinita esci e basta!

Puoi vedere il passaggio attraverso le righe di codice:

Perché nodejs esce (promesse irrisolte)

https://github.com/nodejs/node/issues/22088

Il nodo esce senza errori e non attende la promessa (richiamata dell'evento)

cosa succede quando una promessa non si risolve mai?

NVM

https://github.com/nvm-sh/nvm

Se non sai cosa nvm è! Oppure non stai usando nvm . Considera di usarlo! Perché è uno strumento molto interessante! Nvm è uno strumento di gestione delle versioni dei nodi !

Con la modifica, il debug e il test di nvm su e con diverse versioni di nodejs! È veloce e un gioco da ragazzi! E quindi installare nuove versioni di nodejs in parallelo!

Nota su sequelize.sync()

Non usarlo per la production ! O del tutto! (La maggior parte di ORM! E il generatore di query (knex.js) utilizzano le migrazioni).

https://sequelize.org/master/manual/model -basics.html#sincronizzazione-in-produzione

Dal documento