OBS
TLDS! (FÖR LÄNGE SKUMMA)! Svaret är långt och rikt! Du kan skumma! Den är välformaterad!
Om du har mycket bråttom !Du kan markera Autentisera avsnitt, Sequelize-typescript (inte sequelize) avsnitt, Sequelize-typescript avsnitt.
Och bättre att du kan gå direkt till HELVETE sektion! Lär känna nodejs v14 HELL ! (Gå direkt till slutet! Nåväl en bit ovanför).
Kontrollera för FIX (Postgres v14 HELL)
Jag började och innan jag visste skrev jag för mycket!
SUPERGUIDE
I grund och botten ska uppföljare inte bara hänga! Men kasta ett fel!
Titta på kodkällan
Genom att titta på sync
kod here
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;
}
Man kan lätt se upphängningsmöjligheterna!
Loggning
För att felsöka sådana anomalier först och främst är det viktigt att ha bra loggning !
Och du kan kolla hur du lägger till loggning här! Även om efterföljare normalt sett har loggningen av frågan aktiverad som standard!
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
});
Kontrollera autentiseringen
Om inte loggning sker! Det kan betyda att uppföljaren inte gjorde någonting och bara hänger i början! För att testa autentisering och om anslutningen fungerar!
Du kan testa med autenticate :
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);
}
Om du inte får någon loggning! Och Ska autentisera
tryckt bara ok! Sedan hänger processen på autentisera . Vilket tyder på ett problem med autentisering!
Kontrollera dina referenser
Se till att du inte gjorde några misstag!
Kontrollera anslutningen från psql eller någon annan extern klient
- Om det inte fungerar! Det tyder på ett problem med postgres server! Eller någon konfiguration!
- Om det fungerar! Då ligger problemet i nodejs! Och ditt program!
GLÖM INTE ATT INSTALLERA POSTGRES-DRIVRUTINEN (eller din db-drivrutin)
Enligt dokumentet: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
Ett av kommandona! Se till att du inte glömde det!
Förstå vad som händer och felsöka bättre! (loggning av kodkälla)
Det bästa sättet att felsöka! Och verkligen avgöra var problemet uppstår! Är genom att lägga till loggar i källkoden sig! Ett snabbt sätt för mig är att göra det direkt på node_modules
. Jag öppnade git på sequelize repo! Gjorde en sökning! Bestämde platsen för sync
, autenticera
, fråga
! Alla finns i sequelize.js
! du kan kolla https://sequelize.org/master/manual/typescript.html
sequelize-typescript i den senaste versionen! Vände till att också använda de inhemska deklarationstyperna av uppföljare!
Som sequelize-typecript wrap sequelize! Se till att verifiera uppföljningsdokumentationen!
För att notera att det också finns några människor som ropar :Använd inte dekoratörer! Mmmm! mmm! Och ännu ett mmmm!https://stackoverflow.com/a/60369189/7668448
Sequelize-typescript
Om du använder sequelize-typescript se till att versionen av sequelize-typescript
och uppföljning
gör matcha ! Enligt dokumentet V5
av uppföljare! Jag antar att V6
borde också göra! Och v1
för sequelize-typescript!
npm install [email protected] [email protected]
Och glöm inte de typskript som behövs enligt dokumentet!
https:/ /www.npmjs.com/package/sequelize-typescript
(Du kan kontrollera och verifiera all denna information i själva dokumentet)
Varför ska man använda sequelize-typescript?
Som redan nämnts! Sequelize har inbyggt stöd för typskript från V5
. Enligt här
. Så varför använda ett omslag ovanför det! Som använder dekoratörer också! (Jag är inte emot dekoratörer! Vissa är det! Enligt här
)
Fråga dig själv varför? Finns det något att sequelize-typscript! Ett viktigt plus att jämföra med det inhemska sättet? Om det är tydliga saker! Vänligen nämn dem i kommentarerna! Och jag ska uppdatera! Detta avsnitt!
Varom icke! Native kan vara mycket bättre! Ett beroende eller många på mindre!
Projektkonfiguration
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/**/*"
]
}
Det är två viktiga saker att lägga till.
"experimentalDecorators": true,
"esModuleInterop": true
Men det borde inte vara ditt problem! Annars kommer projektet att skapa kompileringsfel!
HELVETE
Node js VERSION (V14 HELVETE)
Och ja! Det kan vara orsaken! Du kanske redan brukade ha det fungerat bra förut! Och sedan i en ny dator eller miljö! Det fungerar inte längre !
Nodversionen kan vara problemet ! Nod v15 och Node v14 ! Det är ett känt problem! Jag har själv stött på en gång med knex.js
och postgres
(knex.js är en frågebyggare)! Så du kan se att det hänger ihop! I min historia fungerade koden bra på min bärbara dator och gamla vps som vi distribuerade i! Men sedan distribuerade jag på en Windows rdp! Och mmm! bom! Sen drog jag mig i håret ett tag! Jag reflekterade och kollade! Det var ingen förändring! Och så kom jag till hej! Jag uppdaterade bara nodejs! Och senare upptäckte jag att andra människor stött på samma sak! Kortfattat! Det hela började på nodejs v14
(jag kallar detta v14 HELVETE )! Du kan kolla mitt svar om det här
Och tydligen finns samma problem alltid med nodejs v15
!
I frågan om denna tråd! Det har vi bekräftat! På mitt skrivbord fungerade allt bra! Nodejs v12
! Och med min kompis dator! Det gjorde det inte! nodejs v14
och nodejs v15
. Då ville jag bekräfta! Jag installerade nodejs v15
Och caboom! BINGO! Avrättningen upphör bara oväntat! Ingen loggning! Inget fel! I v12
! Allt fungerade korrekt! Jag hade fel först och sedan rättade jag till dem! Och servern var igång! Och uppföljare kopplad till DB!
Här avrättningarna
V12 och v13
Jag visar v13! Samma sak händer med 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 :)
Coolt fungerar inga problem
V14 och v15 exekvering
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
Och ops! Programmet avslutas oväntat utan felutmatning!
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
Och oppsii igen! Programmet avslutas oväntat utan felutmatning!
Det finns ingen skillnad heller mellan v14
och v15
! Det är V14 HELVETE
.
Kort sagt
V14 HELVETE är en känd och mycket trolig orsak! Det finns ett problem med pg
modul antar jag! Något ändrades på v14
och orsakade detta problem!
Kort sagt! Om inget är vettigt! Och om din samma kod fungerade tidigare! Första sak att göra! Är att kolla med nodejs v13
eller v12
! Det kan rädda dig från galenskap! Vem skulle säga att versionen av nodejs och en ny kommer att skapa ett sådant problem!
Vad är det här problemet! Vad är V14 HELL i nodejs?
Om du gillar mig vill du veta detaljerna och vad som hände!?
Med nod V14! Några brytande förändringar hände på api! Många saker ändrades också! Inklusive Openssl-version!
För postgres! Och pg
modul! Problemet var som beskrivs i den här kommentaren
enligt denna tråd
:
Och enligt denna PR !
Du kan se ändringarna i denna skillnad
Kort sagt såsom nämnts! Beteendet för onReadySate
ändrat för net.Socket
!Och den implementerade lösningen var att inte använda onReadyState
alls!
Och enligt detta
I den äldre versionen anropades anslutningen endast om uttaget är på closed
stat! readyState
användning elimineras!
Du kan förstå! Beroende på genomförandet! Många saker kan eller inte påverkas av dessa kärnförändringar!
Relevanta nodändringar
Och för att jag ville se var förändringen skedde! Här går du och kan kolla
https://github.com/nodejs/node/pull/32272
Man kan också kontrollera loggen över ändringar:
https://github.com/nodejs/node/blob /master/doc/changelogs/CHANGELOG_V14.md
FIXA (Postgres v14 HELL)
Enligt mitt svar här .
Uppgradera pg
drivrutin till >=8.0.3
! Du kan helt enkelt uppgradera till senaste!
npm install [email protected] --save
Och du kan kontrollera vårt problem i fråga
Gammal version vid v7
Uppdaterar till v8
Körs igen med nod v15
Taraaaaa! Och det fungerade fantastiskt!
Och om du inte använder postgres
! Och problemet var v14 HELL
! Det betyder att du testade med v13
. Och det fungerade! Försök sedan att uppgradera din db-drivrutin till senaste!
Varför nod v14 + exit och inget loggningsfel
För att också nämna de brytande förändringarna! Gjorde pg
gör processen avsluta vid connect() call
. Och det var det som fick den att gå ut! Och loggning var att se! Mer detaljerat för detta! Så här gick det till! Uppföljare har postgres dialekt implementering! Som använder sid! Och pg klient! skapa en koppling! Anslutningen har en connect
händelse! När den ansluter avger den det! Och eftersom nod v14 ändrar beteendet till att börja med öppen! Streamanslutningen hoppas över! Och strömmen tas som ansluten! Där det inte är! Och connect
evenemanget sänds direkt! När det händer! Klienten anropar antingen requestSsl()
eller startup()
metod för anslutningsobjektet! Och båda kommer att anropa this._stream.write
. eftersom streamen inte är ansluten! Ett fel inträffade! Detta fel är inte fångst! Då löftet i uppföljare förare! Kommer förbli olöst! Och då blir evenemangsslingan tom! Nodejs som standardbeteende avslutar bara!
Du kan se stegen genom kodraderna:
- Sequelize p ring pg-klienten för att skapa en anslutning och löftet
- pg klientanrop på ett anslutningsobjekt
- pg>connect() ring och skicka
connect
! Tror att strömmen är ansluten på grund av V14-ändring - pg-klient>anslut händelse fångad och återuppringning körs!
requestSsl()
ellerstartup()
kommer att köras - En av metoderna får köra och
stream.write
kommer att anropas (() , startup() > ) - Strömfel (inte fångat)
- > i uppföljaren postgres adapter! Fortfarande olöst!
- event loop tom => Nodejs => Avsluta
Varför nodejs avslutas (olösta löften)
https://github.com/nodejs/node/issues/22088
Noden avslutas utan fel och väntar inte på löfte (återuppringning av händelse)
vad händer när ett löfte aldrig löser sig?
NVM
Om du inte vet vad nvm
är! Eller så använder du inte nvm
. Överväg att använda den! Eftersom det är ett mycket intressant verktyg! Nvm är ett verktyg för nodversionshantering !
Med nvm-ändring, felsökning och testning till och med olika versioner av nodejs! Är snabb och en bris! Och så installera nya versioner av nodejs parallellt!
Anmärkning om sequelize.sync()
Använd den inte för produktion
! Eller överhuvudtaget! (Det mesta av ORM! Och frågebyggaren (knex.js) använder migrering).
https://sequelize.org/master/manual/model -basics.html#synchronization-in-production
Från dokumentet