PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Koneksi ke postgres dari TypeScript hang

PERHATIAN

TLDS! (TERLALU PANJANG LAKUKAN SKIM)! Jawabannya panjang dan kaya! Anda bisa skim! Ini diformat dengan baik!

Jika Anda sedang terburu-buru !Anda dapat memeriksa Autentikasi bagian, Sequelize-typescript (bukan sekuel) bagian, Sequelize-typescript bagian.

Dan lebih baik Anda bisa langsung pergi ke NERAKA bagian! Kenali nodejs v14 NERAKA ! (Langsung ke akhir! Sedikit di atas).

Periksa juga PERBAIKI (Postgres v14 NERAKA)

Saya mulai dan sebelum mengetahui saya menemukan diri saya menulis terlalu banyak!

PANDUAN SUPER

Pada dasarnya sekuel tidak boleh hanya menggantung! Tapi buat kesalahan!

Melihat sumber kode

Dengan melihat sync kode di sini

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

Seseorang dapat dengan mudah melihat kemungkinan menggantung!

Log

Untuk men-debug anomali seperti itu, pertama-tama, penting untuk memiliki logging . yang baik !

Dan Anda dapat memeriksa cara menambahkan logging di sini! Meskipun sekuel biasanya memiliki logging kueri yang diaktifkan secara default!

https://sequelize.org/master/manual/getting-started.html #log

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

Periksa otentikasi

Jika tidak masuk terjadi! Itu mungkin berarti sekuel tidak apa-apa dan hanya menggantung di awal! Untuk menguji autentikasi dan apakah koneksi berfungsi!

Anda dapat menguji dengan otentikasi :

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

Jika Anda tidak mendapatkan log! Dan Gonna authenticate dicetak ok! Kemudian prosesnya tergantung pada otentikasi . Yang menunjukkan masalah dalam otentikasi!

Periksa kredensial Anda

Pastikan Anda tidak melakukan kesalahan!

Periksa konektivitas dari psql atau klien eksternal lainnya

  • Jika tidak berhasil! Ini menyarankan masalah dengan server postgres! Atau beberapa konfigurasi!
  • Jika berhasil! Maka masalahnya ada di nodejs! Dan program Anda!

JANGAN LUPA INSTAL DRIVER POSTGRES (Atau driver db anda)

Sesuai dokumen:https://sequelize.org/master/manual/ memulai.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

Salah satu perintah! Pastikan Anda tidak melupakannya!

Memahami apa yang terjadi dan men-debug lebih baik! (pencatatan sumber kode)

