sql >> Databasteknik >  >> RDS >> PostgreSQL

Anslutning till postgres från typscript hänger

OBS

TLDS! (FÖR LÄNGE SKUMMA)! Svaret är långt och rikt! Du kan skumma! Den är välformaterad!

Om du har mycket bråttom !Du kan markera Autentisera avsnitt, Sequelize-typescript (inte sequelize) avsnitt, Sequelize-typescript avsnitt.

Och bättre att du kan gå direkt till HELVETE sektion! Lär känna nodejs v14 HELL ! (Gå direkt till slutet! Nåväl en bit ovanför).

Kontrollera för FIX (Postgres v14 HELL)

Jag började och innan jag visste skrev jag för mycket!

SUPERGUIDE

I grund och botten ska uppföljare inte bara hänga! Men kasta ett fel!

Titta på kodkällan

Genom att titta på sync kod 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 lätt se upphängningsmöjligheterna!

Loggning

För att felsöka sådana anomalier först och främst är det viktigt att ha bra loggning !

Och du kan kolla hur du lägger till loggning här! Även om efterföljare normalt sett har loggningen av frågan aktiverad som standard!

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

Kontrollera autentiseringen

Om inte loggning sker! Det kan betyda att uppföljaren inte gjorde någonting och bara hänger i början! För att testa autentisering och om anslutningen fungerar!

Du kan testa med autenticate :

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

Om du inte får någon loggning! Och Ska autentisera tryckt bara ok! Sedan hänger processen på autentisera . Vilket tyder på ett problem med autentisering!

Kontrollera dina referenser

Se till att du inte gjorde några misstag!

Kontrollera anslutningen från psql eller någon annan extern klient

  • Om det inte fungerar! Det tyder på ett problem med postgres server! Eller någon konfiguration!
  • Om det fungerar! Då ligger problemet i nodejs! Och ditt program!

GLÖM INTE ATT INSTALLERA POSTGRES-DRIVRUTINEN (eller din db-drivrutin)

Enligt dokumentet:https://sequelize.org/master/manual/ getting-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

Ett av kommandona! Se till att du inte glömde det!

Förstå vad som händer och felsöka bättre! (loggning av kodkälla)

Det bästa sättet att felsöka! Och verkligen avgöra var problemet uppstår! Är genom att lägga till loggar i källkoden sig! Ett snabbt sätt för mig är att göra det direkt på node_modules . Jag öppnade git på sequelize repo! Gjorde en sökning! Bestämde platsen för sync , autenticera , fråga ! Alla finns i sequelize.js ! du kan kolla https://sequelize.org/master/manual/typescript.html sequelize-typescript i den senaste versionen! Vände till att också använda de inhemska deklarationstyperna av uppföljare!

Som sequelize-typecript wrap sequelize! Se till att verifiera uppföljningsdokumentationen!

För att notera att det också finns några människor som ropar :Använd inte dekoratörer! Mmmm! mmm! Och ännu ett mmmm!https://stackoverflow.com/a/60369189/7668448

Sequelize-typescript

Om du använder sequelize-typescript se till att versionen av sequelize-typescript och uppföljning gör matcha ! Enligt dokumentet V5 av uppföljare! Jag antar att V6 borde också göra! Och v1 för sequelize-typescript!

npm install [email protected] [email protected]

Och glöm inte de typskript som behövs enligt dokumentet!
https:/ /www.npmjs.com/package/sequelize-typescript

(Du kan kontrollera och verifiera all denna information i själva dokumentet)

Varför ska man använda sequelize-typescript?

Som redan nämnts! Sequelize har inbyggt stöd för typskript från V5 . Enligt här . Så varför använda ett omslag ovanför det! Som använder dekoratörer också! (Jag är inte emot dekoratörer! Vissa är det! Enligt här )

Fråga dig själv varför? Finns det något att sequelize-typscript! Ett viktigt plus att jämföra med det inhemska sättet? Om det är tydliga saker! Vänligen nämn dem i kommentarerna! Och jag ska uppdatera! Detta avsnitt!

Varom icke! Native kan vara mycket bättre! Ett beroende eller många på 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 är två viktiga saker att lägga till.

"experimentalDecorators": true,
"esModuleInterop": true

Men det borde inte vara ditt problem! Annars kommer projektet att skapa kompileringsfel!

HELVETE

Node js VERSION (V14 HELVETE)

Och ja! Det kan vara orsaken! Du kanske redan brukade ha det fungerat bra förut! Och sedan i en ny dator eller miljö! Det fungerar inte längre !

Nodversionen kan vara problemet ! Nod v15 och Node v14 ! Det är ett känt problem! Jag har själv stött på en gång med knex.js och postgres (knex.js är en frågebyggare)! Så du kan se att det hänger ihop! I min historia fungerade koden bra på min bärbara dator och gamla vps som vi distribuerade i! Men sedan distribuerade jag på en Windows rdp! Och mmm! bom! Sen drog jag mig i håret ett tag! Jag reflekterade och kollade! Det var ingen förändring! Och så kom jag till hej! Jag uppdaterade bara nodejs! Och senare upptäckte jag att andra människor stött på samma sak! Kortfattat! Det hela började på nodejs v14 (jag kallar detta v14 HELVETE )! Du kan kolla mitt svar om det här

