PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Połączenie z postgresem z maszynopisu zawiesza się

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:

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

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zignorować SequelizeUniqueConstraintError w Sequelize?

  2. Jak ustawić automatyczny przyrost klucza podstawowego w PostgreSQL?

  3. psycopg2.ProgrammingError na typie Enum w migracji bazy danych Flask (bazy danych)

  4. Utwórz kolumnę typu podwójna precyzja[] za pomocą liquibase

  5. Jak zainstalować PgBackRest