PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Verbindung zu postgres von Typoskript hängt

HINWEIS

TLDS! (ZU LANG ÜBERFLUGEN)! Die Antwort ist lang und reichhaltig! Sie können überfliegen! Es ist gut formatiert!

Wenn Sie es sehr eilig haben !Sie können Authentifizieren markieren Abschnitt, Sequelize-typescript (not sequelize) Abschnitt, Sequelize-typescript Abschnitt.

Und besser geht es direkt zur HÖLLE Sektion! Lernen Sie nodejs v14 HELL kennen ! (Gehen Sie direkt zum Ende! Etwas weiter oben).

Aktivieren Sie auch FIX (Postgres v14 HELL)

Ich fing an und bevor ich es merkte, schrieb ich zu viel!

SUPER-ANLEITUNG

Grundsätzlich sollte sequelize nicht einfach hängen! Aber wirf einen Fehler!

Codequelle ansehen

Durch einen Blick auf sync code hier

 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;
  }

Die Aufhängemöglichkeiten sind leicht zu erkennen!

Protokollierung

Um solche Anomalien zu debuggen, ist zunächst eine gute Protokollierung wichtig !

Und Sie können hier überprüfen, wie Sie die Protokollierung hinzufügen! Auch wenn normalerweise sequelize die Protokollierung der Abfrage standardmäßig aktiviert haben!

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

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
});

Überprüfen Sie die Authentifizierung

Wenn keine Protokollierung erfolgt! Das kann bedeuten, dass sequelize nichts gebracht hat und nur am Start hängt! Um die Authentifizierung zu testen und ob die Verbindung funktioniert!

Sie können mit authentifizieren testen :

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);
}

Wenn Sie keine Protokollierung erhalten! Und Gonna authenticate gedruckt ganz ok! Dann hängt der Prozess an authenticate . Was auf ein Problem bei der Authentifizierung hindeutet!

Überprüfen Sie Ihre Anmeldedaten

Stellen Sie sicher, dass Sie keine Fehler gemacht haben!

Überprüfen Sie die Konnektivität von psql oder einem anderen externen Client

  • Wenn es nicht funktioniert! Es deutet auf ein Problem mit dem Postgres-Server hin! Oder irgendeine Konfiguration!
  • Wenn es funktioniert! Dann liegt das Problem in nodejs! Und Ihr Programm!

VERGESSEN SIE NICHT, DEN POSTGRES-TREIBER (oder Ihren DB-Treiber) ZU INSTALLIEREN

Gemäß dem Dokument:https://sequelize.org/master/manual/ Getting-Started.html#Installieren

# 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

Einer der Befehle! Stellen Sie sicher, dass Sie das nicht vergessen haben!

Verstehen was passiert und besser debuggen! (Codequellenprotokollierung)

