BEMÆRKNING
TLDS! (SKIMME FOR LANG)! Svaret er langt og rigt! Du kan skimme! Det er godt formateret!
Hvis du har meget travlt !Du kan markere Godkend afsnit, Sequelize-typescript (ikke sequelize) afsnit, Sequelize-typescript afsnit.
Og bedre, du kan gå direkte til HELVEDE afsnit! Lær nodejs v14 HELL at kende ! (Gå direkte til slutningen! Nå lidt ovenfor).
Tjek også FIX (Postgres v14 HELL)
Jeg startede, og før jeg vidste, skrev jeg for meget!
SUPER GUIDE
Grundlæggende skal efterfølger ikke bare hænge! Men smid en fejl!
Ser på kodekilde
Ved at se på sync
kode here
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;
}
Man kan nemt se ophængningsmulighederne!
Logføring
For at debugge sådanne uregelmæssigheder først og fremmest er det vigtigt at have god logning !
Og du kan tjekke, hvordan du tilføjer logning her! Selvom efterfølger normalt har logningen af forespørgslen aktiveret som standard!
https://sequelize.org/master/manual/getting-started.html #logning
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
});
Tjek godkendelsen
Hvis ikke logning sker! Det kan betyde, at efterfølgeren ikke gjorde noget og bare hænger i starten! For at teste godkendelse, og om forbindelsen virker!
Du kan teste med godkend :
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);
}
Hvis du ikke får nogen logning! Og Vil autentificere
udskrevet bare ok! Så hænger processen på godkend . Hvilket tyder på et problem med godkendelse!
Tjek dine legitimationsoplysninger
Sørg for, at du ikke har lavet nogen fejl!
Tjek forbindelsen fra psql eller en anden ekstern klient
- Hvis det ikke virker! Det tyder på et problem med postgres server! Eller en eller anden konfiguration!
- Hvis det virker! Så er problemet i nodejs! Og dit program!
GLEM IKKE AT INSTALLERE POSTGRES-DRIVEREN (eller din db-driver)
I henhold til dokumentet:https://sequelize.org/master/manual/ get-started.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
En af kommandoerne! Sørg for, at du ikke har glemt det!
Forstå, hvad der sker, og fejlfinding bedre! (logning af kodekilde)
Den bedste måde at fejlfinde på! Og afgør virkelig, hvor problemet opstår! Er ved at tilføje logfiler til kildekoden sig selv! En hurtig måde for mig er at gøre det direkte på node_modules
. Jeg åbnede git på sequelize repo! Foretog en søgning! Bestemte stedet for synkronisering
, godkend
, forespørgsel
! Alle findes i sequelize.js
! du kan tjekke her73> ! Man kan CTRL + F for at komme til metoderne > authenticate(
[tilføj (
]. Alligevel! Du kan gøre det samme i node_modules
! Og begynd at tilføje logfiler! Du ved, i hvilken del problemet opstår! Hvilket hjælper dig med at fejlfinde problemet!
Den anden måde er at gaffel ! Og brug din gaffel! Og bare arbejde bedre!
Men mmm! node_modules er en hurtig måde ! Du kan tage en kopi ! også! For at sikre, at du ikke mister dine logfiler! Når du har opdateret! I slutningen ren ved blot at fjerne hele modulet! Og geninstaller! Eller vend bare oprettelsen af logfiler (fortryd)! Jeg synes, det er en interessant måde at fejlfinde på!
Men det burde give en fejl
Normalt skal det! Ved at se kodekilden kan du vide bedre! Normalt skal der kastes en fejl! Men hvis en proces bliver hængt! Og ingen fejl bliver kastet! Så kan du forvente et resultat som dette! Her kan der mangle chaufføren! Sørg også for console.log
. Virker okay! Og det sidste! MMM kan være det er et problem med nodejs
sig selv (se sidste afsnit).
Jeg bruger sequelize-typescript (ikke sequelize)
Meget vigtigt at vide! Sequelize-typescript er bare en sequelize-indpakning! Det var der for at tilføje typescript support! Det giver dekoratører og nogle funktioner! Også fra sequelize v5! Typescript understøttes direkte i efterfølger! Se herhttps://sequelize.org/master/manual/typescript.html sequelize-typescript i den seneste version! Vendte til også at bruge de indfødte deklarationstyper af efterfølger!
Som sequelize-typecript wrap sequelize! Sørg for at bekræfte efterfølgerdokumentationen!
Bemærk også, at der er nogle mennesker, der råber :Brug ikke dekoratører! mmmm! mmm! Og endnu en mmmm!https://stackoverflow.com/a/60369189/7668448
Sequelize-typescript
Hvis du bruger sequelize-typescript, skal du sørge for versionen af sequelize-typescript
og følge
gør match ! I henhold til dokumentet V5
af fortsættelse! Jeg gætter på V6
også burde gøre! Og v1
for sequelize-typescript!
npm install [email protected] [email protected]
Og glem ikke de nødvendige typescript-pakker i henhold til dokumentet!
https:/ /www.npmjs.com/package/sequelize-typescript
(Du kan kontrollere og verificere alle disse oplysninger i selve dokumentet)
Hvorfor bruge sequelize-typescript?
Som allerede nævnt! Sequelize har indbygget understøttelse af typescript fra V5
. Som beskrevet her
. Så hvorfor bruge en indpakning over det! Det bruger også dekoratører! (Jeg er ikke imod dekoratører! Nogle er! Som pr. her
)
Spørg dig selv hvorfor? Er der noget at sequelize-typescript! Et vigtigt plus i forhold til den oprindelige måde? Hvis der er klare ting! Venligst nævne dem i kommentarerne! Og jeg vil opdatere! Dette afsnit!
Og hvis ikke! Native kan være meget bedre! En afhængighed eller mange i mindre!
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/**/*"
]
}
Det er de to vigtige ting at tilføje.
"experimentalDecorators": true,
"esModuleInterop": true
Men det burde ikke være dit problem! Ellers vil projektet give kompileringsfejl!
HELVEDE
Node js VERSION (V14 HELVEDE)
Og ja! Det kan være årsagen! Du har måske allerede plejet at have det til at virke ok før! Og så i en ny computer eller et nyt miljø! Det virker ikke mere !
Nodeversion kan være problemet ! Node v15 og Node v14 ! Det er et kendt problem! Jeg stødte selv en gang på knex.js
og postgres
(knex.js er en forespørgselsbygger)! Så du kan se, at det hænger sammen! I min historie fungerede koden okay på min bærbare computer og gamle vps, som vi implementerede i! Men så installerede jeg på en Windows rdp! Og mmm! Bom! Så trak jeg mit hår i noget tid! Jeg reflekterede og tjekkede! Der var ingen forandring! Og så kom jeg til hej! Jeg har kun opdateret nodejs! Og senere fandt jeg ud af, at andre mennesker stødte på det samme! Kort sagt! Det hele startede på nodejs v14
(Jeg kalder dette v14 HELVEDE )! Du kan tjekke mit svar om det her
Og tilsyneladende er det samme problem altid med nodejs v15
!
I spørgsmålet om denne tråd! Det bekræftede vi! På mit skrivebord fungerede alt godt! Nodejs v12
! Og med min vens computer! Det gjorde den ikke! nodejs v14
og nodejs v15
. Så ville jeg bekræfte! Jeg installerede nodejs v15
Og caboom! BINGO! Henrettelsen stopper bare uventet! Ingen logning! Ingen fejl! I v12
! Alt fungerede korrekt! Jeg havde fejl i starten, så rettede jeg dem! Og serveren var oppe og køre! Og opfølger forbundet til DB!
Her er henrettelserne
V12 og v13
Jeg viser v13! Det samme sker med 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 :)
Fedt fungerer ikke noget problem
V14 og v15 udførelse
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
Og ops! Programmet afsluttes uventet uden fejloutput!
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
Og oppsii igen! Programmet afsluttes uventet uden fejloutput!
Der er heller ingen forskel mellem v14
og v15
! Det er V14 HELVEDE
.
Kort sagt
V14 HELVEDE er en kendt og meget sandsynlig årsag! Der er et problem med pg
modul tror jeg! Noget er ændret på v14
og forårsagede dette problem!
Kort sagt! Hvis intet giver mening! Og hvis din samme kode virkede før! Første ting at gøre! Er at tjekke med nodejs v13
eller v12
! Det kan redde dig fra sindssyge! Hvem ville sige, at versionen af nodejs og en ny vil skabe et sådant problem!
Hvad er dette problem! Hvad er V14 HELL i nodejs?
Hvis du ligesom mig kan lide at kende detaljerne, og hvad der skete!?
Med node V14! Nogle brydende ændringer skete på api'en! Også mange ting blev ændret! Inklusive Openssl version!
Til postgres! Og pg
modul! Problemet var som beskrevet i denne kommentar
ifølge denne tråd
:
Og ifølge denne PR !
Du kan se ændringerne i dette diff.
Kort sagt som sagt! Adfærden for onReadySate
ændret for net.Socket
!Og den implementerede løsning var ikke at bruge onReadyState
overhovedet!
Og som pr. dette
I den ældre version blev forbindelsen kun kaldt, hvis stikket er lukket
stat! readyState
brug er elimineret!
Du kan forstå! Afhængig af implementeringen! Mange ting kan eller ej blive påvirket af disse kerneændringer!
Relevante nodeændringer
Og fordi jeg ville se, hvor forandringen sker! Her går du og kan tjekke
https://github.com/nodejs/node/pull/32272
Man kan også tjekke loggen over ændringer:
https://github.com/nodejs/node/blob /master/doc/changelogs/CHANGELOG_V14.md
RET (Postgres v14 HELL)
Som i mit svar her .
Opgrader pg
driver til >=8.0.3
! Du kan blot opgradere til nyeste!
npm install [email protected] --save
Og du kan tjekke for vores pågældende problem
Gammel version på v7
Opdaterer til v8
Kører igen med node v15
Taraaaaa! Og det fungerede fantastisk!
Og hvis du ikke bruger postgres
! Og problemet var v14 HELL
! Det betyder, at du testede med v13
. Og det virkede! Prøv derefter at opgradere din db-driver til nyeste!
Hvorfor node v14 + exit og ingen logningsfejl
Også for at nævne de brydende ændringer! Lavet pg
få processen til at afslutte ved connect() call
. Og det var det, der fik den til at gå ud! Og logning var at se! Mere detaljeret for dette! Sådan skete det her! Sequelize har postgres dialekt implementering! Som bruger pg! Og pg klient! skabe en forbindelse! Forbindelsen har en connect
begivenhed! Når den forbinder, udsender den det! Og fordi node v14 ændrer adfærden til at starte med åben! Streamforbindelsen er sprunget over! Og streamen tages som tilsluttet! Hvor er det ikke! Og connect
begivenhed udsendes direkte! Når det sker! Klienten vil enten kalde requestSsl()
eller startup()
metoden for forbindelsesobjektet! Og begge kalder this._stream.write
. fordi streamen ikke er tilsluttet! Der sker en fejl! Denne fejl er ikke fange! Så løftet i fortsættelse driver! Vil forblive uafklaret! Og så bliver begivenhedsløkken tom! Nodejs som standard-adfærd skal bare afsluttes!
Du kan se trinene gennem kodelinjerne:
- Sequelize-manager. ring til pg-klienten for at oprette en forbindelse og løftet
- pg client call connect på et forbindelsesobjekt
- pg connection.js#L56">p>
connect() ring og send
connect
! Tænker, at streamen er forbundet på grund af V14-ændring - pg-klient>tilslut begivenhed fanget og tilbagekald køre!
requestSsl()
ellerstartup()
vil blive kørt - En af metoderne bliver kørt og
stream.write
vil blive kaldt (() , startup() > ) - Strømfejl (ikke fanget)
- #Language-manager23js">> i efterfølger postgres adapter! Stadig uløst!
- begivenhedsløkke tom => Nodejs => Afslut
Hvorfor nodejs afslutter (uafklarede løfter)
https://github.com/nodejs/node/issues/22088
Node afsluttes uden fejl og afventer ikke løfte (begivenhedsopkald)
hvad sker der, når et løfte aldrig løser sig?
NVM
Hvis du ikke ved hvad nvm
er! Eller du bruger ikke nvm
. Overvej at bruge det! Da det er et meget interessant værktøj! Nvm er et nodeversionsstyringsværktøj !
Med nvm ændring, fejlretning og test til og med forskellige versioner af nodejs! Er hurtig og en leg! Og så installere nye versioner af nodejs parallelt!
Bemærkning om sequelize.sync()
Brug det ikke til produktion
! Eller overhovedet! (Det meste af ORM! Og forespørgselsbyggeren (knex.js) bruger migreringer).
https://sequelize.org/master/manual/model -basics.html#synchronization-in-production
Fra dokumentet