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
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:
- zavolejte klienta pg k vytvoření spojení a příslib
- připojit klienta na objektu připojení
- p>
connect() zavolat a odeslat
připojit
! Myslíme si, že stream je propojený kvůli změně V14 - >připojit událost zachycena a zpětné volání spuštěno!
requestSsl()
nebostartup()
bude spuštěn - Jedna z metod get run a
stream.write
se bude nazývat ( , > ) - Chyba přenosu (nezachyceno)
- > v sequelize postgres adaptéru! Stále nevyřešeno!
- prázdná smyčka událostí => Nodejs => Konec
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
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