Der beste Weg zum Debuggen! Und stellen Sie wirklich fest, wo das Problem auftritt! Durch Hinzufügen von Protokollen zum Quellcode selbst! Ein schneller Weg für mich ist das direkt auf node_modules zu tun . Ich habe git auf sequelize repo geöffnet! Suche gemacht! Bestimmt den Ort von sync , authenticate , query ! Alle befinden sich in sequelize.js ! Sie können hier überprüfen ! Man kann STRG + F drücken, um zu den Methoden > authenticate( zu gelangen [fügen Sie den ( hinzu ]. Wie auch immer! Sie können dasselbe in node_modules tun ! Und beginnen Sie mit dem Hinzufügen von Protokollen! Sie werden wissen, in welchem ​​Teil das Problem auftritt! Was Ihnen beim Debuggen des Problems hilft!

Der andere Weg ist fork ! Und benutze deine Gabel! Und einfach besser arbeiten!

Aber mmm! node_modules ist ein schneller Weg ! Sie können eine Kopie nehmen ! zu! Um sicherzustellen, dass Sie Ihre Protokolle nicht verlieren! Sobald Sie aktualisieren! Am Ende sauber indem Sie einfach das gesamte Modul entfernen! Und neu installieren! Oder machen Sie einfach die Protokollerstellung rückgängig (undo)! Ich finde es eine interessante Möglichkeit zum Debuggen!

Aber es sollte einen Fehler ausgeben

Normalerweise sollte es! Indem Sie die Codequelle sehen, können Sie es besser wissen! Normalerweise sollte ein Fehler geworfen werden! Aber wenn ein Prozess aufgehängt wird! Und es wird kein Fehler ausgegeben! Dann können Sie mit einem Ergebnis wie diesem rechnen! Hier kann der Treiber fehlen! Stellen Sie außerdem sicher, dass console.log . Funktioniert schon! Und das letzte! MMM könnte ein Problem mit nodejs sein selbst (siehe letzter Abschnitt).

Ich verwende sequelize-typescript (nicht sequelize)

Sehr wichtig zu wissen! Sequelize-Typoskript ist nur ein Sequelize-Wrapper! Das war da, um Typoskript-Unterstützung hinzuzufügen! Es bietet Dekorateure und einige Funktionen! Auch von Sequelize v5! Typoskript wird direkt in Sequelize unterstützt! Siehe hier https://sequelize.org/master/manual/typescript.html sequelize-typescript in der neusten Version! Verwendet nun auch die nativen Deklarationstypen von sequelize!

Als Sequelize-Typecript Wrap sequelize! Stellen Sie sicher, dass Sie die Fortsetzungsdokumentation überprüfen!

Zu beachten ist auch, dass einige Leute schreien :Verwenden Sie keine Dekorateure! mmmm! mmh! Und noch ein mmmm!https://stackoverflow.com/a/60369189/7668448

Sequelize-Typoskript

Wenn Sie sequelize-typescript verwenden, vergewissern Sie sich, dass die Version von sequelize-typescript vorhanden ist und sequelize übereinstimmen ! Gemäß dem dortigen Dokument V5 von Fortsetzung! Ich schätze V6 sollte auch gehen! Und v1 für sequelize-typescript!

npm install [email protected] [email protected]

Und vergessen Sie nicht die für Typoskript erforderlichen Pakete gemäß dem dortigen Dokument!
https:/ /www.npmjs.com/package/sequelize-typescript

(Sie können alle diese Informationen im Dokument selbst überprüfen und verifizieren)

Warum Sequelize-Typoskript verwenden?

Wie bereits erwähnt! Sequelize bietet ab V5 native Unterstützung für Typoskript . Gemäß hier . Warum also einen Wrapper darüber verwenden! Das verwendet auch Dekorateure! (Ich bin nicht gegen Dekorateure! Einige sind es! Gemäß hier )

Fragen Sie sich warum? Gibt es etwas zu sequelisieren-Typoskript! Ein wichtiges Plus im Vergleich zum nativen Weg ? Wenn es klare Dinge gibt! Bitte erwähnt sie in den Kommentaren! Und ich werde aktualisieren! Dieser Abschnitt!

Und wenn nicht! Native kann viel besser sein! Eine Abhängigkeit oder viele in weniger!

Projektkonfiguration

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/**/*"
    ]
}

Das sind die beiden wichtigen Dinge, die hinzugefügt werden müssen.

"experimentalDecorators": true,
"esModuleInterop": true

Aber das sollte nicht dein Problem sein! Andernfalls wird das Projekt Kompilierungsfehler ausgeben!

HÖLLE

Node js VERSION (V14 HELL)

Und ja! Das kann die Ursache sein! Möglicherweise haben Sie es schon einmal richtig funktioniert! Und dann in einem neuen Computer oder einer neuen Umgebung! Es funktioniert nicht mehr !

Knotenversion kann das Problem sein ! Knoten v15 und Knoten v14 ! Das ist ein bekanntes Problem! Ich bin selbst einmal auf knex.js gestoßen und postgres (knex.js ist ein Abfragegenerator)! Sie sehen also, dass das zusammenhängt! In meiner Geschichte funktionierte der Code auf meinem Laptop und den alten VPS, in denen wir bereitgestellt wurden! Aber dann habe ich auf einem Windows RDP bereitgestellt! Und mmm! Boom! Dann zog ich meine Haare für einige Zeit! Ich habe nachgedacht und nachgesehen! Es gab keine Veränderung! Und dann kam ich zu hey! Ich habe nur nodejs aktualisiert! Und später fand ich heraus, dass andere Leute dasselbe erlebten! Zusamenfassend! Alles begann mit nodejs v14 (ich nenne das v14 HÖLLE )! Sie können meine Antwort dazu hier überprüfen

Und anscheinend ist das gleiche Problem immer da mit nodejs v15 !

In der Frage dieses Threads! Das haben wir bestätigt! In meinem Desktop funktionierte alles gut! Nodejs v12 ! Und mit meinem Freund Computer! Das tat es nicht! nodejs v14 und nodejs v15 . Dann wollte ich bestätigen! Ich habe nodejs v15 installiert Und Kaboom! BINGO! Die Hinrichtung hört einfach unerwartet auf! Keine Protokollierung! Kein Fehler! In v12 ! Alles funktionierte korrekt! Ich hatte zuerst Fehler, dann habe ich sie korrigiert! Und der Server war in Betrieb! Und mit der DB verbunden weiterführen!

Hier die Hinrichtungen

V12 und v13

Ich zeige v13 an! Dasselbe passiert mit 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 :)

Cooles Arbeiten kein Problem

V14- und v15-Ausführung

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  

Und ups! Das Programm wird unerwartet ohne Fehlerausgabe beendet!

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  

Und nochmal Oppsii! Das Programm wird unerwartet ohne Fehlerausgabe beendet!

Es gibt auch keinen Unterschied zwischen v14 und v15 ! Es ist V14 HELL .

