UWAGA
TLDS! (ZBYT DŁUGO SKIMOWAĆ)! Odpowiedź jest długa i bogata! Możesz przeglądać! Jest dobrze sformatowany!
Jeśli się bardzo spieszysz !Możesz sprawdzić Uwierzytelnij sekcja, Sequeliza maszynopis (nie sequeliza) sekcja, Sequelizuj maszynopis sekcja.
I lepiej możesz iść bezpośrednio do PIEKŁA Sekcja! Poznaj nodejs v14 PIEKŁO ! (Przejdź bezpośrednio do końca! Cóż, trochę powyżej).
Sprawdź też NAPRAW (Postgres v14 HELL)
Zacząłem i zanim się zorientowałem, że napisałem za dużo!
SUPER PRZEWODNIK
Zasadniczo sequeliza nie powinna po prostu wisieć! Ale zgłoś błąd!
Szukanie źródła kodu
Patrząc na sync
kod tutaj
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;
}
Można łatwo zobaczyć możliwości zawieszenia!
Logowanie
Aby debugować takie anomalie, przede wszystkim ważne jest dobre logowanie !
A jak dodać logowanie możesz sprawdzić tutaj! Nawet jeśli normalnie sequelie mają domyślnie włączone logowanie zapytania!
https://sequelize.org/master/manual/getting-started.html #logowanie
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
});
Sprawdź uwierzytelnianie
Jeśli nie logowanie się stanie! Może to oznaczać, że sequeliza nic nie zrobiła i po prostu wisi na początku! Aby przetestować uwierzytelnianie i czy połączenie działa!
Możesz testować za pomocą uwierzytelniania :
https://sequelize.org/master/manual/getting -started.html#testowanie-połączenia
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);
}
Jeśli nie otrzymasz logowania! I Gonna authenticate
drukowane po prostu ok! Następnie proces zawiesza się na uwierzytelnianiu . Co sugeruje problem z uwierzytelnianiem!
Sprawdź swoje dane uwierzytelniające
Upewnij się, że nie popełniłeś żadnych błędów!
Sprawdź łączność z psql lub innego zewnętrznego klienta
- Jeśli to nie zadziała! Sugeruje to problem z serwerem postgres! Albo trochę konfiguracji!
- Jeśli to zadziała! W takim razie problem tkwi w nodejs! I Twój program!
NIE ZAPOMNIJ ZAINSTALOWAĆ STEROWNIKA POSTGRES (lub sterownika db)
Zgodnie z dokumentem: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
Jedno z poleceń! Upewnij się, że o tym nie zapomniałeś!
Zrozumienie tego, co się dzieje i lepsze debugowanie! (logowanie źródła kodu)
Najlepszy sposób na debugowanie! I naprawdę określ, gdzie występuje problem! Czy poprzez dodanie dzienników do kodu źródłowego samo! Szybki sposób dla mnie jest zrobić to bezpośrednio na node_modules
. Otworzyłem git na sequelize repo! Przeszukałem! Określono miejsce sync
, authenticate
, query
! Wszystkie znajdują się w sequelize.js
! możesz sprawdzić tu
! Można CTRL + F, aby dostać się do metod > authenticate(
[dodaj (
]. W każdym razie! Możesz zrobić to samo w node_modules
! I zacznij dodawać logi! Będziesz wiedział, w której części dzieje się problem! Które pomogą Ci debugować problem!
Innym sposobem jest rozwidlenie ! I użyj swojego widelca! I po prostu lepiej pracuj!
Ale mmm! node_modules to szybki sposób ! Możesz zrobić kopię ! także! Aby upewnić się, że nie zgubisz swoich dzienników! Po aktualizacji! Na koniec wyczyść po prostu usuwając cały moduł! I zainstaluj ponownie! Lub po prostu odwróć tworzenie dzienników (cofnij)! Uważam, że jest to interesujący sposób na debugowanie!
Ale powinno to spowodować błąd
Normalnie powinno! Widząc źródło kodu, możesz wiedzieć lepiej! Zwykle powinien zostać wyrzucony błąd! Ale jeśli proces się zawiesi! I nie ma błędu! Wtedy możesz spodziewać się takiego wyniku! Tutaj może brakować sterownika! Upewnij się również, że console.log
. Działa dobrze! I ostatnia rzecz! MMM może to problem z nodejs
(patrz ostatnia sekcja).
Używam sequelize-typescript (nie sequelize)
Bardzo ważne, aby wiedzieć! Sequelize-typescript to tylko opakowanie sequelie! To było po to, aby dodać obsługę maszynopisu! Zapewnia dekoratorów i niektóre funkcje! Również z sequelie v5! Maszynopis jest obsługiwany bezpośrednio w sequelizie! Zobacz tutajhttps://sequelize.org/master/manual/typescript.html sequelize-typescript w najnowszej wersji! Odwrócił się, aby używać również natywnych typów deklaracji sekwencjonowania!
Jak sequeliza sequeliza maszynopis okładka sequelie! Pamiętaj, aby zweryfikować dokumentację sequeli!
Należy również zauważyć, że niektórzy ludzie krzyczą :Nie używaj dekoratorów! mmmm! mmm! I jeszcze jeden mmmm!https://stackoverflow.com/a/60369189/7668448
Sekwencja maszynopisu
Jeśli używasz sequelize-typescript, upewnij się, że wersja sequelize-typescript
i sequelize
wykonaj dopasuj ! Zgodnie z dokumentem V5
sequelie! Chyba V6
też powinien zrobić! I v1
dla sequelizy maszynopisu!
npm install [email protected] [email protected]
I nie zapomnij o wymaganych pakietach maszynopisu zgodnie z tamtym dokumentem!
https:// /www.npmjs.com/package/sequelize-typescript
(Możesz sprawdzić i zweryfikować wszystkie te informacje w samym dokumencie)
Dlaczego używać sequelize-typescript?
Jak już wspomniano! Sequelize ma natywną obsługę maszynopisu, zaczynając od V5
. Zgodnie z tutaj
. Po co więc używać opakowania nad nim! Używają też dekoratorów! (Nie mam nic przeciwko dekoratorom! Niektórzy są! Zgodnie z tutaj
)
Zadaj sobie pytanie, dlaczego? Czy jest coś do sekwencjonowania-maszynopis! Ważny plus w porównaniu z rodzimym sposobem ? Jeśli są jasne rzeczy! Wspomnij o nich w komentarzach! I zaktualizuję! Ta sekcja!
A jeśli nie! Native może być o wiele lepszy! Zależność lub wiele w mniej!
Konfiguracja 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 są dwie ważne rzeczy do dodania.
"experimentalDecorators": true,
"esModuleInterop": true
Ale to nie powinno być twoim problemem! W przeciwnym razie projekt wygeneruje błędy kompilacji!
PIEKŁO
WERSJA węzła js (V14 HELL)
I tak! To może być przyczyna! Być może już wcześniej wszystko działało dobrze! A potem w nowym komputerze lub środowisku! To już nie działa !
Wersja węzła może być problemem ! Węzeł v15 i Węzeł v14 ! To znany problem! Sam spotkałem się raz z knex.js
i postgres
(knex.js to narzędzie do tworzenia zapytań)! Więc widać, że jest to powiązane! W mojej historii kod działał dobrze na moim laptopie i starych VPS, w których wdrożyliśmy! Ale potem wdrożone na Windows RDP! I mmm! Bum! Potem przez jakiś czas ciągnęłam włosy! Zastanowiłem się i sprawdziłem! Nie było zmiany! A potem przyszedłem do hej! Zaktualizowałem tylko nodejs! A później odkryłem, że inni ludzie spotkali to samo! W skrócie! Wszystko zaczęło się na nodejs v14
(nazywam to v14 PIEKŁEM )! Możesz sprawdzić moją odpowiedź na ten temat tutaj
I najwyraźniej ten sam problem występuje zawsze z nodejs v15
!
W kwestii tego wątku! Potwierdziliśmy to! Na moim pulpicie wszystko działało dobrze! Nodejs v12
! I z moim przyjacielem komputerem! Nie! nodejs v14
i nodejs v15
. Potem chciałem potwierdzić! Zainstalowałem nodejs v15
I kabina! BINGO! Egzekucja po prostu niespodziewanie się kończy! Brak logowania ! Żaden błąd! W v12
! Wszystko działało poprawnie! Na początku miałem błędy, a potem je poprawiłem! A serwer działał! I kontynuuj połączenie z DB!
Tu egzekucje
V12 i v13
Wyświetlam v13! To samo dzieje się z 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 :)
Fajna praca to żaden problem
Wykonanie V14 i 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
I ups! Program nieoczekiwanie kończy pracę bez wyjścia błędu!
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
I znowu oppsii! Program nieoczekiwanie kończy pracę bez wyjścia błędu!
Nie ma też różnicy między v14
i v15
! To V14 HELL
.
W skrócie
PIEKŁO V14 to znana i bardzo prawdopodobna przyczyna! Wystąpił problem z pg
moduł chyba! Coś się zmieniło w v14
i spowodował ten problem!
W skrócie! Jeśli nic nie ma sensu! A jeśli ten sam kod działał wcześniej! Pierwsza rzecz do zrobienia! jest sprawdzenie z nodejs v13
lub v12
! To może uratować cię od szaleństwa! Kto by powiedział, że wersja nodejs i nowa stworzy taki problem!
Co to za problem! Co to jest V14 HELL w nodejs?
Jeśli tak jak ja lubisz znać szczegóły i co się stało!?
Z węzłem V14! W interfejsie API nastąpiły przełomowe zmiany! Zmieniono też wiele rzeczy! Łącznie z wersją Openssl!
Dla postgresów! I pg
moduł! Problem był opisany w tym komentarzu
dla tego wątku
:
I zgodnie z tym PR !
Możesz zobaczyć zmiany w tej różnicy
W skrócie jak wspomniano! Zachowanie dla onReadySate
zmieniono dla net.Socket
!I zaimplementowanym rozwiązaniem było nie używanie onReadyState
w ogóle!
I zgodnie z tym
Sprawdź ten wiersz
W starszej wersji połączenie było wywoływane tylko wtedy, gdy gniazdo jest closed
państwo! readyState
użycie zostało wyeliminowane!
Możesz zrozumieć! W zależności od realizacji! Te podstawowe zmiany mogą, ale nie muszą mieć wpływu na wiele rzeczy!
Odpowiednie zmiany węzłów
A ponieważ chciałem zobaczyć, gdzie nastąpi zmiana! Proszę bardzo i możesz sprawdzić
https://github.com/nodejs/node/pull/32272
Można również sprawdzić dziennik zmian:
https://github.com/nodejs/node/blob /master/doc/changelogs/CHANGELOG_V14.md
NAPRAW (Postgres v14 PIEKŁO)
Zgodnie z moją odpowiedzią tutaj .
Uaktualnij pg
sterownik do >=8.0.3
! Możesz po prostu uaktualnić do najnowszej!
npm install [email protected] --save
I możesz sprawdzić nasz problem
Stara wersja w v7
Aktualizacja do v8
Uruchom ponownie z node v15
Taraaaaa! I zadziałało to niesamowicie!
A jeśli nie używasz postgres
! Problem polegał na tym, że v14 HELL
! Znaczenie Testowałeś z v13
. I zadziałało! Następnie spróbuj zaktualizować sterownik db do najnowszej wersji!
Dlaczego węzeł v14 + wyjście i brak błędu logowania
Wspomnę również o przełomowych zmianach! Wykonano pg
spraw, aby proces zakończył się po wywołaniu connect() call
. I to sprawiło, że wyszedł! A logowanie było widoczne! Więcej szczegółów na ten temat! Oto jak to się stało! Sequelize ma implementację dialektu postgres! Które używają pg! I klient PG! nawiąż połączenie! Połączenie ma connect
wydarzenie! Kiedy się połączy, wyemituje to! A ponieważ węzeł v14 zmienia zachowanie na zaczynanie od otwartego! Połączenie strumieniowe jest pomijane! A strumień jest traktowany jako połączony! Gdzie go nie ma! I connect
zdarzenie jest emitowane bezpośrednio! Kiedy to się stanie! Klient albo wywoła requestSsl()
lub startup()
metoda obiektu połączenia! I obaj wywołają this._stream.write
. ponieważ strumień nie jest podłączony! Wystąpił błąd! Ten błąd nie jest złapany! Następnie obietnica w sequelizie kierowcy! Pozostanie nierozwiązany! A potem pętla zdarzeń staje się pusta! Nodejs domyślnie po prostu wychodzi!
Możesz zobaczyć krok przez wiersze kodu:
- zadzwoń do klienta pg, aby utworzyć połączenie i złożyć obietnicę
- połączenie połączenia klienta pg na obiekcie połączenia
- połączenie pg
connect() call
zadzwoń i wyemitujconnect
! Myślenie, że strumień jest podłączony z powodu zmiany V14 - klient pg
connect
zdarzenie przechwycone i uruchomienie wywołania zwrotnego!requestSsl()
lubstartup()
zostanie uruchomiony - Jedna z metod get run i
stream.write
zostanie wywołany (requestSsl() , startup() ) - Błąd strumienia (nie przechwycony)
- L123> w sequelie adapter postgres! Nadal nierozwiązane!
- Pętla zdarzeń pusta => Nodejs => Wyjście
Dlaczego nodejs się kończy (nierozwiązane obietnice)
https://github.com/nodejs/node/issues/22088
Węzeł kończy pracę bez błędu i nie czeka na obietnicę (wywołanie zwrotne zdarzenia)
co się dzieje, gdy obietnica nigdy się nie rozwiązuje?
NVM
Jeśli nie wiesz, co nvm
jest! Lub nie używasz nvm
. Rozważ użycie tego! Ponieważ to bardzo ciekawe narzędzie! Nvm to narzędzie do zarządzania wersjami węzłów !
Ze zmianą nvm, debugowaniem i testowaniem do iz różnymi wersjami nodejs! Jest szybki i łatwy! A więc równolegle instaluj nowe wersje nodejs!
Uwaga o sequelize.sync()
Nie używaj go do production
! Albo w ogóle! (Większość ORM! I kreator zapytań (knex.js) używa migracji).
https://sequelize.org/master/manual/model -basics.html#synchronizacja-w-produkcji
Z dokumentu