sql >> Databáze >  >> RDS >> PostgreSQL

Připojení k postgresu ze strojopisu přestane fungovat

UPOZORNĚNÍ

TLDS! (TOO DLOUHO DO SKIMU)! Odpověď je dlouhá a bohatá! Můžete loupat! Je dobře naformátovaný!

Pokud hodně spěcháte !Můžete zaškrtnout možnost Authenticate sekce, Sequelize-typescript (ne sequelize) sekce, Sequelize-typescript sekce.

A lépe můžete jít přímo do PEKLA sekce! Seznamte se s nodejs v14 HELL ! (Přejděte přímo na konec! No trochu výše).

Zkontrolujte také OPRAVIT (Postgres v14 HELL)

Začal jsem a než jsem to věděl, zjistil jsem, že jsem toho napsal příliš mnoho!

SUPER PRŮVODCE

Sequelize by v podstatě neměla jen tak viset! Ale vyvolá chybu!

Podívejte se na zdroj kódu

Podívejte se na synchronizovat kód https://sequelize.org/master/manual/getting-started.html #protokolování

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

Zkontrolujte ověření

Pokud ne, proběhne přihlášení! To může znamenat, že sequelize nic nedělalo a jen visí na začátku! Chcete-li otestovat ověření a zda připojení funguje!

Můžete testovat pomocí ověření :

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

Pokud nemáte žádné přihlášení! A Ověřím se vytištěno v pořádku! Poté proces visí na ověření . Což naznačuje problém v ověřování!

Zkontrolujte své přihlašovací údaje

Ujistěte se, že jste neudělali žádné chyby!

Zkontrolujte připojení z psql nebo jiného externího klienta

  • Pokud to nebude fungovat! Naznačuje to problém s postgres serverem! Nebo nějakou konfiguraci!
  • Pokud to funguje! Pak je problém v nodejs! A váš program!

NEZAPOMEŇTE NAINSTALOVAT OVLADAČ POSTGRES (nebo ovladač db)

Podle dokumentu: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

Jeden z příkazů! Ujistěte se, že jste na to nezapomněli!

Lepší pochopení toho, co se děje, a ladění! (protokolování zdroje kódu)

Nejlepší způsob ladění! A skutečně zjistit, kde se problém děje! Je to přidáním protokolů do zdrojového kódu sám! Rychlý způsob pro mě je to přímo to udělat na node_modules . Otevřel jsem git na sequelize repo! Provedl vyhledávání! Určeno místo synchronizace , ověření , dotaz ! Všechny jsou umístěny v sequelize.js ! můžete zkontrolovat ! Můžete CTRL + F, abyste se dostali k metodám > authenticate( [přidejte ( ]. Tak jako tak! Totéž můžete udělat v node_modules ! A začněte přidávat logy! Budete vědět, ve které části se problém odehrává! Které vám pomohou odladit problém!

Druhým způsobem je rozvětvení ! A použijte vidličku! A pracujte lépe!

Ale mmm! node_modules je rychlý způsob ! Můžete si pořídit kopii ! také! Abyste neztratili své protokoly! Jakmile aktualizujete! Na konci vyčistit pouhým vyjmutím celého modulu! A znovu nainstalovat! Nebo prostě zvrátit vytváření protokolů (vrátit zpět)! Považuji to za zajímavý způsob ladění!

Mělo by to ale vyvolat chybu

Normálně by mělo! Když uvidíte zdroj kódu, můžete to vědět lépe! Normálně by měla být vyvolána chyba! Ale pokud se proces zasekne! A nevyvolá se žádná chyba! Pak můžete očekávat takový výsledek! Tady může chybět ovladač! Také se ujistěte, že console.log . Funguje v pořádku! A poslední věc! MMM může být problém s nodejs (viz poslední část).

Používám sequelize-typescript (ne sequelize)

Velmi důležité vědět! Sequelize-typescript je jen obal sequelize! To bylo kvůli přidání podpory strojopisu! Poskytuje dekoratéry a některé funkce! Také od sequelize v5! Strojopis je podporován přímo v sequelize! Viz zdehttps://sequelize.org/master/manual/typescript.html sequelize-typescript v nejnovější verzi! Přešlo také k použití nativních deklaračních typů sequelize!

Jako sequelize-typecript zalomit sequelize! Ujistěte se, že jste ověřili dokumentaci sequelize!

Všimněte si také, že někteří lidé křičí :Nepoužívejte dekoratéry! mmmm! mmm! A další mmmm!https://stackoverflow.com/a/60369189/7668448

Sequelize-typescript

Pokud používáte sequelize-typescript, ujistěte se, že verze sequelize-typescript a sequelizovat shodovat ! Jak je uvedeno v dokumentu V5 pokračování! Myslím, že V6 také by měl udělat! A v1 pro sequelize-typescript!

npm install [email protected] [email protected]

A nezapomeňte na balíčky potřebné pro strojopis podle tohoto dokumentu!
https:/ /www.npmjs.com/package/sequelize-typescript

(Všechny tyto informace můžete zkontrolovat a ověřit v samotném dokumentu)

Proč používat sequelize-typescript ?

Jak již bylo zmíněno! Sequelize mají nativní podporu pro strojový skript počínaje V5 . Podle zde . Proč tedy používat obal nad ním! To také používá dekoratéry! (Nejsem proti dekoratérům! Někteří ano! Jak je uvedeno zde )

Zeptejte se sami sebe proč? Existuje něco, co by se dalo sequelizovat-strojopis! Důležité plus ve srovnání s nativním způsobem? Pokud jsou věci jasné! Zmiňte je prosím v komentářích! A budu aktualizovat! Tato sekce!

A když ne! Nativní může být mnohem lepší! Závislost nebo mnoho za méně!

Konfigurace projektu

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/**/*"
    ]
}

