OPMERKING
TLDS! (TE LANG SKIM)! Het antwoord is lang en rijk! Je kunt skimmen! Het is goed geformatteerd!
Als je veel haast hebt !Je kunt Authenticeren . aanvinken sectie, Squelize-typescript (niet sequelize) sectie, Sequelize-typescript sectie.
En je kunt beter direct gaan naar HEL sectie! Maak kennis met nodejs v14 HELL ! (Ga direct naar het einde! Wel een beetje hierboven).
Vink ook FIX (Postgres v14 HELL)
Ik begon en voordat ik het wist, merkte ik dat ik te veel schreef!
SUPERGIDS
In principe mag sequelize niet zomaar blijven hangen! Maar gooi een fout!
Kijken naar codebron
Door te kijken naar 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;
}
Men kan gemakkelijk de ophangmogelijkheden zien!
Logboekregistratie
Om dergelijke anomalieën te debuggen, is het allereerst belangrijk om goede loggen te hebben !
En u kunt hier controleren hoe u logboekregistratie toevoegt! Hoewel normaal gesproken sequels zijn, is het loggen van de zoekopdracht standaard geactiveerd!
https://sequelize.org/master/manual/getting-started.html #logging
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
});
Controleer de authenticatie
Als het loggen niet gebeurt! Dat kan betekenen dat sequelize niets deed en gewoon aan het begin blijft hangen! Om authenticatie te testen en of de verbinding werkt!
U kunt testen met authenticeren :
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);
}
Als u geen logboekregistratie krijgt! En Gonna authenticate
gedrukt gewoon ok! Dan blijft het proces hangen op authenticeren . Wat wijst op een probleem met authenticatie!
Controleer uw inloggegevens
Zorg ervoor dat je geen fouten hebt gemaakt!
Controleer de connectiviteit van psql of een andere externe client
- Als het niet werkt! Het suggereert een probleem met de postgres-server! Of een configuratie!
- Als het werkt! Dan zit het probleem in nodejs! En jouw programma!
VERGEET NIET DE POSTGRES DRIVER (of uw db-stuurprogramma) te INSTALLEREN
Volgens het document:https://sequelize.org/master/manual/ aan de slag.html#installing
# 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
Een van de opdrachten! Zorg ervoor dat je dat niet bent vergeten!
Begrijpen wat er gebeurt en beter debuggen! (codebronregistratie)
De beste manier om te debuggen! En echt bepalen waar het probleem zich voordoet! Is door logs toe te voegen aan de broncode zelf! Een snelle manier voor mij is om direct dat te doen op node_modules
. Ik opende git op sequelize repo! Heb een zoekopdracht uitgevoerd! Bepaal de plaats van sync
, authenticate
, query
! Ze bevinden zich allemaal in sequelize.js
! je kunt hier
! Men kan CTRL + F gebruiken om bij de methoden te komen > authenticate(
[voeg de (
]. Hoe dan ook! U kunt hetzelfde doen in node_modules
! En begin met het toevoegen van logboeken! U weet in welk deel het probleem zich voordoet! Die u helpen het probleem op te lossen!
De andere manier is om fork ! En gebruik je vork! En gewoon beter werken!
Maar mmm! node_modules is een snelle manier ! U kunt een kopie maken ! te! Om ervoor te zorgen dat u uw logs niet kwijtraakt! Zodra u update! Aan het einde schoon door gewoon de hele module te verwijderen! En opnieuw installeren! Of draai het aanmaken van de logs gewoon om (ongedaan maken)! Ik vind het een interessante manier om te debuggen!
Maar het zou een foutmelding moeten geven
Normaal zou het moeten! Door de codebron te zien, kunt u beter weten! Normaal gesproken moet er een fout worden gegenereerd! Maar als een proces vastloopt! En er wordt geen fout gegooid! Dan mag je een resultaat als dit verwachten! Hier kan de bestuurder ontbreken! Zorg er ook voor dat console.log
. Werkt goed! En het laatste! MMM kan een probleem zijn met nodejs
zelf (zie de laatste sectie).
Ik gebruik sequelize-typescript (niet sequelize)
Heel belangrijk om te weten! Sequelize-typescript is slechts een vervolgomslag! Dat was er om typescript-ondersteuning toe te voegen! Het biedt decorateurs en enkele functies! Ook Van sequelize v5! Typescript wordt direct ondersteund in sequelize! Zie hierhttps://sequelize.org/master/manual/typescript.html sequelize-typescript in de nieuwste versie! Gewend om ook de native declaratietypes van sequelize te gebruiken!
Als sequelize-typecript wrap sequelize! Zorg ervoor dat u de vervolgdocumentatie controleert!
Merk ook op dat sommige mensen schreeuwen :Gebruik geen decorateurs! mmm! mmm! En nog een mmmm!https://stackoverflow.com/a/60369189/7668448
Squelize-typescript
Als je sequelize-typescript gebruikt, zorg er dan voor dat de versie van sequelize-typescript
en sequelize
doe overeenkomen ! Volgens hun document V5
van vervolg! Ik denk V6
ook moet doen! En v1
voor sequelize-typescript!
npm install [email protected] [email protected]
En vergeet niet de typescript benodigde pakketten volgens hun document!
https:/ /www.npmjs.com/package/sequelize-typescript
(U kunt al die informatie in het document zelf controleren en verifiëren)
Waarom sequelize-typescript gebruiken?
Zoals al vermeld! Sequelize heeft native ondersteuning voor typescript vanaf V5
. Volgens hier
. Dus waarom een wikkel erboven gebruiken! Dat gebruik ook decorateurs! (Ik ben niet tegen decorateurs! Sommige zijn dat wel! Volgens hier
)
Vraag jezelf af waarom? Is er iets om te sequeliseren-typescript! Een belangrijk pluspunt in vergelijking met de inheemse manier? Als er duidelijke dingen zijn! Vermeld ze dan in de comments! En ik zal updaten! Deze sectie!
En indien niet! Inheems kan veel beter! Een afhankelijkheid of veel in minder!
Projectconfiguratie
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/**/*"
]
}
Dat zijn de twee belangrijke dingen om toe te voegen.
"experimentalDecorators": true,
"esModuleInterop": true
Maar dat zou jouw probleem niet moeten zijn! Anders geeft het project compileerfouten!
HEL
Node js VERSIE (V14 HELL)
En ja! Dat kan de oorzaak zijn! Misschien had je het al eerder goed werkend! En dan in een nieuwe computer of omgeving! Het werkt niet meer !
Knooppuntversie kan het probleem zijn ! Node v15 en Node v14 ! Dat is een bekend probleem! Ik ben zelf een keer tegengekomen met knex.js
en postgres
(knex.js is een query-builder)! Dus je kunt zien dat het verband houdt! In mijn verhaal werkte de code goed op mijn laptop en oude vps die we hadden ingezet! Maar dan heb ik ingezet op een windows rdp! En mmm! Boom! Toen trok ik een tijdje aan mijn haar! Ik dacht na en controleerde! Er was geen verandering! En toen kwam ik bij hé! Ik heb alleen nodejs bijgewerkt! En later ontdekte ik dat andere mensen hetzelfde tegenkwamen! Kortom! Het begon allemaal op nodejs v14
(ik noem dit v14 HELL )! Je kunt mijn antwoord hierover hier
bekijken
En blijkbaar is hetzelfde probleem er altijd met nodejs v15
!
In de vraag van dit draadje! Dat hebben we bevestigd! Op mijn bureaublad werkte alles goed! Nodejs v12
! En met de computer van mijn vriend! Het deed het niet! nodejs v14
en nodejs v15
. Toen wilde ik bevestigen! Ik heb nodejs v15
geïnstalleerd En caboem! BINGO! De uitvoering stopt gewoon onverwacht! Geen logboekregistratie! Geen fout! In v12
! Alles werkte naar behoren! ik had eerst fouten, daarna heb ik ze gecorrigeerd! En de server was in de lucht! En vervolg op de DB!
Hier de executies
V12 en v13
Ik toon v13! Hetzelfde gebeurt met 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 :)
Cool werken geen probleem
V14 en v15 uitvoering
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
En oeps! Het programma wordt onverwacht afgesloten zonder foutmelding!
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
En weer oppsii! Het programma wordt onverwacht afgesloten zonder foutmelding!
Er is ook geen verschil tussen v14
en v15
! Het is V14 HELL
.
Kortom
De V14 HEL is een bekende en zeer waarschijnlijke oorzaak! Er is een probleem met pg
module denk ik! Er is iets veranderd op v14
en dit probleem veroorzaakt!
Kortom kort! Als niets zin heeft! En als uw dezelfde code eerder werkte! Eerste ding om te doen! Is te controleren met nodejs v13
of v12
! Dat kan je redden van waanzin! Wie zou zeggen dat de versie van nodejs en een nieuwe zo'n probleem zullen veroorzaken!
Wat is dit voor probleem! Wat is V14 HELL in nodejs?
Als je net als ik de details wilt weten en wat er is gebeurd!?
Met knooppunt V14! Er zijn enkele belangrijke wijzigingen doorgevoerd op de api! Ook zijn er veel dingen veranderd! Inclusief Openssl-versie!
Voor postgre! En pg
module! Het probleem was zoals beschreven in deze opmerking
per deze thread
:
En volgens deze PR !
Je kunt de wijzigingen zien in deze verschillen
Kortom zoals genoemd! Het gedrag voor onReadySate
gewijzigd voor net.Socket
!En de geïmplementeerde oplossing was om onReadyState
niet te gebruiken helemaal niet!
En volgens dit
Controleer deze regel
In de oudere versie werd de connect alleen aangeroepen als de socket op closed
staat staat! readyState
gebruik wordt geëlimineerd!
Je kan begrijpen! Afhankelijk van de uitvoering! Veel dingen kunnen wel of niet worden beïnvloed door die kernveranderingen!
Relevante knooppuntwijzigingen
En omdat ik wilde zien waar de verandering zou plaatsvinden! Hier ga je en kun je controleren
https://github.com/nodejs/node/pull/32272
Je kunt ook het logboek met wijzigingen bekijken:
https://github.com/nodejs/node/blob /master/doc/changelogs/CHANGELOG_V14.md
FIX (Postgres v14 HELL)
Volgens mijn antwoord hier .
Upgrade pg
bestuurder naar >=8.0.3
! U kunt eenvoudig upgraden naar de nieuwste!
npm install [email protected] --save
En u kunt controleren op ons probleem in kwestie
Oude versie op v7
Bijwerken naar v8
Opnieuw actief met node v15
Taraaaa! En het werkte geweldig!
En als u postgres
not niet gebruikt ! En het probleem was v14 HELL
! Dit betekent dat je hebt getest met v13
. En het werkte! Probeer dan uw db-stuurprogramma te upgraden naar de nieuwste!
Waarom node v14 + exit en geen logfout
Ook om de brekende veranderingen te noemen! Gemaakt pg
laat het proces eindigen bij connect() call
. En dat maakte het af! En loggen mocht gezien worden!Hiervoor meer in detail! Hier hoe het gebeurde! Sequelize hebben de postgres dialect implementatie! Welke gebruik pg! En pg-klant! maak verbinding! De verbinding heeft een connect
evenement! Wanneer het verbinding maakt, zendt het het uit! En omdat node v14 het gedrag verandert in beginnend met open! De streamverbinding wordt overgeslagen! En de stream wordt als verbonden beschouwd! Waar het niet is! En de connect
evenement wordt direct uitgezonden! Wanneer dat gebeurt! De client zal ofwel requestSsl()
. aanroepen of startup()
methode van het verbindingsobject! En beide bellen this._stream.write
. omdat de stream niet is aangesloten! Er gebeurt een fout! Deze fout is niet te vangen! Dan is de belofte in sequelize driver! Blijft onopgelost! En dan wordt de evenementenlus leeg! Nodejs standaard gedrag gewoon afsluiten!
U kunt de stap door de coderegels zien:
- Se-adapter bel pg client om een verbinding tot stand te brengen en de belofte
- pg client call connect op een verbindingsobject
- pg-verbinding
connect()
bel en verzendconnect
! Denken dat de stream is verbonden vanwege V14-wijziging - pg client
connect
gebeurtenis gepakt en terugbellen uitgevoerd!requestSsl()
ofstartup()
wordt uitgevoerd - Een van de methoden wordt uitgevoerd en
stream.write
wordt aangeroepen (requestSsl() , opstarten() ) - Streamfout (niet opgevangen)
- Belofte> in vervolg postgres adapter! Nog steeds niet opgelost!
- gebeurtenislus leeg => Nodejs => Afsluiten
Waarom nodejs afsluiten (onopgeloste beloften)
https://github.com/nodejs/node/issues/22088
Node wordt zonder fout afgesloten en wacht niet op belofte (terugbellen van evenement)
wat gebeurt er als een belofte nooit wordt opgelost?
NVM
Als u niet weet wat nvm
is! Of u gebruikt nvm
. niet . Overweeg om het te gebruiken! Omdat het een zeer interessant hulpmiddel is! Nvm is een tool voor het beheer van knooppuntversies !
Met nvm veranderen, debuggen en testen naar en met verschillende versies van nodejs! Is snel en een makkie! En dus parallel nieuwe versies van nodejs installeren!
Opmerking over sequelize.sync()
Gebruik het niet voor production
! Of helemaal niet! (De meeste ORM! En de querybuilder (knex.js) gebruiken migraties).
https://sequelize.org/master/manual/model -basics.html#synchronisatie-in-productie
Uit het document