Och tydligen finns samma problem alltid med nodejs v15 !

I frågan om denna tråd! Det har vi bekräftat! På mitt skrivbord fungerade allt bra! Nodejs v12 ! Och med min kompis dator! Det gjorde det inte! nodejs v14 och nodejs v15 . Då ville jag bekräfta! Jag installerade nodejs v15 Och caboom! BINGO! Avrättningen upphör bara oväntat! Ingen loggning! Inget fel! I v12 ! Allt fungerade korrekt! Jag hade fel först och sedan rättade jag till dem! Och servern var igång! Och uppföljare kopplad till DB!

Här avrättningarna

V12 och v13

Jag visar v13! Samma sak händer 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 :)

Coolt fungerar inga problem

V14 och v15 exekvering

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  

Och ops! Programmet avslutas oväntat utan felutmatning!

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  

Och oppsii igen! Programmet avslutas oväntat utan felutmatning!

Det finns ingen skillnad heller mellan v14 och v15 ! Det är V14 HELVETE .

Kort sagt

V14 HELVETE är en känd och mycket trolig orsak! Det finns ett problem med pg modul antar jag! Något ändrades på v14 och orsakade detta problem!

Kort sagt! Om inget är vettigt! Och om din samma kod fungerade tidigare! Första sak att göra! Är att kolla med nodejs v13 eller v12 ! Det kan rädda dig från galenskap! Vem skulle säga att versionen av nodejs och en ny kommer att skapa ett sådant problem!

Vad är det här problemet! Vad är V14 HELL i nodejs?

Om du gillar mig vill du veta detaljerna och vad som hände!?

Med nod V14! Några brytande förändringar hände på api! Många saker ändrades också! Inklusive Openssl-version!

För postgres! Och pg modul! Problemet var som beskrivs i den här kommentaren enligt denna tråd :

Och enligt denna PR !

Du kan se ändringarna i denna skillnad

Kort sagt såsom nämnts! Beteendet för onReadySate ändrat för net.Socket !Och den implementerade lösningen var att inte använda onReadyState alls!

Och enligt detta

Kolla

I den äldre versionen anropades anslutningen endast om uttaget är på closed stat! readyState användning elimineras!

Du kan förstå! Beroende på genomförandet! Många saker kan eller inte påverkas av dessa kärnförändringar!

Relevanta nodändringar

Och för att jag ville se var förändringen skedde! Här går du och kan kolla

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

Man kan också kontrollera loggen över ändringar:

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

FIXA (Postgres v14 HELL)

Enligt mitt svar här .

Uppgradera pg drivrutin till >=8.0.3 ! Du kan helt enkelt uppgradera till senaste!

npm install [email protected] --save

Och du kan kontrollera vårt problem i fråga

Gammal version vid v7

Uppdaterar till v8

Körs igen med nod v15

Taraaaaa! Och det fungerade fantastiskt!

Och om du inte använder postgres ! Och problemet var v14 HELL ! Det betyder att du testade med v13 . Och det fungerade! Försök sedan att uppgradera din db-drivrutin till senaste!

Varför nod v14 + exit och inget loggningsfel

För att också nämna de brytande förändringarna! Gjorde pg gör processen avsluta vid connect() call . Och det var det som fick den att gå ut! Och loggning var att se! Mer detaljerat för detta! Så här gick det till! Uppföljare har postgres dialekt implementering! Som använder sid! Och pg klient! skapa en koppling! Anslutningen har en connect händelse! När den ansluter avger den det! Och eftersom nod v14 ändrar beteendet till att börja med öppen! Streamanslutningen hoppas över! Och strömmen tas som ansluten! Där det inte är! Och connect evenemanget sänds direkt! När det händer! Klienten anropar antingen requestSsl() eller startup() metod för anslutningsobjektet! Och båda kommer att anropa this._stream.write . eftersom streamen inte är ansluten! Ett fel inträffade! Detta fel är inte fångst! Då löftet i uppföljare förare! Kommer förbli olöst! Och då blir evenemangsslingan tom! Nodejs som standardbeteende avslutar bara!

Du kan se stegen genom kodraderna:

Varför nodejs avslutas (olösta löften)

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

Noden avslutas utan fel och väntar inte på löfte (återuppringning av händelse)

vad händer när ett löfte aldrig löser sig?

NVM

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

Om du inte vet vad nvm är! Eller så använder du inte nvm . Överväg att använda den! Eftersom det är ett mycket intressant verktyg! Nvm är ett verktyg för nodversionshantering !

Med nvm-ändring, felsökning och testning till och med olika versioner av nodejs! Är snabb och en bris! Och så installera nya versioner av nodejs parallellt!

Anmärkning om sequelize.sync()

Använd den inte för produktion ! Eller överhuvudtaget! (Det mesta av ORM! Och frågebyggaren (knex.js) använder migrering).

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

Från dokumentet




  1. Hur implementerar man lång polling med socket.io?

  2. Ansluter till MySQL-databaser

  3. Hur förbereder man uttalande för uppdateringsfråga?

  4. Prestanda för RegEx vs LIKE i MySql-frågor