To jsou dvě důležité věci, které je třeba dodat.

"experimentalDecorators": true,
"esModuleInterop": true

Ale to by neměl být váš problém! Jinak projekt vyvolá chyby kompilace!

PEKLO

VERZE Node js (V14 HELL)

A ano! To může být příčina! Možná jste si už dříve zvykli, že to fungovalo dobře! A pak v novém počítači nebo prostředí! Už to nefunguje !

Problémem může být verze uzlu ! Uzel v15 a Uzel v14 ! To je známý problém! Sám jsem se jednou setkal s knex.js a postgres (knex.js je tvůrce dotazů)! Takže vidíte, že to souvisí! V mém příběhu kód fungoval dobře na mém notebooku a starých vps, které jsme nasadili! Ale pak jsem nasadil na Windows rdp! A mmm! Výložník! Pak jsem se nějakou dobu tahal za vlasy! Přemýšlel jsem a zkontroloval! Nedošlo k žádné změně! A pak jsem přišel na hej! Aktualizoval jsem pouze nodejs! A později jsem zjistil, že ostatní lidé se setkali se stejnou věcí! Ve zkratce! Všechno to začalo na nodejs v14 (Říkám tomu v14 PEKLO )! Moji odpověď si můžete ověřit zde

A zdá se, že stejný problém je vždy s nodejs v15 !

V otázce tohoto vlákna! Potvrdili jsme to! Na mém desktopu vše fungovalo dobře! Nodejs v12 ! A s mým kamarádským počítačem! To ne! nodejs v14 a nodejs v15 . Pak jsem to chtěl potvrdit! Nainstaloval jsem nodejs v15 A caboom! BINGO! Poprava se nečekaně zastavila! Žádné protokolování! Žádná chyba! Ve v12 ! Vše fungovalo správně! Nejprve jsem měl chyby, pak jsem je opravil! A server byl v provozu! A sequelize připojené k DB!

Zde jsou popravy

V12 a v13

Zobrazuji v13! Totéž se stane s 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 :)

Bez problémů funguje v pohodě

Provedení V14 a v15

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  

A opps! Program se neočekávaně ukončuje bez chybového výstupu!

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  

A zase oppsii! Program se neočekávaně ukončuje bez chybového výstupu!

Mezi v14 také není žádný rozdíl a v15 ! Je to V14 HELL .

Ve zkratce

V14 HELL je známá a velmi pravděpodobná příčina! Vyskytl se problém s pg modul tuším! Něco se změnilo na v14 a způsobil tento problém!