Kurz gesagt

Die V14-HÖLLE ist eine bekannte und sehr wahrscheinliche Ursache! Es gibt ein Problem mit pg Modul denke ich! In v14 hat sich etwas geändert und dieses Problem verursacht!

Kurz gesagt kurz! Wenn nichts Sinn macht! Und wenn Ihr gleicher Code vorher funktioniert hat! Das erste, was zu tun ist! Ist mit nodejs v13 zu überprüfen oder v12 ! Das kann Sie vor dem Wahnsinn bewahren! Wer würde sagen, dass die Version von nodejs und eine neue ein solches Problem verursachen!

Was ist das für ein Problem! Was ist V14 HELL in nodejs?

Wenn Sie wie ich die Details wissen möchten und was passiert ist!?

Mit Knoten V14! Auf der API sind einige Breaking Changes passiert! Auch wurde vieles verändert! Inklusive Openssl-Version!

Für Postgres! Und pg Modul! Das Problem wurde in diesem Kommentar beschrieben gemäß diesem Thread :

Und gemäß diesem PR !

Sie können die Änderungen in dieser Unterschied sehen

Kurz gesagt wie gesagt! Das Verhalten für onReadySate für net.Socket geändert !Und die implementierte Lösung bestand darin, onReadyState nicht zu verwenden überhaupt!

Und gemäß diesem

Überprüfen Sie diese Zeile

In der älteren Version wurde der Connect nur aufgerufen, wenn der Socket auf closed war Zustand! readyState Nutzung entfällt!

Du kannst verstehen! Je nach Ausführung! Viele Dinge können von diesen grundlegenden Änderungen betroffen sein oder auch nicht!

Relevante Knotenänderungen

Und weil ich sehen wollte, wo die Veränderung passiert! Hier können Sie nachsehen

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

Man kann auch das Änderungsprotokoll überprüfen:

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

FIX (Postgres v14 HÖLLE)

Gemäß meiner Antwort hier .

Aktualisieren Sie pg Treiber auf >=8.0.3 ! Sie können einfach auf die neueste Version aktualisieren!

npm install [email protected] --save

Und Sie können nach unserem fraglichen Problem suchen

Alte Version bei v7

Aktualisierung auf v8

Läuft wieder mit node v15

Taraaaa! Und es hat super funktioniert!

Und wenn Sie postgres nicht verwenden ! Und das Problem war v14 HELL ! Bedeutung Sie haben mit v13 getestet . Und es hat funktioniert! Versuchen Sie dann, Ihren db-Treiber auf den neuesten Stand zu bringen!

Warum Knoten v14 + beendet und kein Protokollierungsfehler

Ganz zu schweigen von den Breaking Changes! pg erstellt beenden Sie den Prozess bei connect() call . Und das hat es zum Ausstieg gebracht! Und Logging war zu sehen! Dazu ausführlicher! Hier, wie es passiert ist! Sequelize haben die Postgres-Dialekt-Implementierung! Welche Verwendung pg! Und pg-Client! Verbindung herstellen! Die Verbindung hat einen connect Veranstaltung! Wenn es eine Verbindung herstellt, sendet es es aus! Und weil Node v14 das Verhalten so ändert, dass es mit open beginnt! Die Streamverbindung wird übersprungen! Und der Stream wird als verbunden angesehen! Wo es nicht ist! Und die connect Ereignis wird direkt ausgegeben! Wenn das passiert! Der Client ruft entweder requestSsl() auf oder startup() Methode des Verbindungsobjekts! Und beide rufen this._stream.write auf . weil der Stream nicht verbunden ist! Ein Fehler passiert! Dieser Fehler ist nicht zu fangen! Dann das Versprechen im Folgefahrer! Bleibt ungelöst! Und dann wird die Ereignisschleife leer! Nodejs verhalten sich standardmäßig einfach beenden!

Sie können den Schritt durch die Codezeilen sehen:

Warum nodejs beendet wird (ungelöste Versprechungen)

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

Knoten wird ohne Fehler beendet und wartet nicht auf Zusage (Ereignisrückruf)

was passiert, wenn ein Promise nie aufgelöst wird?

NVM

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

Wenn Sie nicht wissen, was nvm ist! Oder Sie verwenden nvm nicht . Erwägen Sie, es zu verwenden! Da es ein sehr interessantes Werkzeug ist! Nvm ist ein Tool zur Knotenversionsverwaltung !

Mit nvm ändern, debuggen und testen zu und mit verschiedenen Versionen von nodejs! Geht schnell und ist kinderleicht! Und so parallel neue Versionen von nodejs installieren!

Hinweis zu sequelize.sync()

Verwenden Sie es nicht für die production ! Oder überhaupt! (Die meisten ORM! und Query Builder (knex.js) verwenden Migrationen).

https://sequelize.org/master/manual/model -basics.html#synchronization-in-production

Aus dem Dokument