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:
- Sequelize pg adapter will Rufen Sie den pg-Client auf, um eine Verbindung herzustellen, und das Promise
- pg client call connect auf einem Verbindungsobjekt
- pg-Verbindung
connect()
anrufen undconnect
senden ! Ich denke, der Stream ist wegen der V14-Änderung verbunden - pg-Client
connect
Ereignis abgefangen und Rückruf ausgeführt!requestSsl()
oderstartup()
ausgeführt wird - Eine der Methoden get run und
stream.write
wird aufgerufen (requestSsl() , start() ) - Stream-Fehler (nicht abgefangen)
- Versprechen in folge postgres adapter! Immer noch ungelöst!
- Ereignisschleife leer => Nodejs => Beenden
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
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