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

Forbindelse til postgres fra maskinskrift hænger

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 her ! 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

Tjek

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:

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

https://github.com/nvm-sh/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




  1. MYSQL-tabeloprettelse med standardværdi (udtryk) til en kolonne

  2. MySQL-datavalidering ved indsættelse

  3. Syntaks for row_to_json med sqlalchemy

  4. Optimering af langsom ORDER BY RAND()-forespørgsel