sql >> データベース >  >> RDS >> PostgreSQL

typescriptからpostgresへの接続がハングする

    注意

    TLDS! (あまりにも長い間スキム)!答えは長くて豊かです!あなたはスキミングすることができます!よくフォーマットされています!

    急いでいる場合認証を確認できます セクション、 Sequelize-typescript(sequelizeではない) セクション、 Sequelize-typescript セクション。

    そして直接行くことができる方が良い 地獄へ セクション! nodejs v14 HELLについて知る ! (最後まで直接行ってください!少し上です)

    FIX(Postgres v14 HELL)も確認してください

    私は始めました、そして、私が自分自身が書きすぎていることに気付く前に!

    スーパーガイド

    基本的に、続編はただハングするべきではありません!しかし、エラーをスローしてください!

    コードソースを見る

    syncを見ることによって コードこちら

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

    ぶら下がっている可能性を簡単に見ることができます!

    ロギング

    このような異常を最初にデバッグするには、適切なログを用意することが重要です。 !

    そして、ここでログを追加する方法を確認できます!通常は続編ですが、デフォルトでクエリのログがアクティブになっています!

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

    認証を確認する

    ロギングが発生しない場合!それは、続編が何もせず、最初にぶら下がっているだけであることを意味するかもしれません!認証をテストし、接続が機能しているかどうかをテストするには!

    認証でテストできます :

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

    ログが表示されない場合!そして認証する 印刷は大丈夫です!その後、プロセスは認証でハングします 。これは認証の問題を示唆しています!

    資格情報を確認する

    間違いを犯していないことを確認してください!

    psqlまたはその他の外部クライアントからの接続を確認します

    • うまくいかない場合は! postgresサーバーに問題があることを示唆しています!またはいくつかの設定!
    • それが機能する場合!次に、問題はnodejsにあります!そしてあなたのプログラム!

    POSTGRESドライバー(またはデータベースドライバー)のインストールを忘れないでください

    ドキュメントによると: 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
    

    コマンドの1つ!それを忘れていないことを確認してください!

    何が起こっているのかを理解し、デバッグを改善します。 (コードソースログ)

    デバッグするための最良の方法!そして、問題が発生している場所を実際に特定してください。 ソースコードにログを追加することによるものです 自体! 迅速な方法 私にとっては、直接 node_modulesでそれを行うことです 。続編リポジトリでgitを開きました!検索しました! syncの場所を決定しました 、認証 query !すべてsequelize.jsにあります こちら で確認できます。 ! Ctrl + Fキーを押して、メソッド> authenticate( [を追加 ]。ともかく! node_modulesでも同じことができます !そして、ログの追加を開始してください!問題が発生している部分がわかります。これは問題のデバッグに役立ちます!

    もう1つの方法は、フォークすることです。 !そして、あなたのフォークを使ってください!そして、うまく機能します!

    でもうーん! node_modulesは高速な方法ですコピーを取ることができます !それも!ログを失わないようにするためです。更新したら!最後にクリーン モジュール全体を削除するだけです!そして再インストールしてください!または、ログの作成を元に戻す(元に戻す)だけです!デバッグには面白い方法だと思います!

    ただし、エラーが発生するはずです

    通常はそうすべきです!コードソースを見ることで、あなたはよりよく知ることができます!通常、エラーがスローされます!しかし、プロセスがハングした場合!そして、エラーはスローされません!そうすれば、このような結果が期待できます!ここでは、ドライバーが欠落している可能性があります。また、 console.logを確認してください 。大丈夫です!そして最後に! MMMは、 nodejsの問題である可能性があります それ自体(最後のセクションを参照)。

    sequelize-typescriptを使用しています(sequelizeではありません)

    知っておくことが非常に重要です! Sequelize-typescriptは単なる続編ラッパーです!それはtypescriptサポートを追加するためにありました!デコレータといくつかの機能を提供します!また、v5の続編から! Typescriptはsequelizeで直接サポートされています!こちらをご覧ください https://sequelize.org/master/manual/typescript.html sequelize-最新バージョンのtypescript! sequelizeのネイティブ宣言タイプも使用するようになりました!

    続編として-typecriptwrapsequelize!必ず続編のドキュメントを確認してください!

    また、叫ぶ人もいます。 :デコレータは使用しないでください。んー!うーん!そしてもう1つmmmm! https://stackoverflow.com/a/60369189/7668448

    Sequelize-typescript

    sequelize-typescriptを使用している場合は、 sequelize-typescriptのバージョンを確認してください。 およびsequelize 一致を実行します !そこにあるドキュメントV5 続編の! V6だと思います やるべきです!そしてv1 sequelize-typescript用!

    npm install [email protected] [email protected]
    

    そして、そこにあるドキュメントに従って、typescriptに必要なパッケージを忘れないでください!
    https:/ /www.npmjs.com/package/sequelize-typescript

    (ドキュメント自体でこれらすべての情報を確認および確認できます)

    sequelize-typescriptを使用する理由

    すでに述べたように! Sequelizeは、 V5以降のtypescriptをネイティブでサポートしています。 。 こちら による 。では、なぜその上にラッパーを使用するのですか?デコレータも使用しています! (私はデコレータに反対していません!一部は反対です!ここ によると )

    理由を自問してみてください。続編にするものはありますか-typescript!ネイティブの方法と比較して重要なプラス?明確なことがあれば!コメントでそれらに言及してください!そして更新します!このセクション!

    そうでなければ!ネイティブははるかに優れている可能性があります!依存関係またはそれ以下の多く!

    プロジェクト構成

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

    これらは追加する2つの重要なものです。

    "experimentalDecorators": true,
    "esModuleInterop": true
    

    しかし、それはあなたの問題ではないはずです!そうしないと、プロジェクトはコンパイルエラーをスローします!

    地獄

    Node jsバージョン(V14 HELL)

    そして、そうです!それが原因かもしれません!あなたはすでにそれを正しく機能させるために使用したかもしれません!そして、新しいコンピューターや環境で! もう機能していません

    ノードのバージョンが問題になる可能性がありますノードv15 およびノードv14 !これは既知の問題です。私自身、 knex.jsに一度遭遇しました およびpostgres (knex.jsはクエリビルダーです)!だからあなたはそれが関連しているのを見ることができます!私の話では、コードは私のラップトップと私たちが展開した古いvpsで問題なく機能していました!しかし、それから私はWindows rdpにデプロイしました!そしてうーん!ブーム!それからしばらく髪を引っ張った!振り返ってチェックしました!変化はありませんでした!そして、私はちょっと来ました! nodejsのみを更新しました!そして後で私は他の人が同じことに遭遇したことに気づきました!要するに!それはすべてnodejsv14で始まりました (私はこれを v14 HELLと呼んでいます )! こちら で私の答えを確認できます

    そして、明らかに同じ問題が nodejs v15でも常に存在します !

    このスレッドの質問で!確認しました!私のデスクトップではすべてうまくいきました! Nodejs v12 !そして、私の友達のコンピューターで!そうではありませんでした! nodejs v14 およびnodejsv15 。それから確認したかった! nodejs v15をインストールしました そしてカブーム!ビンゴ!実行が予期せず停止するだけです!ロギングなし!エラーなし! v12の場合 !すべてが正しく機能していました!最初はエラーが発生しましたが、修正しました。そして、サーバーは稼働していました!そして、DBに接続された後継者!

    ここで実行

    V12およびv13

    v13を表示しています!同じことが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 :)
    

    クールな作業で問題ありません

    V14および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  
    

    そして、おっと!プログラムはエラー出力なしで予期せず終了します!

    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  
    

    そしてまたoppsii!プログラムはエラー出力なしで予期せず終了します!

    v14にも違いはありません およびv15 V14 HELLです 。

    要するに

    V14地獄 既知の非常に可能性の高い原因です! pgに問題があります モジュールだと思います! v14で何かが変更されました そしてこの問題を引き起こしました!

    要するに!何も意味がない場合!そして、あなたの同じコードが以前に機能していたなら!最初にすること! nodejs v13で確認することです またはv12 !それはあなたを狂気から救うことができます! nodejsのバージョンと新しいバージョンがそのような問題を引き起こすと誰が言うでしょう!

    この問題は何ですか! nodejsのV14HELLとは何ですか?

    私のように、あなたは詳細と何が起こったのか知りたいのです!?

    ノードV14で! APIでいくつかの重大な変更が発生しました!また、多くのことが変更されました! OpenSSLバージョンを含みます!

    postgresのために!そしてpg モジュール!問題は、このコメント で説明されているとおりでした。 このスレッド ごとに :

    そして、これに従って PR

    この違い で変更を確認できます。

    要するに 述べたように! onReadySateの動作 net.Socket用に変更されました !そして、実装されたソリューションは、 onReadyStateを使用しないことでした。 まったく!

    そしてこれに従って

    この行 を確認してください

    古いバージョンでは、ソケットが closeにある場合にのみ接続が呼び出されていました。 州! readyState 使用がなくなります!

    分かります!実装によって異なります!これらのコアの変更によって、多くのことが影響を受ける場合と影響を受けない場合があります!

    関連するノードの変更

    そして、私は変化がどこで起こるかを見たかったので!さあ、チェックしてみましょう

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

    変更のログも確認できます:

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

    FIX(Postgres v14 HELL)

    私の答えによると、こちら

    pgをアップグレードする > =8.0.3へのドライバー !最新にアップグレードするだけです!

    npm install [email protected] --save
    

    そして、あなたは問題の私たちの問題をチェックすることができます

    v7の古いバージョン

    v8に更新しています

    node v15で再実行

    タラァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァ!そしてそれは素晴らしく機能しました!

    また、 postgresを使用していない場合 !そして問題はv14HELLでした !意味v13でテストしました 。そしてそれはうまくいきました!次に、dbドライバーを最新のものにアップグレードしてみてください!

    ノードv14+が終了し、ログエラーが発生しない理由

    また、重大な変更についても言及します。 pgを作成しました connect()呼び出しでプロセスを終了します 。そしてそれがそれを終了させた理由です!そして、ロギングが見られることになっていました!これについてもっと詳しく!ここでそれがどのように起こったのか! Sequelizeにはpostgres方言の実装があります!どちらがpgを使用しますか?そしてpgクライアント!接続を作成してください!接続にはconnectがあります イベント!接続すると放出します!また、ノードv14は、動作をopenから開始するように変更するためです。ストリーム接続はスキップされます!そして、ストリームは接続されていると見なされます!そうでないところ!そしてconnect イベントは直接発せられます!それが起こったとき!クライアントはrequestSsl()を呼び出します またはstartup() 接続オブジェクトのメソッド!そして、どちらも this._stream.writeを呼び出します 。ストリームが接続されていないためです!エラーが発生します!このエラーはキャッチされません!その後、ドライバーの続編での約束!未解決のままになります!そして、イベントループは空になります! Nodejsのデフォルトの動作は、終了するだけです!

    コード行のステップを確認できます:

    nodejsが終了する理由(未解決の約束)

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

    ノードはエラーなしで終了し、約束を待たない(イベントコールバック)

    Promiseが解決しない場合はどうなりますか?>

    NVM

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

    nvmがわからない場合 は!または、 nvmを使用していません 。それを使用することを検討してください!とても面白いツールなので! Nvmはノードバージョン管理ツールです

    nvmを変更し、デバッグし、異なるバージョンのnodejsでテストします!速くて簡単です!そのため、新しいバージョンのnodejsを並行してインストールします!

    sequelize.sync()に関する注意

    本番には使用しないでください !またはまったく! (ほとんどのORM!およびクエリビルダー(knex.js)は移行を使用します。)

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

    ドキュメントから




    1. SQL自己結合テーブルは重複行を削除します

    2. SQL Server2019の新機能

    3. 線形回帰、MySQLで勾配を見つける

    4. 隣接するポリゴンの検索-postgisクエリ