Stručně řečeno! Pokud nic nedává smysl! A pokud váš stejný kód dříve fungoval! První věc, kterou musíte udělat! Je to zkontrolovat u nodejs v13 nebo v12 ! To vás může zachránit před šílenstvím! Kdo by řekl, že verze nodejs a nová vytvoří takový problém!

Co je to za problém! Co je V14 HELL v nodejs?

Pokud jako já chcete znát podrobnosti a co se stalo!?

S uzlem V14! Na rozhraní API došlo k několika zásadním změnám! Také se mnoho věcí změnilo! Včetně verze Openssl!

Pro postgres! A pg modul! Problém byl popsán v tomto komentáři podle tohoto vlákna :

A podle tohoto PR !

Změny můžete vidět v tomto rozdílu

Ve zkratce jak bylo zmíněno! Chování pro onReadySate změněno pro net.Socket !A implementovaným řešením bylo nepoužívat onReadyState vůbec!

A podle tohoto

Zkontrolujte

Ve starší verzi bylo spojení voláno pouze v případě, že je zásuvka zavřená Stát! readyState použití je vyloučeno!

Můžete to pochopit! V závislosti na provedení! Tyto základní změny mohou nebo nemusí ovlivnit mnoho věcí!

Změny příslušných uzlů

A protože jsem chtěl vidět, kde k té změně došlo! Tady to máte a můžete zkontrolovat

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

Můžete také zkontrolovat protokol změn:

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

OPRAVA (Postgres v14 HELL)

Podle mé odpovědi zde .

Upgradujte pg ovladač na >=8.0.3 ! Můžete jednoduše upgradovat na nejnovější!

npm install [email protected] --save

A můžete zkontrolovat náš problém

Stará verze na v7

Aktualizace na v8

Spusťte znovu s node v15

Taraaaa! A fungovalo to úžasně!

A pokud nepoužíváte postgres ! A problém byl v14 HELL ! To znamená, že jste testovali s v13 . A povedlo se! Pak zkuste upgradovat ovladač db na nejnovější!

Proč uzel v14 + exit a žádná chyba protokolování

Také zmínit zlomové změny! Vytvořeno pg ukončit proces při volání connect() . A to je důvod, proč to skončilo! A těžba dřeva byla k vidění! K tomu podrobněji! Tady, jak se to stalo! Sequelize mít implementaci postgres dialektu! Které používají pg! A pg klient! vytvořit spojení! Připojení má připojit událost! Když se připojí, vydá to! A protože uzel v14 změnil chování na začínající open! Spojení se streamem bylo přeskočeno! A stream je brán jako připojený! Kde není! A připojit událost je vysílána přímo! Když se to stane! Klient buď zavolá requestSsl() nebo startup() způsob připojení objektu! A oba budou volat this._stream.write . protože stream není připojen! Došlo k chybě! Tato chyba není zachycena! Pak slib v sequelize driveru! Zůstane nevyřešeno! A pak se smyčka událostí vyprázdní! Ve výchozím nastavení Nodejs prostě ukončete!

Můžete vidět krok přes řádky kódu:

Proč nodejs končí (nevyřešené sliby)

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

Uzel se ukončí bez chyby a nečeká na slib (zpětné volání události)

co se stane, když se slib nikdy nevyřeší?

NVM

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

Pokud nevíte, co nvm je! Nebo nepoužíváte nvm . Zvažte jeho použití! Protože je to velmi zajímavý nástroj! Nvm je nástroj pro správu verzí uzlu !

S nvm změnou, laděním a testováním a s jinou verzí nodejs! Je rychlý a lehký! A tak paralelně instalovat nové verze nodejs!

Poznámka o sequelize.sync()

Nepoužívejte jej pro výrobu ! Nebo vůbec! (Většina ORM! A tvůrce dotazů (knex.js) používá migraci).

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

Z doc




  1. Připojení k MySQL z Eclipse (CDT)

  2. Jak uniknout klíčovému slovu s hodnotou v mysql při použití příkazu Select

  3. Nelze otevřít JPA EntityManager pro transakci; vnořená výjimka je javax.persistence.PersistenceException

  4. Získejte anonymní výsledek bloku PLSQL