Cara terbaik untuk men-debug! Dan benar-benar menentukan di mana masalahnya terjadi! Adalah dengan menambahkan log ke kode sumber diri! Cara cepat bagi saya adalah langsung melakukannya di node_modules . Saya membuka git di repo sekuel! Melakukan pencarian! Menentukan tempat sync , authenticate , query ! Semua berada di sequelize.js ! Anda dapat memeriksa di sini ! Seseorang dapat CTRL + F untuk mendapatkan metode > authenticate( [tambahkan ( ]. Bagaimanapun! Anda dapat melakukan hal yang sama di node_modules ! Dan mulai menambahkan log! Anda akan tahu di bagian mana masalahnya terjadi! Yang membantu Anda men-debug masalah!

Cara lainnya adalah dengan fork ! Dan gunakan garpumu! Dan bekerja lebih baik!

Tapi mmm! node_modules adalah cara yang cepat ! Anda dapat mengambil salinan ! juga! Untuk memastikan Anda tidak kehilangan log Anda! Setelah Anda memperbarui! Pada akhirnya bersih dengan hanya menghapus seluruh modul! Dan instal ulang! Atau cukup balikkan pembuatan log (batalkan)! Saya menemukan cara yang menarik untuk debugging!

Tapi seharusnya ada kesalahan

Biasanya harus! Dengan melihat sumber kode Anda bisa tahu lebih baik! Biasanya kesalahan harus dilemparkan! Tetapi jika suatu proses digantung! Dan tidak ada kesalahan yang dilemparkan! Maka Anda dapat mengharapkan hasil seperti ini! Di sini yang bisa menjadi driver hilang! Pastikan juga console.log . Apakah bekerja dengan baik! Dan hal terakhir! MMM mungkin masalah dengan nodejs sendiri (lihat bagian terakhir).

Saya menggunakan sekuel-typescript (bukan sekuel)

Sangat penting untuk diketahui! Sequelize-typescript hanyalah pembungkus sekuel! Itu ada untuk menambahkan dukungan TypeScript! Ini menyediakan dekorator dan beberapa fitur! Juga Dari sekuel v5! TypeScript didukung langsung dalam sekuel! Lihat di sinihttps://sequelize.org/master/manual/typescript.html sekuel-typescript dalam versi terbaru! Beralih untuk menggunakan juga jenis deklarasi asli sekuel!

Sebagai sekuel-typecript bungkus sekuel! Pastikan untuk memverifikasi dokumentasi sekuel!

Perlu diketahui juga ada beberapa orang yang berteriak :Jangan gunakan dekorator! mmm! mmm! Dan satu lagi!https://stackoverflow.com/a/60369189/7668448

Sequelize-typescript

Jika Anda menggunakan sequelize-typescript pastikan versi sequelize-typescript dan sequelize lakukan cocokkan ! Sesuai di sana doc V5 dari sekuel! Saya kira V6 juga harus dilakukan! Dan v1 untuk sekuel-typescript!

npm install [email protected] [email protected]

Dan jangan lupa paket yang dibutuhkan TypeScript sesuai yang ada doc!
https:// /www.npmjs.com/package/sequelize-typescript

(Anda dapat memeriksa dan memverifikasi semua informasi tersebut di dokumen itu sendiri)

Mengapa menggunakan sequelize-typescript ?

Seperti yang sudah disebutkan! Sequelize memiliki dukungan asli untuk TypeScript mulai dari V5 . Sesuai di sini . Jadi mengapa menggunakan pembungkus di atasnya! Itu juga menggunakan dekorator! (Saya tidak menentang dekorator! Beberapa di antaranya! Sesuai di sini )

Tanyakan pada diri sendiri mengapa? Apakah ada sesuatu untuk membuat sekuel-TypeScript! Nilai tambah penting dibandingkan dengan cara asli? Jika ada hal-hal yang jelas! Silakan sebutkan mereka di komentar! Dan saya akan memperbarui! Bagian ini!

Dan jika tidak! Asli bisa jauh lebih baik! Sebuah ketergantungan atau banyak dalam waktu kurang!

Konfigurasi proyek

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

Itu dua hal penting yang harus ditambahkan.

"experimentalDecorators": true,
"esModuleInterop": true

Tapi itu seharusnya tidak menjadi masalah Anda! Jika tidak, proyek akan menimbulkan kesalahan kompilasi!

NERAKA

VERSI Node js (V14 NERAKA)

Dan ya! Itu bisa jadi penyebabnya! Anda mungkin sudah terbiasa bekerja dengan baik sebelumnya! Dan kemudian di komputer atau lingkungan baru! Tidak berfungsi lagi !

Versi simpul bisa menjadi masalah ! Simpul v15 dan Node v14 ! Itu masalah yang diketahui! Saya sendiri pernah bertemu dengan knex.js dan postgres (knex.js adalah pembuat kueri)! Jadi Anda dapat melihat bahwa itu terkait! Dalam cerita saya, kodenya berfungsi dengan baik di laptop saya dan vps lama yang kami gunakan! Tapi kemudian saya ditempatkan di windows rdp! Dan mmm! Ledakan! Kemudian saya menarik rambut saya untuk beberapa waktu! Saya merefleksikan dan memeriksa! Tidak ada perubahan! Dan kemudian saya datang ke hei! Saya hanya memperbarui nodejs! Dan kemudian saya menemukan bahwa orang lain mengalami hal yang sama! Pendeknya! Semuanya dimulai pada nodejs v14 (saya menyebutnya v14 NERAKA )! Anda dapat memeriksa jawaban saya tentang hal itu di sini

Dan ternyata masalah yang sama selalu ada dengan nodejs v15 !

Dalam pertanyaan dari thread ini! Kami mengkonfirmasi itu! Di desktop saya semua bekerja dengan baik! Nodejs v12 ! Dan dengan komputer teman saya! Tidak! nodejs v14 dan nodejs v15 . Kemudian saya ingin mengkonfirmasi! Saya menginstal nodejs v15 Dan gerbong! BINGO! Eksekusi berhenti begitu saja tanpa diduga! Tidak ada pencatatan! Tidak ada kesalahan! Dalam v12 ! Semua bekerja dengan benar! saya memiliki kesalahan pada awalnya kemudian saya memperbaikinya! Dan server sudah aktif dan berjalan! Dan sekuel terhubung ke DB!

Ini eksekusinya

V12 dan v13

Saya menampilkan v13! Hal yang sama terjadi dengan 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 :)

Keren bekerja tidak ada masalah

Eksekusi V14 dan 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  

Dan opps! Program keluar secara tiba-tiba tanpa keluaran kesalahan!

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  

Dan oppsi lagi! Program keluar secara tiba-tiba tanpa keluaran kesalahan!

Tidak ada perbedaan juga antara v14 dan v15 ! Ini V14 HELL .

Singkatnya

V14 NERAKA adalah penyebab yang diketahui dan sangat mungkin! Ada masalah dengan pg modul saya kira! Sesuatu berubah pada v14 dan menyebabkan masalah ini!

Singkatnya! Jika tidak ada yang masuk akal! Dan jika kode Anda yang sama berfungsi sebelumnya! Hal pertama yang harus dilakukan! Apakah untuk memeriksa dengan nodejs v13 atau v12 ! Itu bisa menyelamatkan Anda dari kegilaan! Siapa yang akan mengatakan versi nodejs dan yang baru akan membuat masalah seperti itu!

Masalah apa ini! Apa itu V14 NERAKA di nodejs ?

Jika seperti saya, Anda ingin mengetahui detailnya dan apa yang terjadi!?

Dengan simpul V14! Beberapa perubahan besar terjadi pada api! Juga banyak hal yang berubah! Termasuk versi Openssl!

Untuk postgres! Dan pg modul! Masalahnya seperti yang dijelaskan dalam komentar ini per utas ini :

Dan sesuai PR ini !

Anda dapat melihat perubahannya di perbedaan ini

Singkatnya sebagaimana dimaksud! Perilaku untuk onReadySate diubah untuk net.Socket !Dan solusi yang diterapkan adalah tidak menggunakan onReadyState sama sekali!

Dan sesuai ini

Periksa baris ini

Dalam versi yang lebih lama, koneksi dipanggil hanya jika soket dalam keadaan closed negara! readyState penggunaan dihilangkan!

Anda bisa mengerti! Tergantung implementasinya! Banyak hal yang mungkin terpengaruh atau tidak oleh perubahan inti tersebut!

Perubahan simpul yang relevan

Dan karena saya ingin melihat di mana perubahan itu terjadi! Ini dia dan dapat memeriksa

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

Seseorang dapat memeriksa log perubahan juga:

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

PERBAIKI (Postgres v14 NERAKA)

Sesuai jawaban saya di sini .

Tingkatkan pg driver ke >=8.0.3 ! Anda cukup mengupgrade ke yang terbaru!

npm install [email protected] --save

Dan Anda dapat memeriksa masalah kami yang dimaksud

Versi lama di v7

Memperbarui ke v8

Berjalan lagi dengan node v15

Taraaaa! Dan itu berhasil dengan luar biasa!

Dan jika Anda tidak menggunakan postgres ! Dan masalahnya adalah v14 HELL ! Artinya Anda menguji dengan v13 . Dan itu berhasil! Kemudian coba perbarui driver db Anda ke yang terbaru!

Mengapa simpul v14 + keluar dan tidak ada kesalahan pencatatan

Juga untuk menyebutkan perubahan yang melanggar! Dibuat pg buat proses keluar di connect() call . Dan itulah yang membuatnya keluar! Dan logging harus dilihat! Lebih detail untuk ini! Berikut bagaimana hal itu terjadi! Sekuel memiliki implementasi dialek postgres! Yang menggunakan hal! Dan pg klien! buat koneksi! Koneksi memiliki connect peristiwa! Saat terhubung, pancarkan! Dan karena node v14 mengubah perilaku untuk memulai dengan open! Koneksi aliran dilewati! Dan aliran dianggap terhubung! Dimana tidak! Dan connect acara dipancarkan secara langsung! Ketika itu terjadi! Klien akan memanggil requestSsl() atau startup() metode objek koneksi! Dan keduanya akan memanggil this._stream.write . karena aliran tidak terhubung! Terjadi kesalahan! Kesalahan ini tidak menangkap! Kemudian janji di sekuel driver! Akan tetap tidak terselesaikan! Dan kemudian loop acara menjadi kosong! Nodejs dengan perilaku default baru saja keluar!

Anda dapat melihat langkah melalui baris kode:

Mengapa nodejs keluar (janji yang belum terselesaikan)

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

Node keluar tanpa kesalahan dan tidak menunggu janji (Panggilan balik acara)

apa yang terjadi jika Janji tidak pernah diselesaikan?

NVM

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

Jika Anda tidak tahu apa nvm adalah! Atau Anda tidak menggunakan nvm . Pertimbangkan untuk menggunakannya! Karena ini adalah alat yang sangat menarik! Nvm adalah alat manajemen versi simpul !

Dengan perubahan nvm, debugging, dan pengujian ke dan dengan versi nodejs yang berbeda! Cepat dan mudah! Jadi, instal versi baru nodejs secara paralel!

Catatan tentang sequelize.sync()

Jangan gunakan untuk production ! Atau sama sekali! (Sebagian besar ORM! Dan pembuat kueri (knex.js) menggunakan migrasi).

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

Dari dokumen




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memilih dari pg_catalog.pg_settings menjadi lambat setelah memperbarui ke PostgreSQL 12 (windows)

  2. Mengubah bidang Enum menggunakan Alembic

  3. Kueri asli data pegas tidak mengizinkan operator string jsonb Postgres ada (tanda tanya)

  4. Mengapa kode ini gagal di PostgreSQL dan bagaimana cara memperbaikinya (menyelesaikan masalah)? Apakah ini kelemahan mesin Postgres SQL?

  5. Pertahankan urutan yang berbeda di dalam string_agg