sql >> Database >  >> RDS >> PostgreSQL

Verbinding met postgres vanuit typoscript loopt vast

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:

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

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




  1. PHP - While / Else-fout?

  2. Back-up van Mysql-databases

  3. cx_Oracle.DatabaseError:ORA-12170:TNS:Time-out verbinding opgetreden

  4. Zoek het aantal kolommen in een tabel